参考连接:<http://docs.ceph.org.cn/rbd/rbd/>;
Ceph块设备,RADOS Block Device的简称,为客户机提供可靠的、分布式的和高性能的块存储磁盘。RADOS块设备利用librbd库并以顺序的形式在Ceph集群中的多个osd上存储数据块。RBD是由Ceph的RADOS层支持的,因此每个块设备都分布在多个Ceph节点上,提供了高性能和优异的可靠性。RBD有Linux内核的本地支持,这意味着RBD驱动程序从过去几年就与Linux内核集成得很好。除了可靠性和性能之外,RBD还提供了企业特性,例如完整和增量快照、瘦配置、写时复制克隆、动态调整大小等等。RBD还支持内存缓存,这大大提高了其性能:
块设备本质就是将裸磁盘或类似裸磁盘(lvm)设备映射给主机使用,主机可以对其进行格式化并存储和读取数据,块设备读取速度快但是不支持共享。
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 stat2) 创建一个块设备(10G)
[cephuser@cephmanager01 cephcluster]$ sudo rbd create --size 10240 image001 -p p_rbd3) 查看块设备
[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 --all4) 禁用当前系统内核不支持的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_rbd5) 将块设备映射到系统内核
[cephuser@cephmanager01 cephcluster]$ sudo rbd map image001 -p p_rbd # map成功后,会出现/dev/rbd0 [cephuser@cephmanager01 cephcluster]$ lsblk6) 格式化块设备镜像
[cephuser@cephmanager01 cephcluster]$ sudo mkfs.xfs /dev/rbd07) 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 df8) 查看相关映射情况
[root@cephmanager01 mnt]# rbd showmapped服务器端: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-common2.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.rbd3)服务器端创建池
[cephuser@cephmanager01 cephcluster]$ sudo ceph osd lspools # 这里借用上面创建的p_rbd2.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_rbd2)禁用当前系统内核不支持的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/file04)配置开机自动挂载
/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.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 /mnt2、创建快照并列出创建的快照
# 创建快照 [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/image0013、查看快照详细信息
[cephuser@cephmanager01 ~]$ sudo rbd info image001 -p p_rbd4、删除/mnt/cc.txt,再恢复快照
[cephuser@cephmanager01 ~]$ sudo rbd snap rollback image001@image001_snap01 -p p_rbd5、重新挂载文件系统,发现已经恢复到之前的状态了
[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_clone2、查看快照的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_clone013、删除快照
# 去掉快照保护 [cephuser@cephmanager01 ~]$ sudo rbd snap unprotect image003@image003_snap01 -p p_rbd # 删除快照 [cephuser@cephmanager01 ~]$ sudo rbd snap remove image003@image003_snap01 -p p_rbd