BlueStore模块介绍
BlueStore整体架构如下:
图1
RocksDBStore:封装了rocksdb。BlueStore中的元数据持久化到rocksdb,BlueStore的事物依赖rocksdb实现。
BlueFS:为对接rocksdb实现的最小文件系统,通过File、Dir、FileWriter、FileReader实现文件读取。BlueFS可以管理3类磁盘设备,分为BDEV_WAL、BDEV_DB、BDEV_SLOW。
Allocator:磁盘空间分配器,BlueStore最小分配单元为4k(SSD),64k(HDD),BlueFS最小分配单元为1M。默认实现为BitmapAllocator,还有StupidAllocator、AvlAllocator、HybridAllocator、ZonedAllocator等选择,通过配置bluestore_allocator和bluefs_allocator来修改。
KernelDevice:磁盘设备。默认实现为BlockDevice,还有PMEMDevice、NVMEDevice等选择。
BlueStore元数据
BlueStore直接管理裸设备,没有文件系统,操作系统的page cache使用不上,所以需要自己管理元数据和数据的缓存。其管理结构如下:
图2
Collection:即OSD层的PG,数目比较少,全部缓存在coll_map unordered_map中。以前缀PREFIX_COLL持久化在db中。
Onode:对象元数据,部分缓存,存在Collection的OnodeSpace unordered_map中,默认使用lru。以前缀PREFIX_OBJ持久化在db中。
Extent:逻辑空间的off,len属性,对应Blob上的一片逻辑空间。
Blob:物理空间和逻辑空间的转换层,将物理空间上一片不连续的空间转为连续的逻辑空间。
pextent:物理空间的off,len属性,对应盘上真实空间。
Buffer:对象数据,部分缓存,以offset为key存在SharedBlob的BufferSpace map中,默认使用2q管理
BlueStore写状态机
BlueStore的写分为正常写和Deferred写,也有可能2者结合,如下图所示:
图3 Write
图4 DeferredWrite
- STATE_PREPARE:待提交事物TransContext txc刚创建的状态。如果有未提交的aio,则设置状态为AIO_WAIT,同时提交aio。
- STATE_AIO_WAIT:通过osr保序aio。设置状态为IO_DONE。
- STATE_IO_DONE:设置状态为KV_QUEUED。将事物放入kv_queue,待线程bstore_kv_sync处理。
- STATE_KV_QUEUED:线程bstore_kv_sync将kv_queue中的事物放入kv_committing,然后再向db提交其中的事物,设置状态为KV_SUBMITTED,然后sync一次,最后放入kv_committing_to_finalize,待线程bstore_kv_final处理。
- STATE_KV_SUBMITTED:线程bstore_kv_final从kv_committing_to_finalize取出事物,设置状态为KV_DONE,将事物放入finisher队列,等待cfin线程回调。
- STATE_KV_DONE:如果有deferred io,将状态置为DEFERRED_QUEUED,将osr放入deferred_queue;否则,将状态置为FINISHING。
- STATE_DEFERRED_QUEUED:提交deferred的io,写入完后从deferred_queue移除,将状态置为DEFERRED_CLEANUP,然后将DeferredBatch放入deferred_done_queue队列,线程bstore_kv_sync取出来清理db中的deferred信息,然后放入deferred_stable_to_finalize,线程bstore_kv_final取出来进行clean清理以及析构DeferredBatch。
- STATE_DEFERRED_CLEANUP:设置状态为FINISHING。
- STATE_FINISHING:设置状态为DONE,从osr队列中摘掉。
- STATE_DEFERRED_DONE:事物完成。