外观
Ceph 运维:OSD、Pool、CephFS、容量与故障域
这篇接着Ceph 超融合入门与部署,讲集群跑起来之后的日常运维:怎么安全地换盘/移除 OSD、怎么管理存储池、怎么加 CephFS,以及容量和故障域这两个决定「能不能扛住硬件故障」的核心概念。
移除 OSD 和销毁 Pool 顺序错了会丢数据
移除 OSD 如果跳过「等待数据重新平衡」这一步直接强行拿掉磁盘,或者在剩余 OSD 容量已经紧张时还继续移除,都可能导致某些数据的所有副本同时不可用。销毁 Pool 是不可逆操作,里面的数据不会进回收站。
开始前:确认集群当前是 HEALTH_OK,确认要动的 Pool/OSD 上的数据有没有独立备份,确认按下文的顺序一步步来,任何一步的警告或异常先停下来排查再继续。
移除 OSD:官方推荐的安全顺序
换盘、缩容、淘汰旧硬件都会涉及移除 OSD。不要直接拔盘或者一步执行 destroy,按顺序来:
第一步:确认剩余容量够用
sh
ceph osd df tree确保移除这个 OSD 之后,数据重新分布到其余 OSD 上不会有任何一个逼近 nearfull 阈值(默认 85%)。容量吃紧时,先扩容(加新 OSD)再移除旧的,不要反过来。
第二步:标记为 out,触发数据迁移
Web UI:节点 → Ceph → OSD 选中目标 → Out。命令行:
sh
ceph osd out <osd-id>Ceph 会开始把这个 OSD 上的数据副本迁移到其他 OSD 上。
第三步:等待重新平衡完成
sh
ceph -s观察 misplaced/degraded 相关的百分比归零,目标 OSD 显示 0 个 PG。这一步可能持续数分钟到数小时,取决于数据量和网络带宽,不要在这个过程中继续移除其他 OSD。
第四步:停止 OSD 服务
Web UI 选中该 OSD → Stop。命令行:
sh
ceph osd ok-to-stop <osd-id>
pveceph stop --service osd.<osd-id>如果 ok-to-stop 给出警告,先不要继续,通常意味着停掉它会导致某些 PG 暂时不可用,等重新平衡真正完成或者先处理其他问题。
第五步:销毁 OSD
Web UI:选中该 OSD → More → Destroy,勾选清理选项。命令行:
sh
pveceph osd destroy <osd-id> --cleanup--cleanup 会顺便清除磁盘上的 Ceph 签名,方便这块盘之后挪作他用或者物理更换。
物理换盘前,仍然要核对序列号
如果移除 OSD 是为了物理更换硬盘,拔盘前依然要用 lsblk -o NAME,SIZE,MODEL,SERIAL 核对目标盘的序列号,流程和磁盘健康:SMART、ZFS scrub 与换盘流程里强调的一样——Ceph 的分布式特性不改变「认错物理盘」这个操作层面的风险。
Pool 管理
创建与编辑
Web UI:Ceph → Pools。关键字段:
| 字段 | 默认值 | 说明 |
|---|---|---|
| Size | 3 | 副本数,数据保留几份完整拷贝 |
| Min Size | 2 | 允许写入所需的最少存活副本数 |
| PG Autoscale Mode | warn | 建议改成 on,交给 Ceph 自动调整 PG 数量 |
| Crush Rule | - | 控制数据往哪些设备/故障域放,进阶选项 |
| Add as Storage | 是 | 是否同时注册为 PVE 存储 |
不要把 Min Size 设为 1
min_size=1 时,只要还有一份副本活着系统就允许继续写入。一旦唯一存活的那份副本也出问题,这段时间写入的数据将无法恢复。保持官方默认(至少 2)。
命令行创建:
sh
pveceph pool create <pool-name> --add_storages调整已有池的某个属性,直接用 Ceph 原生命令,例如切换 CRUSH 规则:
sh
ceph osd pool set <pool-name> crush_rule <rule-name>纠删码 (erasure coding) 池适合归档类、可以接受更高延迟换取更省空间的场景,例如:
sh
pveceph pool create <pool-name> --erasure-coding k=2,m=1--size/--min_size/--crush_rule 对纠删码池只影响它的元数据副本池,不影响纠删码数据本身的冗余参数。
销毁 Pool
销毁 Pool 会立刻丢失里面的全部数据,且不可撤销
Web UI:Ceph → Pools 选中 → Destroy,需要手动输入 Pool 名称二次确认。命令行:
sh
pveceph pool destroy <pool-name>加 --remove_storages 可以顺便移除关联的 PVE 存储配置。销毁在后台执行,可能需要一些时间才能彻底释放空间。
CephFS:让 Ceph 也能存文件
RBD(块设备)只能给虚拟机磁盘用,想存 ISO、备份、容器模板这类文件,需要额外部署 CephFS。
第一步:创建 MDS(元数据服务)
sh
pveceph mds create或 Web UI:节点 → CephFS → Metadata Server。CephFS 至少需要一个 active 的 MDS 才能工作;可以部署多个作为热备(standby),默认同一时间只有一个 active。追求更快的故障切换,可以在创建时启用 hotstandby,代价是常态下多占一些资源。
MDS 比较吃 CPU
文件系统的元数据操作(创建、重命名、权限检查)集中在 MDS 上处理,规划节点资源时给它留出余量,尤其是准备存放大量小文件时。
第二步:创建 CephFS
sh
pveceph fs create --pg_num 128 --add-storage这会创建一个名为 cephfs 的文件系统,数据池 cephfs_data 用 128 个 PG,元数据池 cephfs_metadata 自动分到数据池 PG 数的四分之一(32 个)。--add-storage 让它同时注册为 PVE 存储,可以用来放备份、ISO、容器模板。
容量、CRUSH 与故障域
CRUSH 是 Ceph 决定「这份数据的各个副本该放到哪些 OSD 上」的算法,不依赖中心化的索引表。它的核心概念是故障域 (failure domain)——默认按 host(主机)划分,意味着同一份数据的多个副本会尽量分布在不同的物理节点上,一台节点整体下线也不会丢数据。
sh
# 查看设备类别划分(hdd/ssd/nvme 各自独立的影子树)
ceph osd crush tree --show-shadow按设备类型分层可以让快慢盘各司其职
可以针对 hdd、ssd、nvme 分别建 CRUSH 规则,把某些池强制落在 SSD/NVMe 上(追求延迟),另一些落在机械盘上(追求容量):
sh
ceph osd crush rule create-replicated <rule-name> <root> host <device-class>用自动缩放器 (autoscaler) 时注意:同一个集群里,要么所有池的规则都带设备类型限定,要么都不带,混用会让自动缩放器的计算出问题。
日常容量监控:
sh
# 集群整体健康和容量概览
ceph -s
# 每个 OSD 的容量占用,找出接近满的
ceph osd df treenearfull(默认 85%)不是「还有余量」,是该动手的信号
Ceph 达到 nearfull 阈值会开始限制某些操作、发出持续告警;达到 full 阈值会直接拒绝写入。把 85% 当成硬性上限提前规划扩容或清理,而不是等到告警变红才处理。
检查结果
sh
ceph -s # 整体健康 HEALTH_OK
ceph osd df tree # 各 OSD 容量占用是否均衡
ceph df # 池级别的容量使用
pvesm status # Pool/CephFS 对应的 PVE 存储是否 active移除 OSD 或销毁 Pool 之后,额外确认受影响的虚拟机/容器仍能正常读写,且集群健康状态恢复 HEALTH_OK。
常见问题
移除一个 OSD 之后,集群报某些 PG undersized。 说明剩余副本数暂时低于 Size 设定值,正常情况下会在数据重新平衡后自愈;如果长期不恢复,检查是不是剩余 OSD 容量不够或者故障域规划让新副本无处可放。
Pool 的 PG 数量该怎么定。 优先开启 PG 自动缩放器让 Ceph 自己算,只有在完全理解 CRUSH 分布和性能特征之后再考虑手工指定,手工设置过低会导致数据分布不均,过高会增加集群整体开销。
CephFS 和 RBD 存储可以共用同一批 OSD 吗。 可以,它们只是在同一个 OSD 池之上建的不同逻辑层(RBD 是块设备,CephFS 走文件系统语义),不需要给 CephFS 单独准备物理盘,但容量和性能是共享的,规划时要把两边的用量都算进去。