Ceph 分布式存储系统:架构、实践与竞品分析

前言

在分布式系统中,存储是一个核心问题。当数据量从 GB 级增长到 TB、PB 级,单机存储已经无法满足需求,我们需要一个高可用、高扩展、高性能的分布式存储方案。

Ceph 是目前最流行的开源分布式存储系统之一,被 Red Hat、Canonical 等公司广泛采用,也是 OpenStack、Kubernetes 等云平台的首选存储后端。

本文将从问题背景、架构设计、部署实践、竞品对比四个维度,深入解析 Ceph。


一、Ceph 解决了什么问题?

1.1 传统存储的痛点

问题 说明
单点故障 传统 NAS/SAN 存储,控制器故障导致服务不可用
扩展性差 存储容量受限于单机硬件,扩容需要停机迁移
成本高昂 商业存储设备价格昂贵,license 费用持续支出
数据孤岛 不同业务使用不同存储系统,数据无法互通
运维复杂 存储管理需要专业团队,故障恢复依赖厂商支持

1.2 Ceph 的核心价值

1
Ceph = 统一存储 + 无中心架构 + 自动愈合 + 弹性扩展

Ceph 提供三种存储接口:

存储类型 接口 典型场景
对象存储 (RADOS Gateway) S3/Swift 兼容 API 图片、视频、日志、备份
块存储 (RBD) 内核模块 / QEMU 虚拟机磁盘、数据库存储
文件系统 (CephFS) POSIX 兼容 共享文件系统、HPC

核心优势:

  • 无单点故障:去中心化架构,任意节点故障不影响服务
  • 线性扩展:添加节点即可扩展容量和性能
  • 自动愈合:数据副本自动修复,无需人工干预
  • 统一存储:一套系统支持对象、块、文件三种接口
  • 开源免费:社区活跃,无 license 费用

二、Ceph 怎么解决这些问题?

2.1 核心架构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
┌─────────────────────────────────────────────────────────────┐
│ Client Layer │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ RBD │ │ CephFS │ │ RGW │ │
│ │ (块存储) │ │ (文件系统) │ │ (对象存储) │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│ RADOS Layer │
│ (Reliable Autonomic Distributed Object Store) │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ CRUSH 算法 │ │
│ │ (数据分布、故障域、副本放置) │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ OSD │ │ OSD │ │ OSD │ │ OSD │ │
│ │ (磁盘) │ │ (磁盘) │ │ (磁盘) │ │ (磁盘) │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
└─────────────────────────────────────────────────────────────┘


┌─────────────────────────────────────────────────────────────┐
│ Monitor Layer │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │ MON-1 │ │ MON-2 │ │ MON-3 │ │
│ │ (仲裁) │ │ (仲裁) │ │ (仲裁) │ │
│ └─────────┘ └─────────┘ └─────────┘ │
└─────────────────────────────────────────────────────────────┘

2.2 核心组件

组件 说明 部署建议
OSD (Object Storage Daemon) 管理单块磁盘,处理数据读写、复制、恢复 每块磁盘一个 OSD,建议 SSD + HDD 混合
MON (Monitor) 维护集群状态、OSD Map、PG Map 3-5 个节点,奇数个,独立部署
MDS (Metadata Server) 管理 CephFS 元数据 2+ 个节点,Active/Standby 模式
RGW (RADOS Gateway) 提供 S3/Swift 兼容 API 2+ 个节点,负载均衡
MGR (Manager) 提供集群监控、管理接口 2 个节点,Active/Standby 模式

2.3 CRUSH 算法:数据分布的核心

CRUSH (Controlled Replication Under Scalable Hashing) 是 Ceph 的核心算法,解决数据如何分布在集群中。

1
Object → HASH → PG (Placement Group) → CRUSH → OSD

CRUSH 的核心优势:

  1. 去中心化:不需要中心化的元数据服务器
  2. 确定性:相同输入总是映射到相同位置
  3. 可配置:支持故障域(机架、机房、数据中心)
  4. 动态调整:添加/删除节点时,只迁移部分数据

故障域示例:

1
Datacenter → Room → Row → Rack → Host → OSD

当配置了机架级故障域时,数据副本会分布在不同机架,即使整个机架故障,数据仍然可用。

2.4 数据一致性:Peering 机制

Ceph 使用 Peering 机制保证数据一致性:

