1 RBD简单介绍
Ceph块设备,RADOS Block Device的简称,为客户机提供可靠的、分布式的和高性能的块存储磁盘。RADOS块设备利用librbd库并以顺序的形式在Ceph集群中的多个osd上存储数据块。RBD是由Ceph的RADOS层支持的,因此每个块设备都分布在多个Ceph节点上,提供了高性能和优异的可靠性。RBD有Linux内核的本地支持,这意味着RBD驱动程序从过去几年就与Linux内核集成得很好。除了可靠性和性能之外,RBD还提供了企业特性,例如完整和增量快照、瘦配置、写时复制克隆、动态调整大小等等。RBD还支持内存缓存,这大大提高了其性能:
块设备本质就是将裸磁盘或类似裸磁盘(lvm)设备映射给主机使用,主机可以对其进行格式化并存储和读取数据,块设备读取速度快但是不支持共享。
1.1 相关概念
- resizable:大小可调,即是这个块可大可小;
- data striped:数据条带化,这个块在Ceph里面是被切割成若干小块按照一定算法分布在不同的OSD上;
- thin-provisioned:精简置备,其实就是块的大小和在 Ceph 中实际占用大小是没有关系的,刚创建出来的块是不占空间,今后用多大空间,才会在 Ceph 中占用多大空间。举例:一个 32G 的 U盘,存了一个2G的电影,那么 RBD 大小就类似于 32G,而 2G 就相当于在 Ceph 中占用的空间 ;
1.2 使用场景
- 云平台(OpenStack做为云的存储后端提供镜像存储)
- K8s容器
- map成块设备直接使用
- ISCIS,安装Ceph客户端
2 RBD配置使用
2.1 RBD挂载到本地操作系统
1)创建rbd使用的pool
# #pg_num 32 pgp_num 32
[cephuser@cephmanager01 cephcluster]$ sudo ceph osd pool create p_rbd 32 32
# 查看详细信息
[cephuser@cephmanager01 cephcluster]$ sudo ceph osd pool ls detail
# 查看状态
[cephuser@cephmanager01 cephcluster]$ sudo ceph pg stat
2) 创建一个块设备(10G)
[cephuser@cephmanager01 cephcluster]$ sudo rbd create --size 10240 image001 -p p_rbd
3) 查看块设备
[cephuser@cephmanager01 cephcluster]$ sudo rbd ls -p p_rbd
[cephuser@cephmanager01 cephcluster]$ sudo rbd info image001 -p p_rbd
# #从底层查看创建rbd后所创建的文件
[cephuser@cephmanager01 cephcluster]$ sudo rados -p p_rbd ls --all
4) 禁用当前系统内核不支持的feature
[cephuser@cephmanager01 cephcluster]$ sudo rbd feature disable image001 exclusive-lock, object-map, fast-diff, deep-flatten -p p_rbd
# 确认features: layering
[cephuser@cephmanager01 cephcluster]$ sudo rbd info image001 -p p_rbd
5) 将块设备映射到系统内核
[cephuser@cephmanager01 cephcluster]$ sudo rbd map image001 -p p_rbd
# map成功后,会出现/dev/rbd0
[cephuser@cephmanager01 cephcluster]$ lsblk
6) 格式化块设备镜像
[cephuser@cephmanager01 cephcluster]$ sudo mkfs.xfs /dev/rbd0
7) mount到本地
[root@cephmanager01 ~]# mount /dev/rbd0 /mnt
# 查看mount情况
[root@cephmanager01 ~]# df -h
# 写入数据
[root@cephmanager01 ~]# cd /mnt && echo 'hello world' > aa.txt
# 查看底层的存储组织方式
[root@cephmanager01 mnt]# rados -p p_rbd ls --all
#查看磁盘情况
[root@cephmanager01 mnt]# ceph df
8) 查看相关映射情况
[root@cephmanager01 mnt]# rbd showmapped
2.2 RBD挂载到客户端操作系统
服务器端:cephmanager01
客户端:192.168.10.57 CentOS7.5 64bit
2.2.1 客户端环境准备
- 确保内核高于2.6
- 确保加载了rbd模块
- 安装ceph-common
[客户端验证]
# 内核版本高于2.6
[root@localhost ~]# uname -r
# 加载rbd模块
[root@localhost ~]# modprobe rbd
# 取人加载rbd模块成功,返回0为成功
[root@localhost ~]# echo $?
# 按爪给你ceph-common
[root@localhost ~]# yum install -y ceph-common
2.2.2 服务器配置
1)创建ceph块客户端认证
# 切换到cephuser的cluster目录
[root@cephmanager01 ~]# su - cephuser
[cephuser@cephmanager01 ~]$ cd cephcluster/
# 创建了对pool名为p_rbd的认证权限
[cephuser@cephmanager01 cephcluster]$ sudo ceph auth get-or-create client.rbd mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=p_rbd' |tee ./ceph.client.rbd.keyring
# 查看权限
[cephuser@cephmanager01 cephcluster]$ sudo ceph auth get client.rbd
# 确保当前目录生产了ceph.client.rbd.keyring文件
2)拷贝配置文件到客户端并验证
# 拷贝ceph.conf和密钥文件到客户端
[cephuser@cephmanager01 cephcluster]$ sudo scp ceph.conf ceph.client.rbd.keyring root@192.168.10.57:/etc/ceph/
# 客户端验证,需要到客户端操作系统下执行,能返回id和服务器一样则验证成功
[root@localhost ceph]# ceph -s --name client.rbd
3)服务器端创建池
[cephuser@cephmanager01 cephcluster]$ sudo ceph osd lspools
# 这里借用上面创建的p_rbd
2.2.3 客户端配置
客户端执行
1)创建一个容量为10G的rbd块设备
[root@localhost ceph]# rbd create image002 --size 10240 --name client.rbd -p p_rbd
# 客户端查看查看image002块设
[root@localhost ceph]# rbd ls --name client.rbd -p p_rbd
# 查看image002块设备信息
[root@localhost ceph]# rbd --image image002 info --name client.rbd -p p_rbd
2)禁用当前系统内核不支持的feature
依然要先禁用当前系统内核不支持的feature,否则映射的时候会报错
[root@localhost ceph]# rbd feature disable image002 exclusive-lock object-map fast-diff deep-flatten --name client.rbd -p p_rbd
• layering: 分层支持
• exclusive-lock: 排它锁定支持对
• object-map: 对象映射支持(需要排它锁定(exclusive-lock))
• deep-flatten: 快照平支持(snapshot flatten support)
• fast-diff: 在client-node1上使用krbd(内核rbd)客户机进行快速diff计算(需要对象映射),我们将无法在CentOS内核3.10上映射块设备映像,因为该内核不支持对象映射(object-map)、深平(deep-flatten)和快速diff(fast-diff)(在内核4.9中引入了支持)。为了解决这个问题,我们将禁用不支持的特性,有几个选项可以做到这一点:
1)动态禁用
rbd feature disable image002 exclusive-lock object-map deep-flatten fast-diff --name client.rbd
2) 创建RBD镜像时,只启用 分层特性。
rbd create image003 --size 10240 --image-feature layering --name client.rbd
3)ceph 配置文件中禁用
rbd_default_features = 1
3) 客户端映射块设备
# 对image002进行映射
[root@localhost ceph]# rbd map --image image002 --name client.rbd -p p_rb
# 查看本机已经映射的rbd镜像
[root@localhost ceph]# rbd showmapped --name client.rbd
# 查看磁盘rbd0大小,这个时候可以看到在本地多了一个/dev/rbd0的磁盘
[root@localhost ceph]# lsblk
# 格式化rbd0
[root@localhost ceph]# mkfs.xfs /dev/rbd0
# 创建挂在目录并进行挂载
[root@localhost ceph]# mkdir /ceph_disk_rbd
[root@localhost ceph]# mount /dev/rbd0 /ceph_disk_rbd/
# 写入数据测试
[root@localhost ceph_disk_rbd]# dd if=/dev/zero of=/ceph_disk_rbd/file01 count=100 bs=1M
# 查看写入文件大小,确认是否100M
[root@localhost ceph_disk_rbd]# du -sh /ceph_disk_rbd/file0
4)配置开机自动挂载
/usr/local/bin/rbd-mount文件需要根据实际情况修改
# 如果不能连接raw.githubusercontent.com,请选择科学上网
[root@localhost ceph]# wget -O /usr/local/bin/rbd-mount https://raw.githubusercontent.com/aishangwei/ceph-demo/master/client/rbd-mount
内容如下:
#!/bin/bash
# Pool name where block device image is stored,根据实际情况修改
export poolname=rbd
# Disk image name,根据实际情况修改
export rbdimage=rbd1
# Mounted Directory,根据实际情况修改
export mountpoint=/mnt/ceph-disk1
# Image mount/unmount and pool are passed from the systemd service as arguments,根据实际情况修改
# Are we are mounting or unmounting
if [ "$1" == "m" ]; then
modprobe rbd
rbd feature disable $rbdimage object-map fast-diff deep-flatten
rbd map $rbdimage --id rbd --keyring /etc/ceph/ceph.client.rbd.keyring
mkdir -p $mountpoint
mount /dev/rbd/$poolname/$rbdimage $mountpoint
fi
if [ "$1" == "u" ]; then
umount $mountpoint
rbd unmap /dev/rbd/$poolname/$rbdimage
fi
[root@localhost ceph]# chmod +x /usr/local/bin/rbd-mount
[root@localhost ceph]# wget -O /etc/systemd/system/rbd-mount.service https://raw.githubusercontent.com/aishangwei/ceph-demo/master/client/rbd-mount.service
# 内容如下:
[Unit]
Description=RADOS block device mapping for $rbdimage in pool $poolname"
Conflicts=shutdown.target
Wants=network-online.target
After=NetworkManager-wait-online.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/rbd-mount m
ExecStop=/usr/local/bin/rbd-mount u
[Install]
WantedBy=multi-user.target
[root@localhost ceph]# systemctl daemon-reload
[root@localhost ceph]# systemctl enable rbd-mount.service
# 卸载手动挂载的目录,进行服务自动挂载测试
[root@localhost ceph]# umount /ceph_disk_rbd
[root@localhost ceph]# systemctl start rbd-mount.service
我环境的配置如图:
2.3 快照配置
2.3.1 快照恢复
1、创建快照
本次快照以2.1章节的p_rbd/image001为例
# 确认image001
[cephuser@cephmanager01 cephcluster]$ sudo rbd ls -p p_rbd
# 查看映射情况
[cephuser@cephmanager01 cephcluster]$ rbd showmapped
# 查看挂载情况
[cephuser@cephmanager01 cephcluster]$ df -h
# 确认文件内容
[root@cephmanager01 mnt]# echo "snap test" > /mnt/cc.txt
[root@cephmanager01 mnt]# ls /mnt
2、创建快照并列出创建的快照
# 创建快照
[cephuser@cephmanager01 ~]$ sudo rbd snap create image001@image001_snap01 -p p_rbd
# 列出快照
[cephuser@cephmanager01 ~]$ sudo rbd snap list image001 -p p_rbd
# 或者用下面命令
[cephuser@cephmanager01 ~]$ sudo rbd snap ls p_rbd/image001
3、查看快照详细信息
[cephuser@cephmanager01 ~]$ sudo rbd info image001 -p p_rbd
4、删除/mnt/cc.txt,再恢复快照
[cephuser@cephmanager01 ~]$ sudo rbd snap rollback image001@image001_snap01 -p p_rbd
5、重新挂载文件系统,发现已经恢复到之前的状态了
[cephuser@cephmanager01 ~]$ sudo umount /mnt
[cephuser@cephmanager01 ~]$ sudo mount /dev/rbd0 /mnt
# 发现cc.txt依然存在
[cephuser@cephmanager01 ~]$ sudo ls /mnt/
2.3.1 快照克隆
本次快照以2.2章节的p_rbd/image003为例
1、克隆快照(快照必须处于被保护状态才能被克隆)
[cephuser@cephmanager01 cephcluster]$ sudo rbd snap protect image003@image003_snap01 -p p_rbd
# 创建将要被克隆的pool
[cephuser@cephmanager01 cephcluster]$ sudo ceph osd pool create p_clone 32 32
# 进行clone
[cephuser@cephmanager01 cephcluster]$ sudo rbd clone p_rbd/image003@image003_snap01 p_clone/image003_clone01
# 查看clone后的rbd
[cephuser@cephmanager01 cephcluster]$ sudo rbd ls -p p_clone
2、查看快照的children和parent关系
# 查看快照的children
[cephuser@cephmanager01 cephcluster]$ sudo rbd children image003@image003_snap01 -p p_rbd
# 确认 parent信息
[cephuser@cephmanager01 ~]$ sudo rbd info --image p_clone/image003_clone01
# 去掉快照的parent
[cephuser@cephmanager01 cephcluster]$ sudo rbd flatten p_clone/image003_clone01
3、删除快照
# 去掉快照保护
[cephuser@cephmanager01 ~]$ sudo rbd snap unprotect image003@image003_snap01 -p p_rbd
# 删除快照
[cephuser@cephmanager01 ~]$ sudo rbd snap remove image003@image003_snap01 -p p_rbd