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

联系方式:

1. 微信:Lxh_Chat

2. 邮箱:939958092@qq.com

RBD的块存储介绍

RADOS 块设备 (RBD) 功能可从红 帽 Ceph 存储集群提供块存储。RADOS 提供虚拟块设备,并以 RBD 镜像形式存储在红帽 Ceph 存储集群的池中,在创建了存储池后,需要使用 rbd pool init 命令进行初始化赋予它rbd的功能。

rbd_default_pool 参数指定用于存储 RBD 镜像的默认池的名称,默认是rbd

RBD 内核客户端介绍

内核 RBD 客户端 (krbd) 将 RBD 镜像映射到 Linux 块设备,Ceph 客户端可以使用原生 Linux 内核模块 (krbd) 挂载 RBD 镜像。这个模块使用 /dev/rbd0 之类的名称将 RBD 镜像映射到 Linux 块设备。

提供RDB块存储

创建存储池

首先需要创建一个池用于存放RDB镜像,然后将该池设置为RBD的应用程序类型

1
2
3
[root@serverc ~]# ceph osd pool create rbdpool
pool 'rbdpool' created
[root@serverc ~]# rbd pool init rbdpool

查询池的大小以及可用信息,发现我们目前rbdpool有32个PG,最大为28GiB

1
2
3
4
5
6
7
8
9
10
[root@serverc ~]# ceph df
--- RAW STORAGE ---
CLASS SIZE AVAIL USED RAW USED %RAW USED
hdd 90 GiB 89 GiB 595 MiB 595 MiB 0.65
TOTAL 90 GiB 89 GiB 595 MiB 595 MiB 0.65

--- POOLS ---
POOL ID PGS STORED OBJECTS USED %USED MAX AVAIL
...
rbdpool 8 32 19 B 1 12 KiB 0 28 GiB

安装ceph-common

 需要安装ceph-common来操作ceph

1
[root@serverc ~]# yum install ceph-common -y

创建客户端账号

创建一个名为rbduse的账号以供客户端来连接并使用此存储池,要注意需要把keyring和ceph.conf发给客户端

1
[root@serverc ~]# ceph auth get-or-create client.rbduse mon 'profile rbd' osd 'profile rbd' -o /etc/ceph/ceph.client.rbduse.keyring

分发配置文件和keyring

1
2
3
4
[ceph: root@host1 /]# scp /etc/ceph/ceph.conf /etc/ceph/ceph.client.rbduse.keyring root@clienta:/etc/ceph/
root@clienta's password:
ceph.conf 100% 339 533.3KB/s 00:00
ceph.client.rbduse.keyring 100% 64 110.0KB/s 00:00

创建RBD镜像

在rbdpool中,创建一个名为test切大小为500M的镜像

1
2
3
[root@serverc ~]# rbd create rbdpool/test --size=500M
[root@serverc ~]# rbd list -p rbdpool
test

查询RBD镜像参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@serverc ~]# rbd info rbdpool/test
rbd image 'test':
size 500 MiB in 125 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: d95ce194def6
block_name_prefix: rbd_data.d95ce194def6
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Wed Aug 7 03:20:13 2024
access_timestamp: Wed Aug 7 03:20:13 2024
modify_timestamp: Wed Aug 7 03:20:13 2024

挂载RBD到客户端使用

客户端也需要安装ceph-common

1
[root@clienta ~]# yum install ceph-common -y

可以看到多了一个名为rbd0的500M的磁盘

