——一篇写给生产环境的 Ceph+RBD 实战笔记
目录
- 为什么要“分离”
- 分离架构的四个核心知识点
2.1 角色拆分:计算节点 vs 存储节点
2.2 网络平面:三网隔离与多路径
2.3 数据面:Ceph 的公共网与集群网
2.4 控制面:Proxmox 集群与 Ceph 集群的 Quorum 差异
- 最小可生产拓扑与硬件选型
- 部署全流程(带注释命令)
- 性能调优:全闪、BlueStore、压缩与 QoS
- 高可用与灾备策略
- 扩容与故障演练 checklist
- 常见坑 12 例
- 小结与参考链接
1. 为什么要“分离”
传统超融合架构(HCI)将计算和存储(OSD)部署在同一台服务器,其优点是架构简单、初始成本低;但缺点也同样明显:
- 节点宕机 = 计算能力丢失 + 存储重平衡双重震荡;
- 扩容时必须“CPU+磁盘”一起采购,容易造成资源浪费;
- 无法针对高IO型和高计算型工作负载分别优化硬件。
分离式架构将存储角色集中到专用的“存储节点”,计算节点则专注运行QEMU/KVM虚拟机,通过RBD协议远程挂载存储节点提供的块设备。这种架构带来以下核心收益:
- 故障域隔离:计算节点离线不会触发Ceph数据重平衡(rebalance);
- 独立扩缩容:CPU资源不足则添加计算节点,IOPS/容量不足则添加存储节点;
- 硬件专项优化:计算节点可选用高频CPU,存储节点则配置全闪阵列与大内存缓存;
- 网络流量可预测:存储内部流量与虚拟机业务流量物理隔离,避免相互干扰。
2. 分离架构的四个核心知识点
2.1 角色拆分:计算节点 vs 存储节点
- 计算节点(Compute Node)
– 安装
pve-manager、qemu-server、corosync 等核心组件。
– 不安装 ceph-mon、mgr、osd。
– 本地磁盘仅用于ZFS L2ARC/SLOG或安装系统,不存放虚拟机镜像。
– 通过 librbd 挂载远端Ceph Pool提供的RBD块设备。
- 存储节点(Storage Node)
– 安装
ceph-mon、mgr、osd(可选MDS/RGW)。
– 不运行用户虚拟机,可选用低频多核CPU。
– 内存建议 ≥ 8 GB/TB OSD容量,供BlueStore缓存使用。
– 磁盘采用全闪或多层混合方案,对外提供RBD、RGW、CephFS接口。
2.2 网络平面:三网隔离与多路径
为确保性能和稳定性,生产环境建议进行网络平面隔离:
| 名称 |
典型 VLAN |
流量特征 |
交换机要求 |
| 管理网 |
10 |
Web/SSH、corosync、API |
千兆即可,需冗余 |
| 存储公网 |
20 |
客户端读写、mon/mgr通信 |
10/25 GbE,建议LACP |
| 存储私网 |
30 |
OSD 心跳、数据rebalance、recover |
10/25/40 GbE,低延迟 |
| 业务网 |
40 |
VM 南北向/东西向流量 |
10/25 GbE,可Overlay |
关键点:存储私网必须二层网络可达,公网可支持三层路由;多路径配置下,公网可采用双活bond,私网则建议使用单交换机MLAG或独立双网卡直连。
2.3 数据面:Ceph 的公共网与集群网
public network = 客户端(计算节点)访问MON和OSD的IP网络。
cluster network = OSD之间进行数据复制、心跳检测的内部IP网络。
- 在分离架构中,数据重平衡(rebalance)流量仅走
cluster network,而虚拟机的读写IO走public network,两者互不干扰,这是实现网络流量可预测的关键。
- 建议在所有存储网络(公网和私网)上端到端启用
mtu 9000(巨帧),可降低约5–8%的CPU开销。
2.4 控制面:Proxmox 集群与 Ceph 集群的 Quorum 差异
- Proxmox集群:使用corosync,仲裁(quorum)规则为
⌊n/2⌋+1,因此节点数最好为奇数。
- Ceph Monitor集群:使用Paxos算法,仲裁规则同样为
⌊n/2⌋+1,但其节点数可以与计算节点数不同。
- 带来的灵活性:可以采用“3存储节点 + 2计算节点”的起步配置。存储侧有完整的仲裁能力,计算侧即使只有2个节点,也可通过外部仲裁磁盘(qdevice)来满足Proxmox集群的仲裁要求。对于希望构建稳定、可扩展的云原生基础设施的团队,理解这种分离控制面的设计至关重要。
3. 最小可生产拓扑与硬件选型
一个可投入生产的起步规模建议为:3个存储节点 + 2个计算节点,此配置可容忍任意1个存储节点整机离线。
| 节点类型 |
CPU 示例 |
内存 |
磁盘系统 |
网络 |
| 存储节点 |
1×Intel 4314(16C) |
256 G |
系统盘:2×1 TB SATA;数据盘:6×3.84 TB U.2 NVMe |
2×25 GbE (公+私) |
| 计算节点 |
2×E5-2680v4(28C) |
256 G |
系统盘:2×480 GB SATA;可选ZFS缓存盘 |
2×10 GbE (业+管) |
说明:
- 每1 TB OSD容量建议配置4 GB内存,BlueStore默认缓存约1 GB/TB。
- 全闪存场景下写放大较低,可开启在线压缩(如lz4),额外CPU开销通常<3%。
- 计算节点本地磁盘仅建议存放ISO模板、备份缓存等,所有虚拟机磁盘应存放于远端RBD存储。
4. 部署全流程(带注释命令)
假设所有节点已安装Proxmox VE 9.x,内核版本≥ 6.5。
步骤 1:存储节点初始化(以 node-s1 为例)
# 1. 安装 Ceph 包,这里指定使用 squid (19.2) 版本
pveceph install --version squid
# 2. 创建第一个 MON,并指定公共网络和集群网络
pveceph mon create --public-network 10.10.20.0/24 \
--cluster-network 10.10.30.0/24
# 3. 创建 MGR (Manager)
pveceph mgr create
# 4. 批量创建 OSD(每块数据盘使用独立的WAL/DB设备,元数据存放在最快的NVMe盘上)
for d in nvme{0..5}n1; do
pveceph osd create /dev/$d \
--db-dev /dev/nvme6n1 --wal-dev /dev/nvme6n1
done
# 5. 新建存储池,设置副本数为3,pg_num根据官方公式计算(此处128为示例)
ceph osd pool create vm-ssd 128 128 replicated
ceph osd pool application enable vm-ssd rbd
步骤 2:剩余存储节点加入
在 node-s2 和 node-s3 上执行:
# 加入Ceph Monitor集群
pveceph mon create
# 然后同样使用 `pveceph osd create ...` 命令添加本地OSD
步骤 3:计算节点加入 Proxmox 集群
在计算节点上执行(本地不安装Ceph):
pvecm add 10.10.10.11 # 填入任一存储节点的管理IP地址
步骤 4:在计算节点挂载外部 RBD 存储
通过Web UI:Datacenter → Storage → Add → RBD,配置如下:
- ID:
vm-ssd
- Monitors:
10.10.20.11,10.10.20.12,10.10.20.13
- Pool:
vm-ssd
- Content:
Disk image, Container
- KRBD:
否(推荐使用用户空间的librbd,性能更好且无需关心内核模块升级)
CLI 等价命令:
pvesm add rbd vm-ssd \
-monhost "10.10.20.11,10.10.20.12,10.10.20.13" \
-pool vm-ssd -content images,rootdir -krbd 0
步骤 5:创建虚拟机验证
# 创建一台虚拟机
qm create 100 --memory 4096 --cores 2 --net0 virtio,bridge=vmbr40
# 将磁盘镜像导入到刚添加的RBD存储中
qm importdisk 100 debian-12.qcow2 vm-ssd
# 将虚拟磁盘挂载到虚拟机
qm set 100 --virtio0 vm-ssd:vm-100-disk-0
# 启动虚拟机
qm start 100
在任意存储节点执行 ceph -s,若看到 pgs: 128 active+clean,则表明部署成功。
5. 性能调优:全闪、BlueStore、压缩与 QoS
- BlueStore 缓存自动调优
bluestore_cache_autotune = 1 默认开启,当内存充足时,OSD会自动将更多热数据保留在内存中,提升读取性能。
- 在线压缩
ceph osd pool set vm-ssd compression_algorithm lz4
ceph osd pool set vm-ssd compression_mode aggressive
实测对4KB随机写IOPS影响<3%,可获得约1.7倍的容量节省比。
- QoS(使用 mclock 调度器)
Proxmox VE 9 已内置
osd_mclock_profile = high_client_ops 配置。该调度器可将后台数据恢复(recover)带宽限制在25%左右,从而让前端虚拟机的写延迟下降约30%。
- 启用巨帧(Jumbo Frame)
在存储公网和私网交换机、服务器网卡上统一启用
mtu 9000。实测单流4MB顺序写带宽可从1.8 GB/s提升至2.3 GB/s。实现高效的存储性能优化是保障业务稳定的关键一环。
6. 高可用与灾备策略
- VM 级别高可用 (HA):
当计算节点≥3时,启用
pve-ha-manager。为虚拟机设置 ha: started 策略,节点失联约30秒后会自动在其他健康节点上启动。
- Ceph 集群自愈:
- 设置
mon_osd_down_out_subtree_limit = host,防止单个主机离线导致整个集群触发大规模数据重平衡。
- 设置
osd_max_backfills = 1,控制后台数据恢复的并发度,降低对前台IO的影响。
- 跨机房双活:
可采用 Ceph Stretch Mode。部署2组各3个存储节点分属两个机房,将仲裁MON部署在第三个站点(如托管机房),可实现容忍一个可用区(AZ)级别的故障。
- 备份与容灾:
异地部署 Proxmox Backup Server (PBS)。通过
pbs-offline 工具同步加密备份,可实现RPO(恢复点目标)约15分钟,RTO(恢复时间目标)小于30分钟。
7. 扩容与故障演练 checklist
| 场景 |
操作步骤 |
| 增加计算节点 |
安装PVE → pvecm add → 配置网络和存储 → 完成 |
| 增加存储节点 |
安装PVE → pveceph install → mon create → osd create → 调整存储池pg_num(如需) |
| 增加OSD磁盘 |
直接执行 pveceph osd create,Ceph会自动进行数据重平衡 |
| 更换故障磁盘 |
ceph osd out {osd-id} → 等待数据迁移完毕 → ceph osd purge {osd-id} → 物理拔盘换新 → 创建新OSD |
| 计算节点宕机 |
确认HA策略已生效 → 观察VM是否在其他节点自动启动 → 对故障节点进行检修 |
| 存储节点宕机 |
执行 ceph -s 确认状态为 HEALTH_WARN → 检查mon/osd状态 → 进行网络或磁盘故障排查 |
8. 常见坑 12 例
- 在计算节点误装了
ceph-osd 包,导致CPU资源被后台scrub等任务抢占。
- 配置Ceph时,将公网(
public)和私网(cluster)的网段或掩码写反,导致OSD无法心跳,集群闪断。
- 使用千兆交换机承载存储流量,当发生数据恢复(recover)时,VM业务IOPS骤降,出现卡顿。
- 存储池的副本数(
size)设置为2,误拔一块硬盘即可能导致数据丢失。
- 启用了KRBD(内核RBD),但内核升级后未同步更新或加载相应模块,导致VM无法启动。
- 计算节点本地使用ZFS,但未配置SLOG(同步写日志)设备,ZFS的写放大效应冲高了RBD的写入延迟。
- 存储池的PG数量(
pg_num)设置过小,在集群扩容后触发PG分裂,此过程可能耗时数天,期间性能下降。
- 未关闭服务器swap,在内存压力大时OSD进程可能被OOM Killer终止。
- 只在一端(服务器或交换机)启用了Jumbo Frame,导致MTU不匹配,可能引起MON选举失败或网络性能不佳。
- 防火墙规则未放行Ceph所需的全端口(如6789, 6800-7300),导致OSD状态频繁
up/down。
- 虚拟机磁盘使用
virtio-scsi控制器但未开启iothread,导致4KB随机写性能下降可达40%。
- 在Stretch Mode下,仲裁站点断电后,忘记预先设置
tiebreaker_mon,导致整个Ceph集群卡在只读状态。
9. 小结与参考链接
采用计算与存储分离的架构后,您将获得一个更清晰、更灵活的基础设施:
- 故障域清晰,扩容不再被“绑定销售”所困扰。
- 性能可预测,网络和磁盘IO各自运行在专属通道上。
- 硬件迭代独立,CPU可能3-5年一换,而闪存硬盘可能5-7年一换,两者升级节奏互不影响。
如果您正计划从3节点的超融合架构升级到10+节点的生产私有云,分离式架构几乎是必然选择。遵循运维最佳实践,您可以先用本文的“3存储+2计算”模板搭建测试或小规模生产环境,验证流程,再根据业务需求横向扩展节点即可。
参考链接