ceph-luminous-bluestore

对比

1
2
3
4
5
6
7
8
9
10
11
ceph后端支持多种存储引擎,以插件化的形式来进行管理使用,目前支持filestore,kvstore,memstore以及bluestore

1)Firestore存在的问题是:
在写数据前需要先写journal,会有一倍的写放大;
若是另外配备SSD盘给journal使用又增加额外的成本;
filestore一开始只是对于SATA/SAS这一类机械盘进行设计的,没有专门针对SSD这一类的Flash介质盘做考虑。

2)而Bluestore的优势在于:
减少写放大;
针对FLASH介质盘做优化;
直接管理裸盘,进一步减少文件系统部分的开销。

Bluestore原理说明

1
2
3
对象可以直接存放在裸盘上,不需要任何文件系统接口。
BlueStore 直接使用一个原始分区,ceph对象将直接写在块设备上,不再需要任何的文件系统;
和osd一起进来的元数据将存储在 一个 名为 RocksDB 的键值对 数据库;

各层意义

1
2
3
4
RocksDB :存储 WAL 日志和元数据(omap)
BlueRocksEnv: 与RocksDB 交互的接口
BlueFS: 一个类似文件系统的 mini C++,使 rocksdb 生效,ENv 接口(存储 RocksDB 日志和 sst 文件);
因为rocksdb 一般跑在一个文件系统的上层,所以创建了 BlueFS。

RocksDB 存放的数据类型

1
2
3
4
对象的元数据
write-ahead 日志
ceph omap 数据
allocator metadata(元数据分配器):决定数据存放位置;此功能可插拔

默认BlueStore模型

1
2
3
第一个小分区(XFS或者ext4),包括ceph files 
(init system descriptor,status,id,fsid,keyring 等)和RocksDB 文件
第二个分区是一个原始分区

优点

1
每一部分都可以存放在不同的磁盘中,RocksDB WAL 和 DB 可以存放在不同的磁盘或者小分区中

添加osd

案例1

由于Luminous里默认使用Bluestore,可以直接操作裸盘,data和block-db会使用lv。综合成本及性能,我们把block.db使用ssd的分区,osd仍然使用sas,block.wal不指定. 这里vdb作为osd盘,vdc作为block-db盘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
首先ssh到各个存储节点,block.db使用的ssd分区,这里node1举例:
# ssh node1
# pvcreate /dev/vdb # 创建pv, 这里使用的整块磁盘(与后面的分区对比), pvs 查看pv列表
Physical volume "/dev/vdb" successfully created.
# vgcreate data_vg1 /dev/vdb # 创建vg, vgs查看vg列表
Volume group "data_vg1" successfully created
# lvcreate -n data_lv1 -L 1020.00m data_vg1 #创建lv,lvs查看lv列表, -n指定lv名称, -L指定lv的大小,需要小于或者等于vg的VSize
Logical volume "data_lv1" created.

---------------------------------------------
生产环境一块ssd磁盘会对应多块osd,所以这里也需要把ssd多个分区
# parted /dev/vdc
(parted) mklabel gpt
(parted) mkpart primary 0% 25% #因为测试,这里只做了一个占据磁盘25%容量的分区,实际情况根据osd数目划分相应的分区数
(parted) quit
# pvcreate /dev/vdc1 # 创建pv, 这里使用的是磁盘分区, pvs 查看pv列表
Physical volume "/dev/vdc1" successfully created.
# vgcreate block_db_vg1 /dev/vdc1 # 创建vg, vgs查看vg列表
Volume group "block_db_vg1" successfully created
# lvcreate -n block_db_lv1 -L 1020.00m block_db_vg1 # 创建lv, lvs查看lv列表, -L指定lv的大小,需要小于或者等于 vg的VSize
Logical volume "block_db_lv1" created.

---------------------------------------------
# 不需要加--bluestore 参数,默认就是使用bluestore方式,data_vg1/data_lv1 是数据盘,block_db_vg1/block_db_lv1是block-db
管理节点执行:
ceph-deploy --overwrite-conf osd create node1 --data data_vg1/data_lv1 --block-db block_db_vg1/block_db_lv1
ceph-deploy --overwrite-conf osd create node2 --data data_vg1/data_lv1 --block-db block_db_vg1/block_db_lv1

案例2

创建具有3个逻辑卷的OSD(模拟不同类型的存储介质)

1
2
3
4
5
6
7
8
9
10
#pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
#vgcreate ceph-pool /dev/sdb
Volume group "ceph-pool" successfully created
#lvcreate -n osd0.wal -L 1G ceph-pool
Logical volume "osd0.wal" created.
# lvcreate -n osd0.db -L 1G ceph-pool
Logical volume "osd0.db" created.
# lvcreate -n osd0 -l 100%FREE ceph-pool
Logical volume "osd0" created.

完成逻辑卷的创建后我们就可以创建 OSD 了。

1
2
3
4
5
ceph-deploy osd create \
--data ceph-pool/osd0 \
--block-db ceph-pool/osd0.db \
--block-wal ceph-pool/osd0.wal \
--bluestore node1

wal& db 的大小问题

1
2
3
在 ceph bluestore 的情况下,wal 是 RocksDB 的write-ahead log, 相当于之前的 journal 数据,db 是 RocksDB 的metadata 信息。在磁盘选择原则是 block.wal > block.db > block。当然所有的数据也可以放到同一块盘上。
默认情况下, wal 和 db 的大小分别是 512 MB 和 1GB,现在没有一个好的理论值,好像和 ceph 本身承载的数据类型有关系。
值得注意的是,如果所有的数据都在单块盘上,那是没有必要指定 wal &db 的大小的。如果 wal & db 是在不同的盘上,由于 wal/db 一般都会分的比较小,是有满的可能性的。如果满了,这些数据会迁移到下一个快的盘上(wal - db - main)。所以最少不会因为数据满了,而造成无法写入。
Donate