1
2
3
4
5
[root@clienta ~]# rbd map rbdpool/test
/dev/rbd0
[root@clienta ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
rbd0 251:0 0 500M 0 disk

查看RBD映射情况

1
2
3
[root@clienta ~]# rbd showmapped
id pool namespace image snap device
0 rbdpool test - /dev/rbd0

格式化挂载RBD设备

1
2
3
4
5
6
7
8
9
10
11
12
[root@clienta ~]# mkfs.xfs /dev/rbd0
meta-data=/dev/rbd0 isize=512 agcount=8, agsize=16000 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1
data = bsize=4096 blocks=128000, imaxpct=25
= sunit=16 swidth=16 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=1872, version=2
= sectsz=512 sunit=16 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
Discarding blocks...Done.

我们挂载到/mnt上

1
2
3
[root@clienta ~]# mount /dev/rbd0 /mnt/
[root@clienta ~]# df -h | grep rbd0
/dev/rbd0 493M 29M 464M 6% /mnt

永久挂载

rbd的设备永久挂载一定要注意,这不是本地设备,需要ceph先操作把rbd0的设备映射成本地设备,然后才能本地挂载,不然你启动的时候挂载会卡住无法启动系统

先把rbd映射写好,并启动服务,如果不启用并启动服务,就需要每次系统启动后执行rbd map命令映射成本地设备,关机的时候执行rbd unmap

1
2
3
4
[root@clienta ~]# vim /etc/ceph/rbdmap
[root@clienta ~]# tail -n1 /etc/ceph/rbdmap
rbdpool/test id=rbduse,keyring=/etc/ceph/ceph.client.rbduse.keyring
[root@clienta ~]# systemctl enable rbdmap --now

写入fstab,并重启测试

请注意,这里fstab挂载请使用noauto

重启后,发现rbd0还是挂载的

1
2
3
4
5
6
[root@client ~]# vim /etc/fstab 
[root@client ~]# tail -n1 /etc/fstab
/dev/rbd0 /mnt xfs defaults,noauto 0 0
[root@client ~]# reboot
[root@clienta ~]# df -h | grep mnt
/dev/rbd0 493M 29M 464M 6% /mnt

写入数据

1
2
3
4
[root@clienta ~]# dd if=/dev/zero of=/mnt/test.data bs=10M count=20
20+0 records in
20+0 records out
209715200 bytes (210 MB, 200 MiB) copied, 0.111759 s, 1.9 GB/s

查询rados数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@clienta ~]# rbd info rbdpool/test
rbd image 'test':
size 500 MiB in 125 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: d95ce194def6
block_name_prefix: rbd_data.d95ce194def6
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Wed Aug 7 03:20:13 2024
access_timestamp: Wed Aug 7 03:20:13 2024
modify_timestamp: Wed Aug 7 03:20:13 2024
[root@clienta ~]# rados -p rbdpool ls
rbd_data.d95ce194def6.000000000000005f
rbd_data.d95ce194def6.0000000000000044
rbd_data.d95ce194def6.0000000000000064
rbd_data.d95ce194def6.0000000000000000
rbd_data.d95ce194def6.000000000000006e

查询RBD镜像实际使用量

1
2
3
[root@clienta ~]# rbd disk-usage rbdpool/test
NAME PROVISIONED USED
test 500 MiB 472 MiB

RBD 镜像大小扩容

如果RBD随着后期的需求增长,不够大了怎么办,那就需要使RBD变大,目前我们只有500M,什么都放不下

1
2
3
[root@clienta ~]# rbd disk-usage -p rbdpool
NAME PROVISIONED USED
test 500 MiB 472 MiB

扩大到10G

1
2
3
4
5
6
7
8
9
10
11
12
[root@clienta ~]# rbd resize rbdpool/test --size 10G
Resizing image: 100% complete...done.
[root@clienta ~]#
[root@clienta ~]# rbd disk-usage -p rbdpool
NAME PROVISIONED USED
test 10 GiB 472 MiB
[root@clienta ~]# xfs_growfs /mnt/
...
data blocks changed from 128000 to 2621440

[root@clienta ~]# df -h | grep mnt
/dev/rbd0 10G 306M 9.7G 3% /mnt

RADOS块设备镜像布局

RBD 镜像中的所有对象的名称以各个 RBD 镜像 RBD 块名称前缀字段中包含的值为开头,这可使用 rbd info 命令来显示。此前缀后是句点 (.),后跟对象编号。对象编号字段的值是 12 个字符的十六进制数字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@clienta ~]# rbd info rbdpool/test
rbd image 'test':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: d95ce194def6
block_name_prefix: rbd_data.d95ce194def6
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Wed Aug 7 03:20:13 2024
access_timestamp: Wed Aug 7 03:20:13 2024
modify_timestamp: Wed Aug 7 03:20:13 2024

RBD 镜像基于对象分条,并存储在 RADOS 对象存储中