Skip to content

分布式存储概览

分布式存储 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万文件

褚成志的云与计算笔记