BlueFS
Bluefs是一个简易的日志型文件系统,它恰倒好处地实现了RocksDB::env所定义的接口。
关于RocksDB::Env 是用来固化RocksDB运行过程中产生的.sst(Sorting string table,有序字符串表,键值对的磁盘存储形式)和.log(wal:write ahead log)文件。因为日志文件的功能是为了提升磁盘的写速度,所以在BlueFs的设计上支持将.sst和.log文件分开存储,以方便将.log文件单独使用速度更快的固态存储设备例如NVMSSD或者NVRRAM存储。
BlueFs将整个BlueStore的存储空间分为三个层次 :
- 慢速(Slow)空间
主要用于存储对象数据,可由普通大容量机械盘提供,由BlueStore自行管理
- 高速(DB)空间
存储BlueStore内部产生的元数据,可由普通SSD提供,需求小于(慢速空间)。
- 超高速(WAL)空间
主要存储RocksDB内部产生的.log文件,可由SSD或者NVRAM等时延相较普通SSD更小的设备充当。容量需求和(高速空间)相当,同样由BlueFs直接管理。
这里普及一下BlueStore相关的内容:BlueStore最早在Jewel版本中引入,用于取代传统的fileStore,作为新一代高性能对象存储后端。同时,它也考虑了未来的效率,同样会适配全ssd以及NVME SSD闪存,内部的存储中将高效索引的元数据引擎LevelDB 替换为RocksDB。
这里的性能提升主要是之前的FileStore存储后端是通过操作系统自带的本地文件系统间接管理磁盘,所以所有针对Rados(ceph的核心底层,具有自愈、自管理的智能存储节点构建的高可靠、自治、分布式对象存储系统)的对象操作,都需要预先转换为能够被本地文件系统是被、符合posi语义的文件操作,这个过程效率较低。而BlueStore性能提升主要有两个方面:第一个也是最根本的原因 它选择直接向对象操作,从而大大得缩短了io路径;第二个是BuleStore选择将元数据和用户数据严格分离,因此BlueStore中的元数据可以单独采用高速固态存储设备例如 NVME SSD。
DB WAL分区
BlueStore选择将DB 和WAL 分区交给BlueFs来使用,此时这两个分区分别存储BlueStore后端产生的元数据和日志文件,这样整个存储系统通过元数据对数据的操作效率极高,同时通过日志事务来维持系统的稳定性,整个系统相对来说稳定性就极高。
具体DB WAL工作过程是如何通过BlueFs来组织的,一些实现上的细节建议大家阅读ceph:BlueFs.cc以及由中兴ceph团队写的书籍《ceph设计原理与实现》
接下来说说如何在实际过程中进行如何将ceph的rados的后台db wal分区的部署在ssd上
部署前提:
- 拥有ceph 环境
ceph -s
查看 - 存储设备上拥有至少1块hdd存储,以及一块ssd固态存储盘
以下是我较为麻烦的手动操作,大家可以将这些部署命令转换为脚本,也是我接下来要写的脚本代码
开始:
sgdisk -n 1:+2G:+50G /dev/sdv
sgdisk -n 2:0:+2G /dev/sdv
第一个命令是对盘符为sdv的固态ssd盘进行db分区的创建(可以通过lsblk查看ssd的盘符),大小为50G,这里的大小可以自行设定。当然在创建之前也要考虑好wal分区的大小,将以上第一个命令的+2G,改为你设定的大小。接着执行第二个,这个是要做为wal分区,所有开始数字为2,最后设定的大小为2G,执行好之后 可以通过命令
lsblk
来查看结果,如下:
sdv 65:80 0 447.1G 0 disk
鈹溾攢sdv1 65:81 0 50G 0 part
鈹溾攢sdv2 65:82 0 2G 0 part
如果没有显示分区,不用着急,先试着刷一下分区表使用命令partprobe
接着:
chown ceph:ceph /dev/sdv1
chown ceph:ceph /dev/sdv2
chmod 660 /dev/sdv1
chmod 660 /dev/sdv2
更改这两个分区的用户组合组权限,使得/dev/sdv的盘支持ceph集群中所有用户的读写,即同一ceph集群中的其他节点设备也可以将元数据和日志文件存储在该节点的ssd盘上.最后想要确认一下结果可以
ls -l
查看一下
[root@node1 ~]# ls -l /dev/sdv1
brw-rw---- 1 ceph ceph 65, 81 Oct 26 19:29 /dev/sdv1
接着:
ceph-disk -v prepare /dev/sdb --block.db /dev/sdv1 --block.wal /dev/sdv2
ceph-disk -v activate /dev/sdb1
这里主要是对磁盘进行准备和激活,可以通过命令看出,我们将/dev/sdb/的元数据的db文件指向sdv1,日志的wal文件指向sdv2存储
最后的结果应该是拥有ceph的osd挂载点,同时osd是up状态.以下是我20块hdd盘每五个将db 和wal指向一个ssd作出的结果
sdb 8:16 0 5.5T 0 disk
鈹溾攢sdb1 8:17 0 100M 0 part /var/lib/ceph/osd/ceph-0
鈹斺攢sdb2 8:18 0 5.5T 0 part
sdc 8:32 0 5.5T 0 disk
鈹溾攢sdc1 8:33 0 100M 0 part /var/lib/ceph/osd/ceph-1
鈹斺攢sdc2 8:34 0 5.5T 0 part
sdd 8:48 0 5.5T 0 disk
鈹溾攢sdd1 8:49 0 100M 0 part /var/lib/ceph/osd/ceph-2
鈹斺攢sdd2 8:50 0 5.5T 0 part
sde 8:64 0 5.5T 0 disk
鈹溾攢sde1 8:65 0 100M 0 part /var/lib/ceph/osd/ceph-3
鈹斺攢sde2 8:66 0 5.5T 0 part
sdf 8:80 0 5.5T 0 disk
鈹溾攢sdf1 8:81 0 100M 0 part /var/lib/ceph/osd/ceph-4
鈹斺攢sdf2 8:82 0 5.5T 0 part
sdg 8:96 0 5.5T 0 disk
鈹溾攢sdg1 8:97 0 100M 0 part /var/lib/ceph/osd/ceph-5
鈹斺攢sdg2 8:98 0 5.5T 0 part
sdh 8:112 0 5.5T 0 disk
鈹溾攢sdh1 8:113 0 100M 0 part /var/lib/ceph/osd/ceph-6
鈹斺攢sdh2 8:114 0 5.5T 0 part
sdi 8:128 0 5.5T 0 disk
鈹溾攢sdi1 8:129 0 100M 0 part /var/lib/ceph/osd/ceph-7
鈹斺攢sdi2 8:130 0 5.5T 0 part
sdj 8:144 0 5.5T 0 disk
鈹溾攢sdj1 8:145 0 100M 0 part /var/lib/ceph/osd/ceph-8
鈹斺攢sdj2 8:146 0 5.5T 0 part
sdk 8:160 0 5.5T 0 disk
鈹溾攢sdk1 8:161 0 100M 0 part /var/lib/ceph/osd/ceph-9
鈹斺攢sdk2 8:162 0 5.5T 0 part
sdl 8:176 0 5.5T 0 disk
鈹溾攢sdl1 8:177 0 100M 0 part /var/lib/ceph/osd/ceph-10
鈹斺攢sdl2 8:178 0 5.5T 0 part
sdm 8:192 0 5.5T 0 disk
鈹溾攢sdm1 8:193 0 100M 0 part /var/lib/ceph/osd/ceph-11
鈹斺攢sdm2 8:194 0 5.5T 0 part
sdn 8:208 0 5.5T 0 disk
鈹溾攢sdn1 8:209 0 100M 0 part /var/lib/ceph/osd/ceph-12
鈹斺攢sdn2 8:210 0 5.5T 0 part
sdo 8:224 0 5.5T 0 disk
鈹溾攢sdo1 8:225 0 100M 0 part /var/lib/ceph/osd/ceph-13
鈹斺攢sdo2 8:226 0 5.5T 0 part
sdp 8:240 0 5.5T 0 disk
鈹溾攢sdp1 8:241 0 100M 0 part /var/lib/ceph/osd/ceph-14
鈹斺攢sdp2 8:242 0 5.5T 0 part
sdq 65:0 0 5.5T 0 disk
鈹溾攢sdq1 65:1 0 100M 0 part /var/lib/ceph/osd/ceph-15
鈹斺攢sdq2 65:2 0 5.5T 0 part
sdr 65:16 0 5.5T 0 disk
鈹溾攢sdr1 65:17 0 100M 0 part /var/lib/ceph/osd/ceph-16
鈹斺攢sdr2 65:18 0 5.5T 0 part
sds 65:32 0 5.5T 0 disk
鈹溾攢sds1 65:33 0 100M 0 part /var/lib/ceph/osd/ceph-17
鈹斺攢sds2 65:34 0 5.5T 0 part
sdt 65:48 0 5.5T 0 disk
鈹溾攢sdt1 65:49 0 100M 0 part /var/lib/ceph/osd/ceph-18
鈹斺攢sdt2 65:50 0 5.5T 0 part
sdu 65:64 0 5.5T 0 disk
鈹溾攢sdu1 65:65 0 100M 0 part /var/lib/ceph/osd/ceph-19
鈹斺攢sdu2 65:66 0 5.5T 0 part
sdv 65:80 0 447.1G 0 disk
鈹溾攢sdv1 65:81 0 50G 0 part
鈹溾攢sdv2 65:82 0 2G 0 part
鈹溾攢sdv3 65:83 0 50G 0 part
鈹溾攢sdv4 65:84 0 2G 0 part
鈹溾攢sdv5 65:85 0 50G 0 part
鈹溾攢sdv6 65:86 0 2G 0 part
鈹溾攢sdv7 65:87 0 50G 0 part
鈹溾攢sdv8 65:88 0 2G 0 part
鈹溾攢sdv9 65:89 0 50G 0 part
鈹斺攢sdv10 65:90 0 2G 0 part
sdw 65:96 0 447.1G 0 disk
鈹溾攢sdw1 65:97 0 50G 0 part
鈹溾攢sdw2 65:98 0 2G 0 part
鈹溾攢sdw3 65:99 0 50G 0 part
鈹溾攢sdw4 65:100 0 2G 0 part
鈹溾攢sdw5 65:101 0 50G 0 part
鈹溾攢sdw6 65:102 0 2G 0 part
鈹溾攢sdw7 65:103 0 50G 0 part
鈹溾攢sdw8 65:104 0 2G 0 part
鈹溾攢sdw9 65:105 0 50G 0 part
鈹斺攢sdw10 65:106 0 2G 0 part
sdx 65:112 0 447.1G 0 disk
鈹溾攢sdx1 65:113 0 50G 0 part
鈹溾攢sdx2 65:114 0 2G 0 part
鈹溾攢sdx3 65:115 0 50G 0 part
鈹溾攢sdx4 65:116 0 2G 0 part
鈹溾攢sdx5 65:117 0 50G 0 part
鈹溾攢sdx6 65:118 0 2G 0 part
鈹溾攢sdx7 65:119 0 50G 0 part
鈹溾攢sdx8 65:120 0 2G 0 part
鈹溾攢sdx9 65:121 0 50G 0 part
鈹斺攢sdx10 65:122 0 2G 0 part
sdy 65:128 0 447.1G 0 disk
鈹溾攢sdy1 65:129 0 50G 0 part
鈹溾攢sdy2 65:130 0 2G 0 part
鈹溾攢sdy3 65:131 0 50G 0 part
鈹溾攢sdy4 65:132 0 2G 0 part
鈹溾攢sdy5 65:133 0 50G 0 part
鈹溾攢sdy6 65:134 0 2G 0 part
鈹溾攢sdy7 65:135 0 50G 0 part
鈹溾攢sdy8 65:136 0 2G 0 part
鈹溾攢sdy9 65:137 0 50G 0 part
鈹斺攢sdy10 65:138 0 2G 0 part
查看osd状态,这些是我已经创建好crush map 后的,本应该是显示up状态,在crush map之外
-1 20.00000 root default
-7 5.00000 host host1
0 hdd 1.00000 osd.0 up 1.00000 1.00000
1 hdd 1.00000 osd.1 up 1.00000 1.00000
2 hdd 1.00000 osd.2 up 1.00000 1.00000
3 hdd 1.00000 osd.3 up 1.00000 1.00000
4 hdd 1.00000 osd.4 up 1.00000 1.00000
-8 5.00000 host host2
5 hdd 1.00000 osd.5 up 1.00000 1.00000
6 hdd 1.00000 osd.6 up 1.00000 1.00000
7 hdd 1.00000 osd.7 up 1.00000 1.00000
8 hdd 1.00000 osd.8 up 1.00000 1.00000
9 hdd 1.00000 osd.9 up 1.00000 1.00000
-9 5.00000 host host3
10 hdd 1.00000 osd.10 up 1.00000 1.00000
11 hdd 1.00000 osd.11 up 1.00000 1.00000
12 hdd 1.00000 osd.12 up 1.00000 1.00000
13 hdd 1.00000 osd.13 up 1.00000 1.00000
14 hdd 1.00000 osd.14 up 1.00000 1.00000
-10 5.00000 host host4
15 hdd 1.00000 osd.15 up 1.00000 1.00000
16 hdd 1.00000 osd.16 up 1.00000 1.00000
17 hdd 1.00000 osd.17 up 1.00000 1.00000
18 hdd 1.00000 osd.18 up 1.00000 1.00000
19 hdd 1.00000 osd.19 up 1.00000 1.00000
至此我们的db wal 分区部署到此就麻烦得告一段落,内部实现细节还需持续学习了解
脚本代码一定要好好学学,对于一些集中性的操作写在脚本中,会极为方便,也能提升自己的工作效率。