参考连接:;

1 RBD简单介绍

​ Ceph块设备,RADOS Block Device的简称,为客户机提供可靠的、分布式的和高性能的块存储磁盘。RADOS块设备利用librbd库并以顺序的形式在Ceph集群中的多个osd上存储数据块。RBD是由Ceph的RADOS层支持的,因此每个块设备都分布在多个Ceph节点上,提供了高性能和优异的可靠性。RBD有Linux内核的本地支持,这意味着RBD驱动程序从过去几年就与Linux内核集成得很好。除了可靠性和性能之外,RBD还提供了企业特性,例如完整和增量快照、瘦配置、写时复制克隆、动态调整大小等等。RBD还支持内存缓存,这大大提高了其性能:
04 Ceph RBD介绍和使用_第1张图片

​ 块设备本质就是将裸磁盘或类似裸磁盘(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

04 Ceph RBD介绍和使用_第2张图片

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

04 Ceph RBD介绍和使用_第3张图片

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 [email protected]:/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

04 Ceph RBD介绍和使用_第4张图片

• 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

我环境的配置如图:

04 Ceph RBD介绍和使用_第5张图片

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

04 Ceph RBD介绍和使用_第6张图片

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