跳转到内容

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。关键字段:

字段默认值说明
Size3副本数,数据保留几份完整拷贝
Min Size2允许写入所需的最少存活副本数
PG Autoscale Modewarn建议改成 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 tree

nearfull(默认 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 单独准备物理盘,但容量和性能是共享的,规划时要把两边的用量都算进去。

参考资料 ​

Proxmox VE 非官方中文使用指南,与 Proxmox Server Solutions GmbH 无隶属关系。