Ceph 学习笔记
1. Ceph 是什么
Ceph 是一个开源的分布式存储系统,可以把多台服务器上的磁盘统一组织成一个存储集群,对外提供对象存储、块存储和文件存储能力。
Ceph 的核心特点:
- 分布式:数据分散存放在多台服务器上。
- 高可用:某些磁盘或节点故障后,数据仍然可以访问。
- 可扩展:容量不够时,可以继续增加服务器和磁盘。
- 无单点:核心组件通常可以部署多个实例,避免单点故障。
- 统一存储:同一套底层集群可以提供对象、块、文件三种接口。
常见使用场景:
- 云平台后端存储,例如 OpenStack、Kubernetes。
- 虚拟机磁盘存储,例如 RBD 块设备。
- 海量图片、视频、备份文件存储。
- 分布式文件共享,例如 CephFS。
- 私有云或实验环境中的统一存储平台。
2. Ceph 的三种存储接口
| 类型 | 组件 | 说明 | 常见用途 |
|---|---|---|---|
| 对象存储 | RGW | 兼容 S3 / Swift 的对象存储网关 | 图片、视频、备份、归档 |
| 块存储 | RBD | RADOS Block Device,提供虚拟块设备 | 虚拟机磁盘、数据库磁盘、K8s PVC |
| 文件存储 | CephFS | POSIX 风格的分布式文件系统 | 共享目录、应用文件、日志目录 |
一句话记忆:
text
RGW 像对象桶,RBD 像一块硬盘,CephFS 像共享文件夹。
3. Ceph 核心架构
Ceph 的底层核心是 RADOS,所有数据最终都会存放到 RADOS 集群中。RGW、RBD、CephFS 都是建立在 RADOS 之上的不同访问方式。
text
应用程序
-> RGW / RBD / CephFS
-> RADOS
-> OSD
-> 磁盘
3.1 MON
MON 是 Monitor 的缩写,负责维护集群的核心状态信息。
主要作用:
- 维护集群成员信息。
- 保存 OSD Map、MON Map、PG Map、CRUSH Map。
- 负责集群状态一致性。
- 给客户端提供集群拓扑信息。
生产环境一般至少部署 3 个 MON,数量通常为奇数,例如 3 个或 5 个。
3.2 MGR
MGR 是 Manager 的缩写,负责管理和监控相关功能。
主要作用:
- 提供集群运行状态统计。
- 支持 Dashboard 图形化管理界面。
- 提供 Prometheus 监控数据。
- 承担部分管理模块功能。
MGR 一般至少部署 2 个,一个 active,一个 standby。
3.3 OSD
OSD 是 Object Storage Daemon 的缩写,是 Ceph 中真正负责存储数据的核心进程。
主要作用:
- 管理本地磁盘。
- 存储对象数据。
- 处理数据副本。
- 与其他 OSD 进行数据恢复和均衡。
通常一块磁盘对应一个 OSD。生产环境中,OSD 数量越多,集群整体容量和并发能力越强。
3.4 MDS
MDS 是 Metadata Server 的缩写,只在使用 CephFS 时需要。
主要作用:
- 管理 CephFS 的文件系统元数据。
- 处理目录、文件名、权限等信息。
- 提高文件系统访问性能。
如果只使用 RBD 或 RGW,可以不部署 MDS。
3.5 RGW
RGW 是 RADOS Gateway 的缩写,负责提供对象存储访问入口。
主要作用:
- 提供类似 Amazon S3 的接口。
- 支持 bucket、object、access key、secret key。
- 适合存储非结构化数据。
4. Ceph 中的重要概念
4.1 Pool
Pool 是存储池,用来划分数据存储区域。不同业务可以使用不同的 Pool。
Pool 中可以配置:
- 副本数量。
- PG 数量。
- CRUSH 规则。
- 应用类型,例如 rbd、cephfs、rgw。
示例:
bash
ceph osd pool create rbd_pool 32
ceph osd pool application enable rbd_pool rbd
4.2 PG
PG 是 Placement Group 的缩写,可以理解为数据分布和管理的逻辑分组。
Ceph 不会直接把数据对象分配到 OSD,而是先把对象映射到 PG,再把 PG 映射到 OSD。
text
Object -> PG -> OSD
PG 的作用:
- 降低数据管理复杂度。
- 方便数据迁移和恢复。
- 帮助数据均匀分布到不同 OSD。
PG 数量不是越大越好,过多会增加 MON、OSD 的管理压力;过少会导致数据分布不均。
4.3 CRUSH
CRUSH 是 Ceph 的数据分布算法,用来决定数据应该存放在哪些 OSD 上。
CRUSH 的特点:
- 不依赖中心化元数据表。
- 可以根据故障域分布数据。
- 支持按照主机、机柜、机房等层级放置副本。
- 增加或减少 OSD 时,可以尽量减少数据迁移量。
常见故障域:
| 故障域 | 含义 |
|---|---|
| osd | 单块磁盘 |
| host | 单台服务器 |
| rack | 单个机柜 |
| room | 单个机房 |
生产环境通常不希望多个副本落在同一台主机上,因此故障域一般设置为 host。
4.4 副本与纠删码
Ceph 常见的数据保护方式有两种:
| 方式 | 说明 | 优点 | 缺点 |
|---|---|---|---|
| 副本模式 | 保存多份完整数据 | 性能好、恢复简单 | 空间利用率低 |
| 纠删码 | 数据切片并计算校验块 | 空间利用率高 | 计算开销大、恢复复杂 |
实验环境常用 2 副本或 3 副本。生产环境中,3 副本更常见。
5. Ceph 集群状态查看
5.1 查看集群健康状态
bash
ceph -s
ceph status
重点关注:
health:集群健康状态。mon:MON 是否正常。mgr:MGR 是否正常。osd:OSD 总数、在线数量、加入集群数量。pg:PG 是否处于 active+clean。
常见健康状态:
| 状态 | 含义 |
|---|---|
| HEALTH_OK | 集群正常 |
| HEALTH_WARN | 有警告,需要检查 |
| HEALTH_ERR | 有严重问题,需要尽快处理 |
5.2 查看 OSD 状态
bash
ceph osd status
ceph osd tree
ceph osd df
ceph osd tree 可以看到 OSD 所在主机、权重、状态。
常见状态:
| 状态 | 说明 |
|---|---|
| up | OSD 进程正在运行 |
| down | OSD 进程未运行 |
| in | OSD 参与数据分布 |
| out | OSD 不参与数据分布 |
正常情况下,OSD 应该是 up 且 in。
5.3 查看 Pool
bash
ceph osd pool ls
ceph osd pool ls detail
ceph df
ceph df 可以查看集群总容量、已用容量、可用容量,以及各个 Pool 的使用情况。
5.4 查看 PG
bash
ceph pg stat
ceph pg dump
正常情况下,大部分 PG 应该处于:
text
active+clean
常见异常状态:
| 状态 | 说明 |
|---|---|
| degraded | 副本不足,正在降级运行 |
| recovering | 正在恢复数据 |
| backfilling | 正在回填数据 |
| peering | OSD 正在协商 PG 状态 |
| inactive | PG 不可用,需要排查 |
| undersized | 副本数量低于要求 |
6. RBD 块存储常用操作
6.1 创建 RBD Pool
bash
ceph osd pool create rbd_pool 32
ceph osd pool application enable rbd_pool rbd
rbd pool init rbd_pool
6.2 创建块设备镜像
bash
rbd create rbd_pool/test.img --size 10G
rbd ls rbd_pool
rbd info rbd_pool/test.img
6.3 映射到本机
bash
rbd map rbd_pool/test.img
查看映射结果:
bash
rbd showmapped
lsblk
格式化并挂载:
bash
mkfs.xfs /dev/rbd0
mkdir -p /mnt/rbd-test
mount /dev/rbd0 /mnt/rbd-test
df -h
6.4 取消挂载和映射
bash
umount /mnt/rbd-test
rbd unmap /dev/rbd0
6.5 删除 RBD 镜像
bash
rbd rm rbd_pool/test.img
注意:删除 RBD 镜像前,需要确认业务已经不再使用,否则可能造成数据丢失。
7. CephFS 文件存储常用操作
7.1 创建 CephFS
CephFS 需要至少两个 Pool:
- metadata pool:保存元数据。
- data pool:保存文件数据。
示例:
bash
ceph osd pool create cephfs_metadata 32
ceph osd pool create cephfs_data 64
ceph fs new myfs cephfs_metadata cephfs_data
查看文件系统:
bash
ceph fs ls
ceph fs status
7.2 挂载 CephFS
内核方式挂载:
bash
mkdir -p /mnt/cephfs
mount -t ceph 192.168.1.10:6789:/ /mnt/cephfs -o name=admin,secret=你的密钥
也可以使用 FUSE 方式挂载:
bash
mkdir -p /mnt/cephfs
ceph-fuse /mnt/cephfs
查看挂载结果:
bash
df -h
mount | grep ceph
8. RGW 对象存储常用操作
8.1 创建对象存储用户
bash
radosgw-admin user create --uid="testuser" --display-name="Test User"
创建成功后会生成:
access_keysecret_key
这两个密钥用于 S3 客户端访问对象存储。
8.2 使用 S3 客户端访问
常见 S3 客户端:
s3cmdawsclimc- 应用程序中的 S3 SDK
以 s3cmd 为例:
bash
s3cmd --configure
s3cmd mb s3://test-bucket
s3cmd ls
s3cmd put ./test.txt s3://test-bucket/
s3cmd get s3://test-bucket/test.txt
9. 常见故障排查思路
9.1 集群不是 HEALTH_OK
先查看整体状态:
bash
ceph -s
ceph health detail
排查顺序:
- 看是否有 OSD down。
- 看是否有 MON 或 MGR 异常。
- 看 PG 是否长时间不 clean。
- 看磁盘容量是否接近满。
- 看网络是否中断或延迟过高。
9.2 OSD down
常用命令:
bash
ceph osd tree
systemctl status ceph-osd@0
journalctl -u ceph-osd@0 -xe
排查方向:
- OSD 进程是否启动。
- 磁盘是否损坏。
- 挂载点是否异常。
- 网络是否正常。
- 认证 keyring 是否正确。
9.3 磁盘空间不足
查看容量:
bash
ceph df
ceph osd df
处理思路:
- 删除无用数据。
- 扩容 OSD。
- 检查是否有某些 OSD 使用率明显偏高。
- 检查 CRUSH 权重是否合理。
- 检查 Pool 副本数和 PG 数是否合理。
9.4 PG 长时间异常
查看 PG 状态:
bash
ceph pg stat
ceph health detail
如果 PG 长时间处于 degraded、undersized、inactive,需要重点检查对应 OSD 是否正常。
10. 常用命令汇总
| 命令 | 作用 |
|---|---|
ceph -s |
查看集群整体状态 |
ceph health detail |
查看详细健康告警 |
ceph osd tree |
查看 OSD 拓扑 |
ceph osd status |
查看 OSD 状态 |
ceph osd df |
查看 OSD 容量分布 |
ceph df |
查看集群和 Pool 容量 |
ceph mon stat |
查看 MON 状态 |
ceph mgr stat |
查看 MGR 状态 |
ceph pg stat |
查看 PG 状态 |
ceph osd pool ls |
查看 Pool 列表 |
rbd ls <pool> |
查看 RBD 镜像 |
rbd info <pool>/<image> |
查看 RBD 镜像信息 |
ceph fs ls |
查看 CephFS 文件系统 |
ceph fs status |
查看 CephFS 状态 |
11. 学习重点总结
学习 Ceph 时,可以按照下面这条主线理解:
text
磁盘 -> OSD -> PG -> Pool -> RBD / CephFS / RGW -> 应用
需要重点掌握:
- Ceph 三种存储接口:RGW、RBD、CephFS。
- MON、MGR、OSD、MDS、RGW 的作用。
- Pool、PG、CRUSH 的关系。
ceph -s、ceph osd tree、ceph df等常用查看命令。- OSD down、PG 异常、容量不足等常见故障的排查思路。
一句话总结:
text
Ceph 的本质是把多台机器上的多块磁盘组织成一个可靠、可扩展、可统一访问的分布式存储集群。