基于CEPH—BlueStore与BCACHE应用研究

2018-09-29 05:46沈磊李凯林云
中国科技纵横 2018年16期

沈磊 李凯 林云

摘 要:为了实现基于ceph的BlueStore存储引擎在SSD和HDD混合模式场景下有更好的性能,本文提出了基于bcache提升ceph性能的解决方案。该方案是将bcache技术应用到BlueStore引擎解决方案中。通过实验验证,使用bcache可以让BlueStore在混合模式下发挥更好的性能。

关键词:CEPH;BlueStore;BCACHE

中图分类号:TP333 文献标识码:A 文章编号:1671-2064(2018)16-0038-02

1 引言

在分布式存储CEPH高速发展过程中诞生了filestore和bluestore存储引擎,filestore一开始只是对于机械盘进行设计的,没有专门针对ssd做优化考虑,因此诞生的bluestore初衷就是为了减少写放大,并针对ssd做优化,而且直接管理裸盘,从理论上进一步减少文件系统如ext4/xfs等部分的开销。然而,使用bluestore存储引擎抛弃了原有的journal机制。因此,本文提出使用bcache技术来提升bluestore存储引擎下SSD和HDD混合场景的最大性能。

2 BCACHE技术分析

bcache是linux内核块层cache。它使用类似SSD来作为HDD硬盘的cache,从而起到加速作用。HDD硬盘便宜并且空间更大,SSD速度快但更贵。bcache设计目标是等同于SSD。最大程度上去最小化写放大,并避免随机写。bcache将随机写转换为顺序写,首先写到SSD,然后回写缓存使用SSD缓存大量的写,最后将写有序写到磁盘或者阵列上。

bcache的优势在于可以将SSD资源池化,一块SSD可对应多块HDD,形成一个缓存池。bcache还支持从缓存池中划出瘦分配的纯flash卷(thin-flash lun)单独使用。一个cache pool包含一个journal,缓存所有未完成操作的连续日志。

bcache用B+树来管理缓存数据与HDD上数据块的对应关系,B+树所索引的k-v结构在bcache中称为bkey。

将一个缓存池中的多块HDD空间编址为一个地址空间;以HDD的id + IO请求的LBA为索引建立B+树;每个B+树的节点对应一个btree bucket,这个bucket里存的就是一个个的bkey;为每个btree bucket申请一块连续内存作为metadata缓存;利用Journal/WAL加速B+tree的修改, 写完journal以及内存中的B+tree节点缓存后写IO就可以返回了。

3 BlueStore技术分析

在BlueStore存储引擎中,没有了journal的机制,也抛开了文件系统层面,直接对裸盘进行读写;在默认的配置中将一个磁盘划分为两个分区,第一个分区100MB用于存储METDATA;第二个分区存储数据。

RocksDB:存储预写式日志、数据对象元数据、Ceph的omap数据信息、以及分配器的元数据。

BlueRocksEnv:与RocksDB交互的接口。

BlueFS:小文件系统,解决元数据、文件空间及磁盘空间的分配和管理,并实现了rocksdb::Env接口(存储RocksDB日志和sst文件)。

HDD:物理块设备,存储实际的数据。

3.1 元数据

在之前的存储引擎filestore里,对象的表现形式是对应到文件系统里的文件,默认4MB大小的文件,但是在bluestore里,已经没有传统的文件系统,而是自己管理裸盘,因此需要有元数据来管理对象,对应的就是Onode,Onode是常驻内存的数据結构,持久化的时候会以kv的形式存到rocksdb里。

在onode里又分为lextent,表示逻辑的数据块,用一个map来记录,一个onode里会存在多个lextent,lextent通过blob的id对应到blob(bluestore_blob_t),blob里通过pextent对应到实际物理盘上的区域(pextent里就是offset和length来定位物理盘的位置区域)。一个onode里的多个lextent可能在同一个blob里,而一个blob也可能对应到多个pextent。

另外还有Bnode这个元数据,它是用来表示多个object可能共享extent,目前在做了快照后写I/O触发的cow进行clone的时候会用到。

3.2 I/O处理

到达bluestore的I/O的offset和length都是对象内(onode)的,offset是相对于这个对象起始位置的偏移,在_do_write里首先就会根据最小分配单位min_alloc_size进行判断,从而将I/O分为对齐和非对齐的。

当一个写请求按照min_alloc_size进行拆分后,就会分为对齐写,对应到do_write_big,非对齐写(即落到某一个min_alloc_size区间的写I/O(对应到do_write_small)。

do_write_big

对齐到min_alloc_size的写请求处理起来比较简单,有可能是多个min_alloc_size的大小,在处理时会根据实际大小新生成lextent和blob,这个lextent跨越的区域是min_alloc_size的整数倍,如果这段区间是之前写过的,会将之前的lextent记录下来便于后续的空间回收。

do_write_small

在处理落到某个min_alloc_size区间的写请求时,会首先根据offset去查找有没有可以复用的blob,因为最小分配单元是min_alloc_size,默认64KB,如果一个4KB的写I/O就只会用到blob的一部分,blob里剩余的还能放其它的。

4 BlueStore与BCACHE应用

在使用Ceph BlueStore中使用SSD的方式主要有两种:cache tiering与OSD cache,众所周知,Ceph的cache tiering机制目前还不成熟,策略比较复杂,IO路径较长,在有些IO场景下甚至还会导致性能下降,promotion的粒度较大也有较多的负面影响。所以在SSD的使用上,我们选择了给OSD所在块设备加速的方式。

下面将基于bcache完成对ceph bluestore的支持。具体实施步骤如下:

(1)内核实施步骤:

Step1.内核源码开启bcache的支持。

Step2.拷贝当前环境的Module.symvers。

Step3.生成bcache.ko。

Step4.創建目录。

Mkdir /usr/lib/modules/$(uname -r)/kernel/drivers/md/bcache

Step5.拷贝ko。

cp /home/bcache.ko /usr/lib/modules/$(uname -r)/kernel/drivers/md/bcache

Step6.加载内核。

Step7.安装bcache-tools。

(2)bluestore实施步骤:

Step1.配置磁盘(图1)。

Step2.以manual形式部署ceph。如图2所示。

5 测试结果分析

本节将通过实验,主要针对混合磁盘采用bluestore存储引擎和bcache进行测试,证明通过bcache可以提升存储性能,比ceph自身的cache tier性能更优更稳定。

(1)实验平台配置。三台戴尔R720服务器构成实验的硬件平台,每个服务上安装Centos 7.3操作系统。服务器详细配置信息为:Intel 24核 2000MHZ的Xeon E5-2620 CPU,物理内存为196584M。(2)实验设计。3个节点通过千兆交换机连接,每个服务器既是计算节点也是存储节点;每个节点配置4个千兆网卡,1个400GB SSD和3个1TB 7200rpm SATA磁盘。(3)实验结果分析。使用fio测试bcache环境下三台服务器组成的集群能提供的最大IOPS,如图3所示。

使用fio测试使用cache tier模式下集群提供的最大IOPS,如图4所示。

6 结语

本文的重点是通过bcache与bluestore结合在SSD和HDD下如何得到最佳性能的解决方案。通过实验验证,得到以下结论:使用bcache可以在混合磁盘场景下提升bluestore存储引擎模式的整体性能,并且比ceoh自身提供的cache tier更优。

参考文献

[1]陈莉君.深入分析Linux内核源码[M].北京:人民邮电出版社,2002.

[2]杨洪波.高性能网络虚拟化技术研究[D].上海:上海交通大学,2012.