导航:首页 > 源码编译 > bluestore源码分析

bluestore源码分析

发布时间:2022-12-27 17:00:37

❶ BlueStore 架构及原理分析

Ceph 底层存储引擎经过了数次变迁,目前最常用的是 BlueStore,在 Jewel 版本中引入,用来取代 FileStore。与 FileStore 相比,Bluesore 越过本地文件系统,直接操控裸盘设备,使得 I/O 路径大大缩短,提高了数据读写效率。并且,BlueStore 在设计之初就是针对固态存储,对目前主力的 SATA SSD 有着更好的支持(相比 FileStore),同时也支持 Nvme SSD 超高速固态。在数据的处理上,BlueStore 选择把元数据和对象数据分开存储,使用高速设备来保存元数据,能够起到性能优化作用。

书中介绍了块、COW、RWM 等内容,这里也直接拿来主义。

基于以上设计,BlueStore 的写策略综合运用直接写、COW 和 RMW 策略。
注意:

再结合图1.1 ceph_bluestore 架构图,我们需要引入第二层观念:

Ceph 较新版本中,把 设备 模块单独放到 blk 文件夹中。

后续还有 pmem、spdk、zoned 设备,这里不再列出

aio 封装了 lio 相关操作,具体有三个结构:
• aio_t:一次 io 操作,pwrite,pread,不写到磁盘
• io_queue_t:io 提交队列,基本不使用,只用作基类
• aio_queue_t:继承自 io_queue_t,提交 io 操作,真正在此写入磁盘

简单介绍 ceph 中 lio 使用流程:

相关方法有:
init():初始化
shutdown():关闭
pwritev():预备写,后续通过 submit_batch() 完成实际写入磁盘操作
preadv():预备读,后续通过 submit_batch() 完成实际写入磁盘操作
submit_batch():按批次提交 io 任务
get_next_completed():获取已经完成 IO 的 aio_t,用于 aio_thread() 回调函数

BlockDevice 是所有块设备的基类,定义了块设备必备的一些接口,比如 read、write等。在 src/blk/BlockDevice.h 中还定义了 IOContext,用作封装传递 io 具体操作,其中保存着每次 aio 操作的list:pending_aios 和 running_aios,前者表示等待队列,后者表示正在 io 操作的队列,同时还创建两个原子数分别用于表示这两个队列中 aio_t 的数量。
BlockDevice提供创建块设备实例的接口,通过识别 device_type 来创建不同的块设备,如 kernel device。
BlockDevice BlockDevice::create(
CephContext
cct, const string& path, aio_callback_t cb,
void *cbpriv, aio_callback_t d_cb, void *d_cbpriv);
->
create_with_type(device_type, cct, path, cb, cbpriv, d_cb, d_cbpriv);
-> 根据类型创建 device
new KernelDevice(cct, cb, cbpriv, d_cb, d_cbpriv)
-> 创建以下线程
aio_thread:
discard_thread
aio_thread :作用1. 感知已经完成的 io。2. 唤醒等待的 io 或者调用回调函数,具体根据IOContext创建时是否提供了 priv 参数(BlueStore 指针)来决定使用哪种操作,如果提供了,则调用回调函数BlueStore::TransContext::aio_finish()或者BlueStore::DeferredBatch::aio_finish()(根据AioContext 类型)。
discard_thread :这是针对 SSD discard 操作的线程,可以通过 cat /sys/block/sda/queue/discard_granularity 命令查看设备是否支持 discard 操作。discard 在 bluestore 中 分为两步:第一步:BlkDev{fd_directs[WRITE_LIFE_NOT_SET]}.discard((int64_t) offset, (int64_t) len); 调用系统函数对指定位置做 discard。第二步:discard_callback() 回调 shared_alloc.a->release(),告诉 Allocater 需要回收的部分(标记为 free)。

mkfs 作用是在磁盘第一次使用 bluestore 时,写入一些用户指定的配置到磁盘第一个块——超级块(大小可配置,一般为: BDEV_LABEL_BLOCK_SIZE 4096),这样后续使用该磁盘时,可以直接读取配置项。 之所以需要固化这些配置项,是因为 bluestore 使用不同的配置项对于磁盘数据的组织形式不同,如果前后两次上电使用不同的配置项访问磁盘数据有可能导致数据发生永久损坏。对已经 mkfs 过的磁盘再次使用该函数,则会对磁盘做一次 meta 数据检查。
以下为 LABEL_BLOCK 块中存储的数据,主要有 osd id、设备大小、生日时间、设备描述以及一组元数据 map。

mkfs() 主要是初始化 bluestore_bdev_label_t,并写入到磁盘的第一个4K块中,同时建立块设备链并预分配指定大小的空间。同时BlueStore层次的mkfs()里面调用了Bluefs的Bluefs::mkfs(),并且也固化了bluefs的信息位于磁盘的第二个4K块。
以下给出mkfs详细步骤。

开启块设备。此函数用于创建block设备实例(slow设备),并初始化某些配置。WAL和DB设备由BlueFS自行管理,不在此处开启。
BlockDevice:create()函数在2.2节中详细介绍过了,主要作用是打开块设备,获取句柄,用于后续的数据读写操作。
discard用于SSD设备的空间回收,其作用在2.2节中介绍过。
_set_max_defer_interval()设置了max_defer_interval参数,此参数的作用是在MempoolThread线程中定时提交延迟写(try->deferred_try_submit()),默认为3。
set_cache_size()从配置中获取所有cache相关的参数,包括cache总空间,onode内存使用比率、kvdb内存使用比率、hdd、ssd内存使用比率等。

阅读全文

与bluestore源码分析相关的资料

热点内容
服务器地址跟踪 浏览:978
免费google云服务器 浏览:516
摘译和编译的英文 浏览:359
热泵压缩机选型 浏览:121
op手机微信加密如何解除 浏览:386
如何在王牌战争找到高爆率服务器 浏览:13
江浙小学语文辅导课用什么APP 浏览:99
新梦幻大陆服务器地址 浏览:241
网吧服务器怎么更换壁纸 浏览:530
linux命令方法 浏览:332
linux下载freetype 浏览:123
程序员入驻平台 浏览:327
程序员大战外挂 浏览:745
html实例教程pdf 浏览:157
linux命令开放所有权限 浏览:575
30岁能学会编程 浏览:737
小火箭的服务器是什么 浏览:967
cad查信息命令 浏览:402
XP禁止新建文件夹 浏览:394
程序员的悲惨生活 浏览:207