ceph bluestore 基本原理

October 21, 2017

磁盘里都放什么

BlueStore 用了三个分区。

OSD 启动时,BlueStore 的初始化过程是读 DB superblock,然后 reply bluefs journal,之后,DB 分区,WAL 分区以及 Block 分区中 bluefs 管理的内容都可以访问了,于是基于 bluefs db,db.wal 目录的 RocksDB 就可以初始化了,RocksDB 初始化后,对象的元数据载入了,Block 分区的空闲块列表也载入了,Bluestore 就可以开始对外服务了。

BlueStore 如何对外服务

基于磁盘存放的内容,我们可以猜想如何往 bluestore 写数据。Bluestore 对外提供的是k-v 接口。通过 RocksDB 里对象的元数据,找到或分配 key 对应的对象的物理块地址,先把对象内容写物理块,然后用 RocksDB 的 Transaction 把 journal 和其他元数据原子性写入磁盘。这里需要先写物理块是因为如果先写 RocksDB,由于 journal 里不会存对象的实际内容,只会存元数据,所以如果写 RocksDB 后进程挂了,那么实际上对象的数据并没有写入,但是 bluestore 已经认为对象修改成功了,导致对象旧数据丢失了,新数据未写入成功。而如果写物理块失败了,或者写成功了而 RocksDB 失败了,那么只需要保证新写的物理块不覆盖原来数据的物理块,因为对象引用的还是旧物理块,只需直到 RocksDB 的 Transaction 成功才返回成功,否则一直重试,这样就能保证写对象数据和元数据的原子性。

友情链接