date: 2021-03-28title: ceph存储之RBD块存储 #标题
tags: ceph #标签
categories: 存储 # 分类
记录下ceph支持的RBD块存储接口使用方式。
无论是通过Ceph块设备、对象存储还是文件系统,Ceph存储群集都从Ceph客户端接收数据,并将其存储为对象。每个对象对应于文件系统中的一个文件,该文件存储在对象存储设备上。Ceph OSD守护程序处理存储磁盘上的读/写操作。
此博文基于部署ceph集群 (Nautilus版)进行操作。
ceph资源池的概念
Ceph存储系统支持“池”的概念,“池”是用于存储对象的逻辑分区。
Ceph客户端从Ceph监控器检索集群映射,并将对象写入池中。池的size副本数或副本数,CRUSH规则和放置组的数量决定了Ceph将如何放置数据。
创建存储池pool
# 创建一个名字为ceph-demo的pool(第一个64是pg数量,第二个64是pgp数量)
$ ceph osd pool create ceph-demo 64 64
pool 'ceph-demo' created
$ ceph osd lspools # 查看当前所有pool
1 ceph-demo
# 将 ceph-demo 池分类为 rbd
$ ceph osd pool application enable ceph-demo rbd
enabled application 'rbd' on pool 'ceph-demo'
$ ceph osd pool application get ceph-demo # 查看资源池类型为rbd
{
"rbd": {}
}
ceph中pg和pgp的关系
pg是用来存放object的,pgp相当于是pg存放osd的一种排列组合,我举个例子,比如有3个osd,osd.1、osd.2和osd.3,副本数是2,如果pgp的数目为1,那么pg存放的osd组合就只有一种,可能是[osd.1,osd.2],那么所有的pg主从副本分别存放到osd.1和osd.2,如果pgp设为2,那么其osd组合可以两种,可能是[osd.1,osd.2]和[osd.1,osd.3],是不是很像我们高中数学学过的排列组合,pgp就是代表这个意思。一般来说应该将pg和pgp的数量设置为相等。
调整pool副本数
# 查看pool的副本数(默认副本为3)
$ ceph osd pool get ceph-demo size
size: 3
# 调整pool副本数为2
$ ceph osd pool set ceph-demo size 2
$ ceph osd pool get ceph-demo size
size: 2
调整pool的pg及pgp数量
# 查看pg和pgp的数量
$ ceph osd pool get ceph-demo pg_num
pg_num: 64
$ ceph osd pool get ceph-demo pgp_num
pgp_num: 64
# 调整pg数量为128
$ ceph osd pool set ceph-demo pg_num 128
set pool 1 pg_num to 128
$ ceph osd pool get ceph-demo pg_num # 查看确认
pg_num: 128
# 最好将pgp数量调整为和pg数量一致
$ ceph osd pool set ceph-demo pgp_num 128
set pool 1 pgp_num to 128
# 查看确认
$ ceph osd pool get ceph-demo pgp_num
pgp_num: 128
块存储(RDB)
ceph集群搭建起来后,可以在ceph集群上进行块存储、对象存储以及文件系统存储。从架构上来看,在ceph集群的上面是rados协议,该协议为使用ceph集群的用户提供必要的支持(ceph用户通过调用rados协议来使用ceph集群)。对于块存储来说,可以通过内核模块的方式使用ceph集群也可以通过用户态调用librbd库来使用ceph集群。通过内核模块方式可以充分的利用内核的page cache机制,而通过用户态调用librbd也可以使用librbd在用户态提供的cache方式提高性能。
在进行创建rbd之前,需要先按照上面的操作,创建出来一个可用的pool。
创建rbd
$ rbd -p ceph-demo ls # 确认当前pool中没有rbd
# 基于ceph-demo池创建名称为rbd-demo.img的块文件
$ rbd create -p ceph-demo --image rbd-demo.img --size 10G
# 换种语法格式创建第二个块文件
$ rbd create ceph-demo/rbd-demo-1.img --size 10G
# 查看ceph-demo池中的块文件
$ rbd -p ceph-demo ls
rbd-demo-1.img
rbd-demo.img
查看块文件的详细信息
# 查看rbd-demo.img块文件
$ rbd info ceph-demo/rbd-demo.img
rbd image 'rbd-demo.img':
# 此块设备大小为10G,包含了2560个object,每个object的大小为4M
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 860d7ff6eff2
block_name_prefix: rbd_data.860d7ff6eff2
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Mon Feb 22 08:10:43 2021
access_timestamp: Mon Feb 22 08:10:43 2021
modify_timestamp: Mon Feb 22 08:10:43 2021
# 查看rbd-demo-1.img块文件
$ rbd info -p ceph-demo --image rbd-demo.img
rbd image 'rbd-demo.img':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 860d7ff6eff2
block_name_prefix: rbd_data.860d7ff6eff2
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Mon Feb 22 08:10:43 2021
access_timestamp: Mon Feb 22 08:10:43 2021
modify_timestamp: Mon Feb 22 08:10:43 2021
删除块设备
$ rbd rm -p ceph-demo --image rbd-demo-1.img
Removing image: 100% complete...done.
# 确认已删除
$ rbd -p ceph-demo ls
rbd-demo.img
内核级别挂载使用块设备
$ rbd map ceph-demo/rbd-demo.img # 默认创建的块文件有些特性不支持,会报错如下
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable ceph-demo/rbd-demo.img object-map fast-diff deep-flatten".
In some cases useful info is found in syslog - try "dmesg | tail".
rbd: map failed: (6) No such device or address
# 删除不支持的特性
$ rbd info ceph-demo/rbd-demo.img # 查看特性
rbd image 'rbd-demo.img':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 860d7ff6eff2
block_name_prefix: rbd_data.860d7ff6eff2
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Mon Feb 22 08:10:43 2021
access_timestamp: Mon Feb 22 08:10:43 2021
modify_timestamp: Mon Feb 22 08:10:43 2021
# 删除不支持的特性
$ rbd feature disable ceph-demo/rbd-demo.img deep-flatten
rbd feature disable ceph-demo/rbd-demo.img fast-diff
# 删除上面两个后,就可以再次进行内核级别挂载了,如果还不行,再删除下面两个
rbd feature disable ceph-demo/rbd-demo.img object-map
rbd feature disable ceph-demo/rbd-demo.img exclusive-lock
$ rbd info ceph-demo/rbd-demo.img # 确认不支持的特性已删除
rbd image 'rbd-demo.img':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 860d7ff6eff2
block_name_prefix: rbd_data.860d7ff6eff2
format: 2
features: layering # layering特性需要保持
op_features:
flags:
create_timestamp: Mon Feb 22 08:10:43 2021
access_timestamp: Mon Feb 22 08:10:43 2021
modify_timestamp: Mon Feb 22 08:10:43 2021
# 再次映射块设备
$ rbd map ceph-demo/rbd-demo.img
/dev/rbd0
查看块设备
$ rbd device list
id pool namespace image snap device
0 ceph-demo rbd-demo.img - /dev/rbd0
$ lsblk /dev/rbd0
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
rbd0 252:0 0 10G 0 disk
至此,就可以将/dev/rbd0
当成我们一个本地的磁盘来使用了。
格式化并使用块设备
如果将ceph对接云平台,当成云盘来使用,那么不建议对块设备进行分区,这样可以避免块设备扩容带来的麻烦。
$ mkfs.xfs /dev/rbd0
meta-data=/dev/rbd0 isize=512 agcount=16, agsize=163840 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=2621440, imaxpct=25
= sunit=1024 swidth=1024 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
# 挂载并测试使用
$ mkdir /data && mount /dev/rbd0 /data/
echo 'test block' > /data/test.txt
RBD数据写入流程
一个文件被切割成多个object,每个object大小为4M,object存储到pg上(经过hash运算,再取掩码,得到它要落到哪个pg上,),pg再通过crush算法,最终找到对应的osd上。
RDB块设备扩容
rdb块设备,支持扩缩容,但是对于缩容操作,强烈不建议,可能会造成数据丢失。
# 确认当前块设备大小
$ rbd -p ceph-demo info --image rbd-demo.img
rbd image 'rbd-demo.img':
size 10 GiB in 2560 objects
...... # 省略部署输出
# 从10G大小扩容到20G
$ rbd resize ceph-demo/rbd-demo.img --size 20G
# 确认已扩容
$ rbd -p ceph-demo info --image rbd-demo.img
rbd image 'rbd-demo.img':
size 20 GiB in 5120 objects
order 22 (4 MiB objects)
snapshot_count: 0
# 此时块设备已经扩容,但文件系统还未识别到,如下,还是原来的10G
$ df -hT /data/
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/rbd0 xfs 10G 1.1G 9.0G 11% /data
# 扩容文件系统(原磁盘是xfs格式的,故需要使用xfs_growfs指令扩容)
$ xfs_growfs /dev/rbd0
$ partprobe
# 如果你格式化为ext4的,请执行如下命令
$ resize2fs /dev/rbd0
$ df -hT /data/ # 确认已扩容成功
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/rbd0 xfs 20G 1.1G 19G 6% /data