04 Ceph RBD介绍和使用

    技术2022-07-13  82

    参考连接:<http://docs.ceph.org.cn/rbd/rbd/>;

    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
    Processed: 0.011, SQL: 10