注意
本文档适用于 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,不压缩。初始利用率稀疏。未来的写入将是 P 或 W。
写入到新的(稀疏)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?) |