1
2
3
4
5
6
7
Primary OSD ←→ Replica OSDs

├── 1. 选举 Primary OSD
├── 2. 比较 OSD 日志
├── 3. 发现差异对象
├── 4. 修复不一致数据
└── 5. 标记 PG 为 active

PG 状态:

  • creating:PG 正在创建
  • active:PG 可用,可以处理读写
  • clean:所有副本一致
  • degraded:部分副本缺失,正在恢复
  • recovering:正在恢复数据
  • backfill:正在后台迁移数据

三、Ceph 怎么使用?

3.1 部署架构

推荐的最小生产环境:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
┌─────────────────────────────────────────────────────────┐
│ Ceph Cluster │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Node-1 │ │ Node-2 │ │ Node-3 │ │
│ │ │ │ │ │ │ │
│ │ MON + MGR │ │ MON + MGR │ │ MON + MGR │ │
│ │ OSD x3 │ │ OSD x3 │ │ OSD x3 │ │
│ │ MDS │ │ MDS │ │ MDS │ │
│ │ RGW │ │ RGW │ │ RGW │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ 总计:3 MON, 3 MGR, 9 OSD, 3 MDS, 3 RGW │
└─────────────────────────────────────────────────────────┘

硬件配置建议:

角色 CPU 内存 磁盘 网络
MON/MGR 4 核 8GB 100GB SSD 1GbE
OSD 4 核/每块磁盘 4GB/每块磁盘 数据盘 HDD + WAL SSD 10GbE
MDS 8 核 16GB 200GB SSD 10GbE
RGW 8 核 16GB 100GB SSD 10GbE

3.2 使用 cephadm 部署(推荐)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 1. 安装 cephadm
curl --silent --remote-name --location https://github.com/ceph/ceph/raw/quincy/src/cephadm/cephadm
chmod +x cephadm
sudo ./cephadm install

# 2. 引导第一个节点
sudo cephadm bootstrap --mon-ip 192.168.1.10 --cluster-network 192.168.2.0/24

# 3. 添加其他节点
sudo ceph orch host add node2 192.168.1.11
sudo ceph orch host add node3 192.168.1.12

# 4. 添加 OSD(自动发现磁盘)
sudo ceph orch apply osd --all-available-devices

# 5. 查看集群状态
sudo ceph -s
sudo ceph osd tree
sudo ceph pg stat

3.3 使用 RBD 块存储

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建存储池
sudo ceph osd pool create rbd-pool 128

# 启用 RBD
sudo rbd pool init rbd-pool

# 创建 RBD 镜像
sudo rbd create rbd-pool/vm-disk --size 102400 # 100GB

# 映射到本地
sudo rbd map rbd-pool/vm-disk

# 格式化并挂载
sudo mkfs.ext4 /dev/rbd0
sudo mount /dev/rbd0 /mnt/rbd

# 查看 RBD 镜像
sudo rbd ls rbd-pool
sudo rbd info rbd-pool/vm-disk

3.4 使用 RADOS Gateway (S3)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 创建 RGW 用户
sudo radosgw-admin user create --uid="testuser" --display-name="Test User"

