1
2
3
4
5
6
7
作者:李晓辉

联系方式:

1. 微信:Lxh_Chat

2. 邮箱:939958092@qq.com

BlueStore 简介

BlueStore 取代 FileStore 作为 OSD 的存储后端,BlueStore 将对象直接存储在原始块设备上,免除了对文件系统层的需要,从而提高了读写操作速度

BlueStore 架构

Ceph 集群中存储的对象在整个集群具有唯一标识符、二进制对象数据和对象元数据。BlueStore 将对象元数据存储在块数据库中。块数据库将元数据作为键值对存储在 RocksDB 数据库中,这是一种高性能的键值存储。

块数据库驻留于存储设备上的一个小型 BlueFS 分区。BlueFS 是最小的文件系统,用于保存 RocksDB 文件。

BlueStore 利用预写式日志 (WAL) 将数据写入块存储设备。预写式日志执行日志记录功能,并记录所有事务。

BlueStore 性能

FileStore 写入到日志,然后从日志中写入到块设备。BlueStore 可避免这种双重写入的性能损失,直接将数据写入块设备,同时使用单独的数据流将事务记录到预写式日志。当工作负载相似时,BlueStore 的写操作速度约为 FileStore 的两倍

在混用不同的集群存储设备时,自定义 BlueStore OSD 可以提高性能。创建 BlueStore OSD 时,默认会将数据、块数据库和预写式日志放置到同一个块设备上。块数据库和预写式日志有很多性能优势,所以将这些组件放在单独的、速度更快的设备上也许可以提高性能。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@serverc ~]# cat bluestore.yml
service_type: osd
service_id: lxh-bluestore-test
placement:
host_pattern: 'serverc*'
data_devices:
paths:
- /dev/vde
wal_devices:
paths:
- /dev/vdf

[root@serverc ~]# ceph orch apply -i bluestore.yml
Scheduled osd.lxh-bluestore-test update...

[root@serverc ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vde 252:64 0 10G 0 disk
└─ceph--aba9b-'block' 253:3 0 10G 0 lvm
vdf 252:80 0 10G 0 disk
└─ceph--110ee-'wal' 253:4 0 10G 0 lvm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@serverc ~]# ceph orch ls --service-type osd --format yaml
---
service_type: osd
service_id: lxh-bluestore-test
service_name: osd.lxh-bluestore-test
placement:
host_pattern: serverc*
spec:
data_devices:
paths:
- /dev/vde
filter_logic: AND
objectstore: bluestore
wal_devices:
paths:
- /dev/vdf
status:
created: '2023-09-08T18:40:58.116841Z'
running: 0
size: 1

BlueStore 存储后端提供以下功能:

  • 允许为数据、块数据库和预写式日志 (WAL) 使用单独的设备。

  • 几乎支持使用 HDD、SSD 和 NVMe 设备的任意组合。

  • 在原始设备或分区上操作,从而消除对存储设备的双重写入,同时提高元数据效率。

  • 使用校验和写入所有数据和元数据。在返回至客户端之前,所有读取操作都使用相对应的校验和进行验证。

添加OSD到集群

先查看现有服务器上的硬盘情况

1
2
3
4
5
6
7
[root@serverc ~]# ceph orch device ls
Hostname Path Type Serial Size Health Ident Fault Available
clienta.lab.example.com /dev/vdb hdd 10.7G Unknown N/A N/A Yes
clienta.lab.example.com /dev/vdc hdd 10.7G Unknown N/A N/A Yes
clienta.lab.example.com /dev/vdd hdd 10.7G Unknown N/A N/A Yes
clienta.lab.example.com /dev/vde hdd 10.7G Unknown N/A N/A Yes
clienta.lab.example.com /dev/vdf hdd 10.7G Unknown N/A N/A Yes

将clienta上的/dev/vdb盘加进来

1
2
[root@serverc ~]# ceph orch daemon add osd clienta.lab.example.com:/dev/vdb
Created osd(s) 11 on host 'clienta.lab.example.com'

