Ceph Jewel版本的一个重大更新是开始支持使用bluestore作为objectstore,用于代替之前的filestore。与filestore最大的不同是,bluestore可以直接读写磁盘,即对象数据是直接存放在裸设备上的,这样解决了一直被抱怨的数据双份写的问题。需要说明的是,bluestore尚处于开发阶段,Jewel虽然已经集成,但还是处于试验阶段,应该要到L版才能真正生产可用。
原理:
Bluestore直接使用一个原始分区来存放ceph对象数据,不再需要任何文件系统,也就是说一个OSD对应一个裸分区;而OSD的元数据存放在一个名为RocksDB的键值对数据库中。
默认的Bluestore数据存放模型:
一个OSD对应一个磁盘,磁盘的
第一个分区:默认只有100MB,XFS文件系统,用于存放osd相关的 ceph_fsid、fsid、keyring等,并且其中包含一个名为block的软连接,用于指向第二个分区,默认挂载到/var/lib/ceph/osd/ceph-X位置。
第二个分区:原始分区,第一个分区中的block软连接指向的就是这个分区,这个分区是真正存放对象数据的分区。
RocksDB存放的数据类型:
对象的元数据
write-ahead日志
ceph omap数据
allocator metadata(元数据分配器):决定数据存放位置
注:RocksDB的WAL和DB可以通过配置存在在不同的磁盘或者小分区中。
环境搭建
1、先搭建Mon,这个可以参考社区文档,这里就不多介绍了。
2、创建Bluestore的OSD。
2.1 编辑ceph.conf,在osd这个section指明如下配置:
osd data = /var/lib/ceph/osd/$cluster-$id
cluster_network = 172.31.0.0/16
public_network = 172.31.0.0/16
osd mon heartbeat interval = 30
osd max scrubs = 1
osd scrub begin hour = 0
osd scrub end hour = 24
osd recovery op priority = 2
osd recovery max chunk = 1048576
osd recovery threads = 1
osd crush update on start = true
osd scrub sleep = 0.1
osd scrub chunk max = 5
osd deep scrub stride = 1048576
enable experimental unrecoverable data corrupting features = bluestore rocksdb
bluestore fsck on mount = true
bluestore block db size = 67108864
bluestore block wal size = 134217728
bluestore block size = 5368709120
osd objectstore = bluestore
bluestore = true
最重要的是红色部分。
2.2 准备磁盘
ceph-disl list 可以列出该节点所有的磁盘,确定用于OSD的磁盘,删除磁盘上的分区(ceph-disk或者parted都可以),下面以/dev/vdb为例说明。
2.3 ceph-disk prepare磁盘
ceph-disk prepare --bluestore /dev/vdb
幸运的话,执行完这条命令,新建的OSD已经up和in了,用ceph -s可以看到新建的osd,另外通过df -h可以看到新挂载的小分区。视磁盘大小,这条命令可能需要几十秒到几分钟的时间。
2.4激活磁盘
如果2.3 osd没有up的话,可以通过这一步激活磁盘.
ceph-disk activate /dev/vdb1
注意,这里需要指明的是那个小分区。正常情况下,执行完这条命令osd应该已经up。
2.5 添加其他OSD
重复执行2.2-2.4添加其他OSD。
虽然Bluestoe尚没有达到生产可用的状态,但有必要对此做一些跟进和了解。另外,后续如果可以用物理环境测试一下其性能。