分布式存储概览
分布式存储 vs 传统 SAN
传统 SAN(集中式):
优势:性能高,延迟低,管理成熟
劣势:扩展性有限,单点风险,成本高
分布式存储:
优势:线性扩展,高可用,成本低
劣势:延迟略高,管理复杂
适用场景对比:
传统 SAN → 核心数据库、低延迟应用
分布式存储 → 大数据、对象存储、云平台H3C 分布式存储产品
UniStor X10000(对象存储)
H3C UniStor X10000 规格:
节点类型:
├── 存储节点:12× 16TB HDD(192TB/节点)
└── 高密节点:60× 16TB HDD(960TB/节点)
扩展性:
├── 最小:3 节点
└── 最大:数千节点,EB 级容量
协议支持:
├── S3(Amazon S3 兼容)
├── Swift(OpenStack 兼容)
├── NFS v3/v4
└── HDFS(大数据)
数据保护:
├── 多副本(2-3 副本)
└── 纠删码(EC,节省空间)H3C DSS(软件定义存储)
基于 Ceph 的软件定义存储,可运行在标准 x86 服务器上:
H3C DSS 特点:
- 基于 Ceph 开源项目
- H3C 商业化增强(UI/支持/优化)
- 支持块/文件/对象三种存储形态
- 与 CloudOS/CAS 深度集成Ceph 深度解析
Ceph 架构
Ceph 组件:
RADOS(Reliable Autonomic Distributed Object Store)
└── 底层分布式对象存储,所有上层服务的基础
RBD(RADOS Block Device)
└── 块存储,提供虚拟磁盘
RGW(RADOS Gateway)
└── 对象存储网关,兼容 S3/Swift
CephFS(Ceph File System)
└── 分布式文件系统,兼容 POSIX
守护进程:
MON(Monitor):维护集群状态图(Cluster Map)
MGR(Manager):监控、均衡、REST API
OSD(Object Storage Daemon):存储数据
MDS(Metadata Server):CephFS 元数据数据一致性
Ceph 强一致性保证:
写入流程:
1. 客户端写入主 OSD
2. 主 OSD 并行写入所有副本 OSD
3. 所有副本确认写入成功
4. 主 OSD 返回成功给客户端
保证:
- 所有副本写入成功才返回
- 任意副本读取都能得到最新数据
- 不存在脏读问题纠删码(Erasure Coding)
纠删码比多副本更节省空间,适合冷数据:
纠删码 vs 多副本:
3 副本:
原始数据:1TB
存储占用:3TB
空间利用率:33%
可容忍:1 个 OSD 故障
纠删码 4+2(k=4, m=2):
原始数据:1TB
存储占用:1.5TB(1TB × 6/4)
空间利用率:67%
可容忍:2 个 OSD 故障
纠删码 8+3(k=8, m=3):
原始数据:1TB
存储占用:1.375TB
空间利用率:73%
可容忍:3 个 OSD 故障bash
# 创建纠删码存储池
# 创建纠删码配置
ceph osd erasure-code-profile set ec-4-2 \
k=4 m=2 \
plugin=jerasure \
technique=reed_sol_van
# 创建使用纠删码的存储池
ceph osd pool create cold-data 128 128 erasure ec-4-2
# 查看存储池信息
ceph osd pool ls detail | grep cold-data对象存储使用
S3 API 操作
python
import boto3
from botocore.config import Config
# 连接 H3C 对象存储
s3 = boto3.client(
's3',
endpoint_url='http://rgw.storage.example.com:7480',
aws_access_key_id='your-access-key',
aws_secret_access_key='your-secret-key',
config=Config(
signature_version='s3v4',
retries={'max_attempts': 3}
)
)
# 创建 Bucket
s3.create_bucket(Bucket='my-data-lake')
# 上传大文件(分片上传)
from boto3.s3.transfer import TransferConfig
config = TransferConfig(
multipart_threshold=1024 * 25, # 25MB 以上使用分片
max_concurrency=10, # 10 个并发分片
multipart_chunksize=1024 * 25, # 每片 25MB
use_threads=True
)
s3.upload_file(
'/data/large-dataset.tar.gz',
'my-data-lake',
'datasets/large-dataset.tar.gz',
Config=config
)
# 生成预签名 URL(有效期 1 天)
url = s3.generate_presigned_url(
'get_object',
Params={'Bucket': 'my-data-lake', 'Key': 'datasets/large-dataset.tar.gz'},
ExpiresIn=86400
)
print(f"下载链接: {url}")
# 列出对象(分页)
paginator = s3.get_paginator('list_objects_v2')
for page in paginator.paginate(Bucket='my-data-lake', Prefix='datasets/'):
for obj in page.get('Contents', []):
print(f"{obj['Key']}: {obj['Size'] / 1024 / 1024:.1f} MB")生命周期策略
python
# 设置对象生命周期(自动归档/删除)
lifecycle_config = {
'Rules': [
{
'ID': 'archive-old-data',
'Status': 'Enabled',
'Filter': {'Prefix': 'logs/'},
'Transitions': [
{
'Days': 30,
'StorageClass': 'STANDARD_IA' # 30 天后转为低频访问
},
{
'Days': 90,
'StorageClass': 'GLACIER' # 90 天后归档
}
],
'Expiration': {
'Days': 365 # 1 年后删除
}
}
]
}
s3.put_bucket_lifecycle_configuration(
Bucket='my-data-lake',
LifecycleConfiguration=lifecycle_config
)分布式文件系统(CephFS)
bash
# 挂载 CephFS
# 安装客户端
yum install -y ceph-fuse
# 方式1:内核客户端挂载(性能更好)
mount -t ceph mon1:6789,mon2:6789,mon3:6789:/ /mnt/cephfs \
-o name=admin,secret=<keyring>
# 方式2:FUSE 挂载(兼容性更好)
ceph-fuse -m mon1:6789 /mnt/cephfs
# 查看文件系统状态
ceph fs status
# 设置目录配额
setfattr -n ceph.quota.max_bytes -v 107374182400 /mnt/cephfs/user1 # 100GB
setfattr -n ceph.quota.max_files -v 1000000 /mnt/cephfs/user1 # 100万文件