再次查看osd情况,发现在clienta上多了一个osd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@serverc ~]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.11755 root default
-9 0.00980 host clienta
11 hdd 0.00980 osd.11 up 1.00000 1.00000
-3 0.03918 host serverc
0 hdd 0.00980 osd.0 up 1.00000 1.00000
1 hdd 0.00980 osd.1 up 1.00000 1.00000
2 hdd 0.00980 osd.2 up 1.00000 1.00000
10 hdd 0.00980 osd.10 up 1.00000 1.00000
-5 0.02939 host serverd
3 hdd 0.00980 osd.3 up 1.00000 1.00000
5 hdd 0.00980 osd.5 up 1.00000 1.00000
7 hdd 0.00980 osd.7 up 1.00000 1.00000
-7 0.03918 host servere
4 hdd 0.00980 osd.4 up 1.00000 1.00000
6 hdd 0.00980 osd.6 up 1.00000 1.00000
8 hdd 0.00980 osd.8 up 1.00000 1.00000
9 hdd 0.00980 osd.9 up 1.00000 1.00000

擦除硬盘准备OSD

如果硬盘并不是空的,可以用下面的命令让设备做好调配准备,此命令将删除所有分区并清除设备中的数据

需要注意的是,这个命令并不能擦除osd,只能擦除非ceph内的外部硬盘

1
[root@serverc ~]# ceph orch device zap clienta.lab.example.com /dev/vdc --force

自动创建OSD

编排器服务可在集群主机中发现可用设备,添加设备并创建 OSD 守护进程

使用 ceph orch apply osd --all-available-devices 命令调配所有可用而未使用的设备。

1
2
[root@serverc ~]# ceph orch apply osd --all-available-devices
Scheduled osd.all-available-devices update...

停止自动应用osd

如果前面我们已经添加了所有硬盘到集群中,而且添加了–all-available-devices选项,将会导致我们删除osd后再次重新创建,我们先停止集群自动创建osd

1
2
[root@serverc ~]# ceph orch apply osd --all-available-devices --unmanaged=true
Scheduled osd.all-available-devices update...

从集群中删除OSD

这里有一个很重要的问题,一般情况下我们不会主动删除某个osd,通常是它坏了,主动报告状态为down,这个问题是我们如何知道哪个osd是哪块盘,例如我明确知道host2上的/dev/nvme0n3坏了,那这是哪个osd呢,或者反过来,我就想删除某个osd,我如何知道它是哪块盘呢

从上面的信息我们看到host2上的osd分别为2 4 7 10,一共4个osd,现在我想删除osd 10,并把盘用来干别的

查询osd所在的硬盘名称

查询osd.1在哪个服务器上的哪块硬盘

经过查询,发现osd.0属于"serverc.lab.example.c 的vdb

1
2
3
4
5
6
[root@serverc ~]# ceph osd metadata 0 | grep -E 'devices|hostname'
"bluestore_bdev_devices": "vdb",
"container_hostname": "serverc.lab.example.com",
"devices": "vdb",
"hostname": "serverc.lab.example.com",
"objectstore_numa_unknown_devices": "vdb",

OSD暂停服务

暂停服务后,权重降低为0

1
2
3
4
5
6
7
8
[root@serverc ~]# ceph osd out 0
marked out osd.0.

[root@serverc ~]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-3 0.03918 host serverc
0 hdd 0.00980 osd.0 up 0 1.00000
1 hdd 0.00980 osd.1 up 1.00000 1.00000

停止OSD

stop之后,相应的服务也会停止

1
2
3
4
5
[root@serverc ~]# ceph orch daemon stop osd.0
Scheduled to stop osd.0 on host 'serverc.lab.example.com'

[root@serverc ~]# systemctl is-active ceph-2ae6d05a-229a-11ec-925e-52540000fa0c@osd.0.service
inactive

删除OSD

1
2
[root@serverc ~]# ceph orch osd rm 0
Scheduled OSD(s) for removal

如果在rm之后,发现crush并没有删除,可以手工删除

1
[root@serverc ~]# ceph osd crush rm osd.0

确认OSD Secret已删除

1
2
3
4
[root@serverc ~]# ceph auth list | grep osd.0
installed auth entries:

osd.0

如果还有残留,会导致下次创建osd失败,通过以下方式删除

1
[root@serverc ~]# ceph auth del osd.0