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