注意

本文档适用于 Ceph 的开发版本。

BlueStore 内部

小写入策略

  • U: 写入一个完整的、新的 blob,不压缩。

    • 写入到新的 blob

    • kv 提交

  • P: 写入一个现有的 blob 中未使用的区域,不压缩。

    • 写入到现有 blob 中未使用的块

    • kv 提交

  • W: WAL 覆盖写入:提交覆盖意图,然后异步覆盖。必须按 chunk_size = MAX(block_size, csum_block_size) 对齐。

    • kv 提交

    • wal 覆盖写入现有 blob(按块对齐)

  • N: 写入一个新的 blob,不压缩。初始利用率稀疏。未来的写入将是 PW

    • 写入到新的(稀疏)blob

    • kv 提交

  • R+W: 读取部分块,然后进行 WAL 覆盖写入。

    • 读取(到块边界)

    • kv 提交

    • wal 覆盖写入现有 blob(按块对齐)

  • C: 压缩数据,写入到新的 blob。

    • 压缩并写入到新的 blob

    • kv 提交

未来可能的模式

  • F: 通过将小块数据写入一个零散 blob(收集我们需要写入的随机、非连续数据位)来碎片化 lextent 空间。

    • 写入到零散 blob(min_alloc_size 或更大,但我们只使用其中的一个块)

    • kv 提交

  • X: 对单个块进行 WAL 读取/修改/写入(类似于旧版 bluestore)。没有校验和。

    • kv 提交

    • wal 读取/修改/写入

映射

这非常粗略地将写入类型映射到当我们遇到给定 blob 时所做的事情。在实践中,它会更复杂一些,因为可能需要考虑多个 blob(例如,我们可能能够对一个 blob 进行 W 操作,对另一个 blob 进行 P 操作),但这应该能传达大致的策略概念。

raw

raw (cached)

csum (4 KB)

csum (16 KB)

comp (128 KB)

128+ KB (over)write

U

U

U

U

C

64 KB (over)write

U

U

U

U

U or C

4 KB overwrite

W

P | W

P | W

P | R+W

P | N (F?)

100 byte overwrite

R+W

P | W

P | R+W

P | R+W

P | N (F?)

100 byte append

R+W

P | W

P | R+W

P | R+W

P | N (F?)

4 KB clone overwrite

P | N

P | N

P | N

P | N

N (F?)

100 byte clone overwrite

P | N

P | N

P | N

P | N

N (F?)

由 Ceph 基金会为您呈现

Ceph 文档是由非营利性 Ceph 基金会 资助和托管的社区资源。如果您希望支持这项工作和我们的其他努力,请考虑 立即加入