# 输出包含 access_key 和 secret_key
{
"user_id": "testuser",
"display_name": "Test User",
"keys": [
{
"user": "testuser",
"access_key": "XXXXXXXXXXXXXXXXXXXX",
"secret_key": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
]
}

# 使用 AWS CLI 访问
aws configure set aws_access_key_id "XXXXXXXXXXXXXXXXXXXX"
aws configure set aws_secret_access_key "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
aws configure set default.region "default"

# 创建 bucket
aws --endpoint-url http://rgw-node:8080 s3 mb s3://my-bucket

# 上传文件
aws --endpoint-url http://rgw-node:8080 s3 cp file.txt s3://my-bucket/

# 列出文件
aws --endpoint-url http://rgw-node:8080 s3 ls s3://my-bucket/

3.5 使用 CephFS 文件系统

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建 CephFS 数据池和元数据池
sudo ceph osd pool create cephfs-data 128
sudo ceph osd pool create cephfs-metadata 128

# 创建 CephFS
sudo ceph fs new cephfs cephfs-metadata cephfs-data

# 安装 CephFS 客户端
sudo apt install ceph-fuse

# 挂载 CephFS
sudo ceph-fuse -m 192.168.1.10:6789 /mnt/cephfs

# 或者使用内核挂载
sudo mount -t ceph 192.168.1.10:6789:/ /mnt/cephfs -o name=admin,secretfile=/etc/ceph/admin.secret

3.6 Kubernetes 集成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# StorageClass for RBD
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: ceph-rbd
provisioner: rbd.csi.ceph.com
parameters:
clusterID: <cluster-id>
pool: rbd-pool
imageFeatures: layering
csi.storage.k8s.io/provisioner-secret-name: csi-rbd-secret
csi.storage.k8s.io/provisioner-secret-namespace: ceph-csi
csi.storage.k8s.io/node-stage-secret-name: csi-rbd-secret
csi.storage.k8s.io/node-stage-secret-namespace: ceph-csi
reclaimPolicy: Delete
allowVolumeExpansion: true
mountOptions:
- discard
1
2
3
4
5
6
7
8
9
10
11
12
# PVC 使用 Ceph RBD
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: ceph-rbd-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: ceph-rbd

四、竞品分析

4.1 分布式存储系统对比

特性 Ceph MinIO GlusterFS HDFS SeaweedFS
存储类型 对象/块/文件 对象 文件 文件 对象
协议 S3/Swift/RBD/CephFS S3 NFS/Gluster HDFS API HTTP API
元数据 去中心化 (CRUSH) 去中心化 去中心化 中心化 (NameNode) 中心化 (Master)
数据一致性 强一致 强一致 最终一致 强一致 最终一致
小文件优化 ⭐⭐ ⭐⭐⭐ ⭐⭐ ⭐⭐⭐⭐
大文件优化 ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐
部署复杂度
运维复杂度
社区活跃度 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐
生产案例 Red Hat, Canonical 云原生 企业 NAS Hadoop 生态 小规模部署

4.2 详细对比分析

Ceph vs MinIO

维度 Ceph MinIO
定位 统一存储平台 专注对象存储
优势 支持多种存储接口,功能全面 轻量级,部署简单,S3 兼容性好
劣势 部署复杂,运维成本高 只支持对象存储,无块/文件支持
适用场景 需要统一存储的企业级场景 纯对象存储场景,云原生环境

选型建议:

  • 如果只需要 S3 对象存储 → MinIO
  • 如果需要块存储/文件系统 → Ceph
  • 如果运维能力有限 → MinIO

Ceph vs GlusterFS

维度 Ceph GlusterFS
定位 统一存储平台 分布式文件系统
优势 功能全面,强一致性 部署简单,POSIX 兼容性好
劣势 部署复杂 无块存储/对象存储支持
元数据 去中心化 去中心化
适用场景 需要多种存储接口 纯文件共享场景

选型建议:

  • 如果需要 NFS 替代方案 → GlusterFS
  • 如果需要块存储/对象存储 → Ceph
  • 如果追求简单易用 → GlusterFS

Ceph vs HDFS

维度 Ceph HDFS
定位 通用存储平台 大数据存储
优势 支持多种接口,随机读写 大文件顺序读写性能高
劣势 小文件性能差 只支持文件,单点故障 (NameNode)
适用场景 通用存储 Hadoop/Spark 生态

选型建议:

  • 如果是 Hadoop/Spark 生态 → HDFS
  • 如果需要通用存储 → Ceph
  • 如果需要对象存储 → Ceph

4.3 选型决策树

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
你的存储需求是什么?

├── 需要对象存储 (S3)
│ ├── 只需要对象存储 → MinIO
│ └── 还需要块/文件 → Ceph

├── 需要块存储 (VM/数据库)
│ └── Ceph (RBD)

├── 需要文件系统 (共享存储)
│ ├── NFS 替代 → GlusterFS
│ └── 高性能需求 → CephFS

└── 需要大数据存储
├── Hadoop/Spark 生态 → HDFS
└── 通用存储 → Ceph

五、生产环境最佳实践

5.1 性能优化

1. 分层存储 (Tiering)

1
SSD Pool (热数据) ←→ Cache Tier ←→ HDD Pool (冷数据)
1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建缓存池
sudo ceph osd pool create cache-pool 128
sudo ceph osd pool create cold-pool 128

# 设置缓存层
sudo ceph tier add cold-pool cache-pool
sudo ceph tier cache-mode cache-pool writeback

# 设置缓存规则
sudo ceph osd pool set cache-pool hit_set_type bloom
sudo ceph osd pool set cache-pool hit_set_count 1
sudo ceph osd pool set cache-pool hit_set_period 3600
sudo ceph osd pool set cache-pool target_max_bytes 100000000000 # 100GB

2. 纠删码 (Erasure Coding)

纠删码可以用更少的存储空间提供相同的数据可靠性。

1
2
3
4
5
6
7
# 创建纠删码池
sudo ceph osd pool create ec-pool 128 erasure

# 默认 profile:k=2, m=1 (3份数据,占用 1.5 倍空间)
# 自定义 profile
sudo ceph osd erasure-code-profile set my-profile k=4 m=2 crush-failure-domain=rack
sudo ceph osd pool create ec-pool 128 erasure my-profile

纠删码 vs 副本:

策略 存储开销 可靠性 性能
3 副本 3x
纠删码 4+2 1.5x

5.2 监控告警

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 查看集群状态
sudo ceph -s
sudo ceph health detail

# 查看 OSD 状态
sudo ceph osd tree
sudo ceph osd stat

# 查看 PG 状态
sudo ceph pg stat
sudo ceph pg dump

# 查看性能指标
sudo ceph osd pool stats
sudo ceph osd perf

推荐监控工具:

  • Ceph Dashboard:官方 Web 管理界面
  • Prometheus + Grafana:指标采集和可视化
  • Zabbix:企业级监控告警

5.3 备份恢复

1
2
3
4
5
6
7
8
9
10
11
12
13
# RBD 快照
sudo rbd snap create rbd-pool/vm-disk@snap1
sudo rbd snap ls rbd-pool/vm-disk

# RBD 导出
sudo rbd export rbd-pool/vm-disk /backup/vm-disk.img

# RBD 导入
sudo rbd import /backup/vm-disk.img rbd-pool/vm-disk-restored

# RADOS 导出
sudo rados -p rbd-pool export /backup/rados-export
sudo rados -p rbd-pool import /backup/rados-export

六、常见问题与解决方案

6.1 OSD 频繁宕机

原因:

  • 磁盘故障
  • 内存不足
  • 网络抖动

解决方案:

1
2
3
4
5
6
7
8
9
# 查看 OSD 日志
sudo journalctl -u ceph-osd@<osd-id>

# 检查磁盘健康
sudo smartctl -a /dev/sdX

# 调整 OSD 参数
sudo ceph config set osd osd_heartbeat_grace 60
sudo ceph config set osd osd_heartbeat_interval 10

6.2 集群空间不足

解决方案:

1
2
3
4
5
6
7
8
9
10
11
12
# 查看空间使用
sudo ceph df
sudo ceph osd df

# 清理已删除的对象
sudo rados -p rbd-pool cleanup

# 调整副本数
sudo ceph osd pool set rbd-pool size 2

# 使用纠删码
sudo ceph osd pool create ec-pool 128 erasure

6.3 性能问题

排查步骤:

1
2
3
4
5
6
7
8
# 查看 IO 统计
sudo ceph osd perf

# 查看慢请求
sudo ceph daemon osd.<id> dump_ops_in_flight

# 查看网络延迟
sudo ceph daemon mon.<id> perf dump

总结

Ceph 是一个功能强大的分布式存储系统,适合需要统一存储、高可用、弹性扩展的企业级场景。

适用场景:

  • ✅ 云平台存储后端(OpenStack、Kubernetes)
  • ✅ 虚拟化环境存储
  • ✅ 大规模对象存储
  • ✅ 需要块存储 + 文件系统的混合场景

不适用场景:

  • ❌ 小规模部署(运维成本高)
  • ❌ 纯对象存储场景(MinIO 更简单)
  • ❌ 纯大数据场景(HDFS 更专业)

选型建议:

  • 如果团队有存储运维能力,且需要统一存储 → Ceph
  • 如果只需要 S3 对象存储 → MinIO
  • 如果需要 NFS 替代 → GlusterFS
  • 如果是 Hadoop 生态 → HDFS

参考资料


最后更新:2026-05-09


Ceph 分布式存储系统:架构、实践与竞品分析
https://msb8080.github.io/blog/2026/05/09/ceph-distributed-storage/
作者
minshuaibo
发布于
2026年5月9日
许可协议