Ceph 容量规划:副本 vs EC 怎么选
副本(replication)和纠删码(EC)是 Ceph 两种数据保护机制。新人最纠结的就是怎么选。本文给一个决策框架。
一图概括
| 维度 | 3 副本 | EC 4+2 | EC 8+3 |
|---|---|---|---|
| 空间利用率 | 33% | 67% | 73% |
| 容忍失败 OSD | 2 个 | 2 个 | 3 个 |
| 写性能 | 高 | 中 | 低 |
| 读性能 | 高 | 中 | 中 |
| 修复速度 | 快 | 中 | 慢 |
| CPU 开销 | 低 | 高 | 高 |
| 小对象友好 | 是 | 否 | 否 |
选副本的场景
- 块存储 RBD(VM 盘、数据库):高 IOPS、小 IO,必须副本
- CephFS 热数据池:小文件多,EC 性能跌得厉害
- 小集群(OSD < 30):EC 性能开销占比太大
选 EC 的场景
- 对象存储 RGW 冷桶:大对象、读为主
- 备份/归档:写入一次、几乎不读
- 大集群存视频/影像:对象大且数量少
EC 怎么选 K+M
- K+M 不能超过 host 数(默认 failure domain=host)
- K 越大空间利用率越高,但修复越慢
- M 决定能挂多少 OSD
我的默认:
- 中等集群(30-50 OSD):EC 4+2,平衡空间和性能
- 大集群(>100 OSD):EC 8+3,最佳空间利用
一个新手陷阱:混合 pool
很多人想"热数据副本池、冷数据 EC 池,自动迁移"——这叫 cache tier。Reef 之后官方已经 deprecated cache tier,不再推荐用。
替代方案:
- RGW 桶级 storage class,新对象写入 EC 池
- 应用层冷热分离(用户访问频次驱动)
实际数据规划公式
裸容量 = 业务数据 ÷ 利用率 ÷ 平均使用率(0.7)
例:要存 100TB 业务数据,用 EC 4+2
裸容量 = 100 / 0.67 / 0.7 ≈ 213 TB
那 0.7 哪来的?Ceph 推荐 OSD 使用率 ≤70%,超过会触发 backfillfull 限制写入。
极端但有用的组合
临时数据池(如 K8s emptyDir 持久化):
ceph osd pool create tmp 32 32 replicated
ceph osd pool set tmp size 2
ceph osd pool set tmp min_size 1
size=2/min_size=1 在生产是反模式(容易丢数据),但临时数据可接受,省一倍空间。
教训:选 EC 前先用 rados bench 在你的硬件上跑一遍——纸面性能和实际差距经常很大。