知识卡片

omap用header间接层压缩对象属性存储开销

专业/工作 · 514.a.1

内容

LevelDB 只是一维的扁平 KV 存储,而对象属性是”对象→多个属性名→值”的二维结构。如果直接拼接”对象名+属性名”作为 key,对象名(往往很长)会随每个属性重复存一遍,浪费空间。[[xattr与omap按大小热度分工存储元数据|omap]] 的实际做法是插入一层间接映射:先用对象标识查到一个短小的 header(内含一个全局递增的 seq 号),此后该对象的所有属性统一用 header.seq + 属性名 作为 key。查一次属性变成两步查找,换来的是长对象名只需要存一份,属性越多这份间接层摊薄的收益越大——用一次额外的查找换取消除大量重复前缀的存储浪费。

参考来源

《Ceph源码分析》第7章《本地对象存储》