一、背景介绍
Ceph是一个统一的分布式存储系统,可以对外提供块存储、对象存储和文件存储。其中RBD(RADOS Block Device)是Ceph对外的三大组件之一,也是Ceph最稳定的接口,应用访问rados应用有两种途径(如下图):
- librbd 用户态接口,librados.so动态链接库充当客户端接入RADOS集群,可以在用户态访问RBD接口
- krbd 内核态,通过rbd命令,可以将rbd设备映射为本地的块设备,
相较于用户态的librbd.so,生产环境中较常使用的是内核态的rbd.ko进行连接,本文介绍物理节点如何使用rbd进行挂载等操作。
二、操作步骤
1.客户端环境检查
首先要确认客户端是否有rbd.ko内核模块
其次需要将ceph集群的conf配置文件和连接集群的keyring文件考到客户端/etc/ceph目录下(图省事,客户端使用admin账户连接ceph集群),并确认客户端可以正常访问到ceph集群
2.Ceph集群创建/删除存储池
首先在ceph集群上创建一个存储池,ceph默认创建的是副本池,纠删码池需要在创建时特别指定,创建ceph存储池时需要指定PG的数量,此处rbd.pool指定的PG数量为64
[root@ceph1 ~]# ceph osd pool create rbd.pool 64 64
[root@ceph1 ~]# ceph osd pool get rbd.pool all
size: 3
min_size: 2
pg_num: 64
pgp_num: 64
crush_rule: replicated_rule
hashpspool: true
nodelete: false
nopgchange: false
nosizechange: false
write_fadvise_dontneed: false
noscrub: false
nodeep-scrub: false
use_gmt_hitset: 1
fast_read: 0
pg_autoscale_mode: on
按照计算公式:Total PGs = (Total_number_of_OSD *100) / max_replication_count / pool_count 结算的结果往上取靠近2的N次方的值,以本文为例,PG=(6*100)/3/6=33.33333,向上取2的N次方的值为64
[root@ceph1 ~]# ceph osd pool ls
device_health_metrics
.rgw.root
us-east-1.rgw.log
us-east-1.rgw.control
us-east-1.rgw.meta
rbd.pool
[root@ceph1 ~]# ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.29279 root default
-3 0.09760 host ceph1
0 hdd 0.04880 osd.0 up 1.00000 1.00000
3 hdd 0.04880 osd.3 up 1.00000 1.00000
-5 0.09760 host ceph2
1 hdd 0.04880 osd.1 up 1.00000 1.00000
4 hdd 0.04880 osd.4 up 1.00000 1.00000
-7 0.09760 host ceph3
2 hdd 0.04880 osd.2 up 1.00000 1.00000
5 hdd 0.04880 osd.5 up 1.00000 1.00000
也可以调整为32,此时需要删除原有pool。出于安全考虑,ceph集群默认配置文件中不允许删除存储池,删除前需要向monitor节点传递--mon-allow-pool-delete=true参数,删除完后及时修改回false(删除动作省略)
[root@ceph1 ceph]# ceph tell 'mon.*' injectargs --mon-allow-pool-delete=true
mon.ceph1: mon_allow_pool_delete = 'true'
mon.ceph1: {}
mon.ceph3: mon_allow_pool_delete = 'true'
mon.ceph3: {}
mon.ceph2: mon_allow_pool_delete = 'true'
mon.ceph2: {}
[root@ceph1 ceph]#
[root@ceph1 ceph]# ceph osd pool delete rbd.pool rbd.pool --yes-i-really-really-mean-it
pool 'rbd.pool' removed
3.启用存储池
创建完存储池后,需要对存储池进行启用,对外提供的存储类型在启用时指定,此处以rbd为例
[root@ceph1 ~]# ceph osd pool application enable rbd.pool rbd #此处也可使用rbd pool init
enabled application 'rbd' on pool 'rbd.pool'
[root@ceph1 ~]# rbd pool stats rbd.pool
Total Images: 0
Total Snapshots: 0
Provisioned Size: 0 B
4.rbd存储池中创建镜像
在存储池中创建镜像文件,并指定大小,该镜像文件就可以被客户端识别为块设备并挂载
[root@ceph1 ~]# rbd create rbd.pool/rbd-image-1 -s 10G
[root@ceph1 ~]# rbd ls rbd.pool
rbd-image-1
[root@ceph1 ~]# rbd pool stats rbd.pool
Total Images: 1
Total Snapshots: 0
Provisioned Size: 10 GiB
5.客户端挂载rbd块设备
在客户端上挂载rbd-image-1
[root@client ~]# rbd map rbd.pool/rbd-image-1
rbd: sysfs write failed
RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable rbd.pool/rbd-image-1 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
发现无法直接挂载,提示需要将内核不支持的“object-map fast-diff deep-flatten”功能关闭,查看rbd-image-1,当前确实开启了“object-map fast-diff deep-flatten”功能
[root@ceph1 ~]# rbd info rbd.pool/rbd-image-1
rbd image 'rbd-image-1':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: da5be45611dc
block_name_prefix: rbd_data.da5be45611dc
format: 2
features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
op_features:
flags:
create_timestamp: Thu Aug 10 23:19:39 2023
access_timestamp: Thu Aug 10 23:19:39 2023
modify_timestamp: Thu Aug 10 23:19:39 2023
将上述“object-map fast-diff deep-flatten”功能关闭
[root@ceph1 ~]# rbd feature disable rbd.pool/rbd-image-1 object-map, fast-diff, deep-flatten
[root@ceph1 ~]# rbd info rbd.pool/rbd-image-1
rbd image 'rbd-image-1':
size 10 GiB in 2560 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: da5be45611dc
block_name_prefix: rbd_data.da5be45611dc
format: 2
features: layering, exclusive-lock
op_features:
flags:
create_timestamp: Thu Aug 10 23:19:39 2023
access_timestamp: Thu Aug 10 23:19:39 2023
modify_timestamp: Thu Aug 10 23:19:39 2023
再到客户端上挂载,需要注意的是,当物理节点重启后,需要手动执行rbd map
[root@client ~]# rbd map rbd.pool/rbd-image-1 #卸载使用rbd unmap
/dev/rbd0
[root@client ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 15G 0 lvm /
└─centos-swap 253:1 0 4G 0 lvm [SWAP]
sdb 8:16 0 50G 0 disk
└─ceph--63e7a68e--e1a0--46fa--bca9--996161db7fcf-osd--block--a40a2285--813c--4a42--8ca0--274a1df2d31f 253:2 0 50G 0 lvm
sdc 8:32 0 50G 0 disk
└─ceph--95af275d--5c4e--43ca--b23b--1325e8867b7d-osd--block--5348a544--f316--4d18--a069--ff9bfde5eb5f 253:3 0 50G 0 lvm
sr0 11:0 1 1024M 0 rom
rbd0 252:0 0 10G 0 disk
之后就可以像本地磁盘一样,格式化后挂载使用,如果希望开机能自动挂载,需要将/dev/rbd0添加进fstab文件
[root@client ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sun Jun 11 08:54:15 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=e9fe3ac0-f203-454b-9623-cb44be277279 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
UUID=36a9c7ee-a67c-4c4b-9e76-e8054ba4ff68 /mnt xfs defaults,_netdev 0 0
三、快照卷格式
全球网络存储工业协会SNIA(Storage Networking Industry Association)对快照(Snapshot)的定义是:关于指定数据集合的一个完全可用拷贝,该拷贝包括相应数据在某个时间点(拷贝开始的时间点)的映像。快照可以是其所表示的数据的一个副本,也可以是数据的一个复制品。按照 SNIA 的定义, 快照有全量快照和增量快照两种类型, 其中又各自使用了不同的快照技术:
- 全量快照:镜像分离(Split Mirror)。
- 增量快照:
- 写时拷贝(Copy-On-Write)
- 写时重定向(Redirect-On-Write)
全量快照可以参考RAID1理解,创建快照时会生成一个源卷的镜像卷,在读操作时没有任何影响,在写操作时会有两次写入操作,分别是写入源卷与镜像卷。关于增量快照是本文的重点内容,下文将进行详细的介绍。
1.COW的优缺点
优势:COW 在进行快照操作之前,不会占用任何的存储资源,也不会影响系统性能。
劣势:
- 降低源数据卷的写性能。当修改源数据时,会发生三次读写操作:
- 读取源数据。
- 将源数据写入快照卷中。
- 将新数据写入源数据卷中。
- 如果主机写入数据频繁,那么这种方式将非常消耗I/O。
- 无法得到完整的物理副本。快照卷仅仅保存了源数据卷的部分原始数据。
- 拷贝到快照卷中的数据量超过了保留空间,快照就将失效。
2.ROW优缺点
优势:不会降低源数据卷的写性能。源数据卷创建快照后的写操作会被重定向,所有的写 I/O 都被重定向到新卷中,而所有快照卷数据(旧数据)均保留在只读的源数据卷中。因此更新源数据只需要一个写操作,解决了 COW 写两次的性能问题。对于分布式系统来说,正是由于数据的分散,进而提供了并发读的机会。所以在分布式存储上,ROW的连续读写性能比COW好。
劣势:
- 没有一个完整的快照卷。ROW 的快照卷数据映射表保存的是源数据卷的原始副本,而源数据卷数据指针表保存的则是更新后的副本。因此,当创建了多个快照时,会产生一个快照链,使原始数据的访问快照卷和源数据卷数据的追踪以及快照的删除将变得异常复杂。在恢复快照时会不断地合并快照文件,造成较大的系统开销。
- 单机读性能下降。由于采用了重定向写,使得原本连续的数据分散到了磁盘中,连续写变成了随机写,造成读性能下降。
3.快照适用场景
综上,COW的快照方式更适合于读密集型应用,或者对存储设备容易出现写入热点(对于小范围内的数据频繁写入)的应用,因为数据的修改都局限在小范围内,对同一份数据进行多次写只会出现一次复制操作。ROW适合写密集的应用,同时由于ROW重定向写的特性,在分布式存储中,读性能会更高。ceph默认使用的是COW类型快照。