k 与 m 决定开销
纠删码配置用两个数字描述冗余结构:k 是数据块数量,m 是校验块数量,两者之和是编码块总数。写入时对象被切成 k 份并据此算出 m 份校验,读取时凑齐其中任意 k 份即可还原,因此同时失效的块数不超过 m 时数据依然可用。空间开销倍率约等于 k 与 m 之和除以 k,例如 k 取 8、m 取 3 时约为 1.375 倍,而三副本方案是 3 倍。块数越多越省空间,参与一次读写或重建的节点也越多,延迟与恢复代价同步上升。
基本信息
| 适用平台 | 分布式存储的纠删码存储池 |
|---|---|
| 核心参数 | k 数据块数、m 校验块数 |
| 空间开销 | 约为 k 与 m 之和除以 k |
| 容错能力 | 允许同时丢失 m 个块 |
| 插件算法 | 常见 jerasure、isa、lrc、shec,各自带专属参数 |
| 绑定时机 | 建池时指定配置,事后修改受限 |
| 最小可写数 | 默认 k+1,取值范围从 k+1 到 k+m |
典型使用场景
- 容量紧张的归档与备份池:用较大的 k 值压低空间开销
- 可用性优先的业务:适当提高 m,允许更多块同时失效
- 跨机架部署规划:块总数决定所需故障域宽度,先数节点再定组合
- 容量评估:把节省的倍率换算成实际可写入的容量
- 核对既有池:确认配置与规划一致,避免被临时改动
配置查看与建池
配置查看与建池
ceph osd erasure-code-profile ls # 列出已有配置
ceph osd erasure-code-profile get myprofile # 查看 k、m 与插件参数
ceph osd erasure-code-profile set myprofile k=8 m=3 # 新建或覆盖配置
ceph osd pool create ecpool erasure myprofile # 建池时绑定该配置
ceph osd pool get ecpool min_size # 核对最小可写块数
ceph df detail # 对比池的可用与原始占用开销与容错对照
| 块组合 | 空间开销 | 可同时失效 |
|---|---|---|
| 2+1 | 约 1.5 倍 | 1 个块 |
| 4+2 | 约 1.5 倍 | 2 个块 |
| 8+3 | 约 1.375 倍 | 3 个块 |
| 8+4 | 约 1.5 倍 | 4 个块 |
| 10+4 | 约 1.4 倍 | 4 个块 |
理论倍率只是下限:归置组切分、未写满一个条带的对象、以及存储引擎自身的额外占用,都会让实际使用量高于计算值。做容量规划时留出余量,并用容量查看命令核对真实占用。
块总数决定故障域宽度:主机级故障域下需要不少于块总数的可用主机,否则选点会回退,同一台主机或同一机架内可能出现多个块,实际容错能力低于理论值。
小对象与覆盖写
纠删码对小对象不友好:不足一个条带的数据也要按整条带填充与计算校验,实际占用被放大,小文件密集的场景可能抵消掉节省的空间。需要频繁原地更新的上层组件还要额外依赖覆盖写支持,并对底层存储引擎有要求,是否可用以及具体限制以官方文档为准。
插件差异值得单独确认:部分算法依赖特定指令集才能发挥性能,本地恢复码一类插件还带有自己的额外参数,用于在机架内局部重建以降低跨域流量。选定组合前先阅读对应插件说明。