项目愿景与目标

核心目标:优化纠删码(EC)池的I/O性能,使其接近复制池的性能表现

主要目标

  • 降低总体拥有成本(TCO)
  • 让纠删码池在块存储和文件存储场景下更具可行性

启用优化的EC功能

重要注意事项

  • 默认关闭:所有优化功能默认处于关闭状态
  • 逐池启用:可以为每个存储池单独开启优化
  • ⚠️ 不可逆操作:一旦启用优化功能,就无法关闭
  • 版本要求:所有OSD、MON和MGR必须升级到Tentacle或更高版本
  • 向后兼容:与旧版本客户端保持兼容

配置方法

为单个池启用优化

1
ceph osd pool set <pool_name> allow_ec_optimizations true

为新池默认启用优化

1
2
[mon]
osd_pool_default_flag_ec_optimizations = true

关键技术特性

已实现的核心功能

  • 部分读取(Partial Reads)
  • 部分写入(Partial Writes)
    • 注意:未写入的分片不进行元数据处理
  • 奇偶校验增量写入(Parity Delta Writes)
    • 支持per-IO自动切换写入方法
  • 更大的默认块大小
  • 直接读取(Direct Read)
  • 直接写入(Direct Write)

新增重要特性

1. 空间高效的小对象存储

场景:16KB块大小,4+2 EC配置

方式 4KB对象空间消耗 空间效率
传统方式 96KB 基准
优化后 12KB 8倍提升

2. 空间高效的稀疏写入

场景:16KB块大小,4+2 EC配置,对象>64KB,写入偏移40KB

方式 4KB写入空间消耗 空间效率
传统方式 96KB 基准
优化后 12KB 8倍提升

重要性:这对RBD(RADOS块设备)特别重要

3. 重平衡改进

传统方式问题

  • 需要读取所有数据分片
  • 恢复操作包括日志恢复和重平衡

优化后改进

  • 仅从旧OSD读取必要数据
  • 写入操作保持最优状态
  • 显著提高重平衡效率

4. 深度清理增强

技术原理

  • 利用CRC数学特性和通用EC技术
  • 从数据CRC计算编码CRC
  • 能够识别单个损坏的分片(当m>1时)
  • 分片CRC无需存储在元数据中
  • 新增"部分"分片的元数据检查

贡献者:感谢Jon Bailey的贡献

性能表现

读取性能

  • 随机读性能:4KB随机读性能提升3-4倍
  • 对比:虽然仍未达到3副本的性能,但已具备竞争力

4KB工作负载性能分析

  • 块大小:推荐设置为16KB
  • k值影响:k值对性能影响较小
  • 延迟:仍高于副本模式
  • 限制因素
    • 缺乏写缓存无法隐藏读-修改-写操作的延迟
    • 直接读取可能改善延迟和吞吐量

随机读写性能(70:30比例)

  • 通用改进:所有工作负载都显示出性能提升
  • 大IO优势:大对象工作负载也有明显改善,虽然提升幅度相对较小

配置建议

最佳实践

  • 推荐块大小:16KB
  • k值选择:对性能影响较小,可根据容错需求选择
  • 延迟优化:考虑启用直接读取功能
  • 适用场景:特别适合RBD和需要高空间效率的场景

性能权衡

  • 读-修改-写操作延迟仍然存在
  • 相比3副本模式,延迟略高但空间效率显著提升
  • 总体性能提升明显,使纠删码池在更多场景下可行

总结

Ceph Tentacle版本的纠删码增强主要解决了以下问题:

  1. 空间效率:小对象和稀疏写入场景下的空间浪费
  2. 性能提升:显著提升整体I/O性能
  3. 运维效率:改进重平衡和深度清理机制
  4. 应用场景扩展:使纠删码池在块存储和文件存储场景下更具可行性

这些改进使得纠删码池成为在成本和性能之间取得良好平衡的存储解决方案。

原文

https://ceph.io/assets/pdfs/events/2025/ceph-day-london/04%20Erasure%20Coding%20Enhancements%20for%20Tentacle.pdf