一、Ceph RDB介绍
Ceph块设备,以前称为RADOS设备,为客户机提供可靠的、分布式的和高性能的块存储磁盘。RADOS块设备利用librbd库,并以顺序的形式在Ceph集群中的多个osd上存储数据块。RBD是由Ceph的RADOS层支持的,因此每个块设备都分布在多个Ceph节点上,提供了高性能和优异的可靠性。RDB有Linux内核的本地支持,这意味着RBD驱动程序从过去几年就与Linux内核集成得很好。除了可靠性和性能之外,RDB还提供了企业特性,例如:完整和增量快照、瘦配置、写时复制克隆、动态调整大小等等。RDB还支持内存缓存,这大大提高了其性能。任何普通的Linux主机(RHEL或基于debian的)都可以充当Ceph客户机。客户端通过网络与Ceph存储集群交互以存储或检索用户数据。Ceph RBD支持已经添加到Linux主线内核中,从2.6.34和以后的版本开始。
二、客户端安装Ceph软件包
2.1 检查内核是否支持RBD
[root@192-168-5-70 ~]# uname -r
3.10.0-957.el7.x86_64
[root@192-168-5-70 ~]# modprobe rbd
[root@192-168-5-70 ~]# echo $?
0
2.2 安装ceph软件
# 配置yum源
[root@192-168-5-70 ~]# vim /etc/yum.repos.d/ceph.repo
[ceph]
name=ceph
baseurl=http://mirrors.aliyun.com/ceph/rpm-mimic/el7/x86_64/
gpgcheck=0
[ceph-noarch]
name=cephnoarch
baseurl=http://mirrors.aliyun.com/ceph/rpm-mimic/el7/noarch/
gpgcheck=0
# 安装ceph软件,要使用rbd命令
[root@192-168-5-70 ~]# yum install ceph -y
三、为客户端创建Ceph块设备使用的用户名和密钥
3.1 使用ceph-deploy部署后并没有创建任何池,现在要创建块设备rbd默认池
确定 pg_num 取值是强制性的,因为不能自动计算。下面是几个常用的值(总的pg):
• 少于 5 个 OSD 时可把 pg_num 设置为 128
• OSD 数量在 5 到 10 个时,可把 pg_num 设置为 512
• OSD 数量在 10 到 50 个时,可把 pg_num 设置为 4096
• OSD 数量大于 50 时,你得理解权衡方法、以及如何自己计算 pg_num 取值
[cephadmin@ceph01 my-cluster]$ ceph osd lspools # 查看集群存储池
[cephadmin@ceph01 my-cluster]$ ceph osd pool create rbd 64 # pg测试创建为64
删除pool的方法
# 在ceph.conf中增加一行信息
[cephadmin@ceph01 my-cluster]$ sudo vim /etc/ceph/ceph.conf
[global]
mon_allow_pool_delete = true
# 重启ceph-mon.target服务
[cephadmin@ceph01 my-cluster]$ sudo systemctl restart ceph-mon.target
# 删除pool操作
[cephadmin@ceph01 my-cluster]$ ceph osd pool rm rbd rbd --yes-i-really-really-mean-it
3.2 在rbd池中创建大小为2G的块设备
[cephadmin@ceph01 my-cluster]$ rbd create rbd1 --size 2048 --name client.rbd
对块的其它操作
[cephadmin@ceph01 my-cluster]$ rbd ls # 查看所有的块
[cephadmin@ceph01 my-cluster]$ rbd ls -p rbd # -p 指定池的名称,查看池中所有的块
[cephadmin@ceph01 my-cluster]$ rbd info rbd/rbd1 # 查看块的具体信息
[cephadmin@ceph01 my-cluster]$ rbd rm rbd/rbd1 # 删除块
3.4 在管理端的进行创建帐号密码,也可以直接使用管理员帐号。
# 帐户名称是:client.rbd,mon允许读,osd允许读,rbd池允许读写和执行,并把输出的内容写入到 ceph.client.rbd.keyring文件中
[cephadmin@ceph01 my-cluster]$ ceph auth get-or-create client.rbd mon 'allow r' osd 'allow class-read object_prefix rbd_children, allow rwx pool=rbd' | tee ./ceph.client.rbd.keyring
[client.rbd]
key = AQACvTdesdXGCBAAqUAA5/wxwgvcGsb1vJ03jw==
3.5 将生成的key和配置文件拷贝到客户端
[cephadmin@ceph01 my-cluster]$ scp ceph.client.rbd.keyring /etc/ceph/ceph.conf root@192.168.5.70:/etc/ceph/
配置文件中只需要两行即可
[root@192-168-5-70 ~]# cat /etc/ceph/ceph.conf
[global]
mon_host = 192.168.5.91,192.168.5.92,192.168.5.93
3.5 客户端映射块设备,直接映射会报错
使用krbd(内核rbd)的客户端进行快速diff计算(需要对象映射),我们将无法在CentOS内核3.10上映射块设备映像,因为该内核不支持对象映射(object-map)、深平(deep-flatten)和快速diff(fastdiff)(在内核4.9中引入了支持)。为了解决这个问题,我们将禁用不支持的特性,有几个选项可以做到这一点:
# 动态禁用
rbd feature disable rbd1 exclusive-lock object-map deep-flatten fast-diff --name client.rbd
# 创建RBD镜像时,只启用分层特性。
rbd create rbd1 --size 3072 --image-feature layering --name client.rbd
# ceph 配置文件中禁用
rbd_default_features = 1
3.6 禁用后再进行映射rbd1块设备
[root@192-168-5-70 ~]# rbd map --image rbd1 --name client.rbd
/dev/rbd0
# 查看所有的映射
[root@192-168-5-70 ~]# rbd showmapped --name client.rbd
id pool image snap device
0 rbd rbd1 - /dev/rbd0
# 取消映射
[root@192-168-5-70 ~]# rbd unmap /dev/rbd0
3.7 格式化文件系统并挂载
[root@192-168-5-70 ~]# mkfs.xfs /dev/rbd0 # 格式化文件系统
[root@192-168-5-70 ~]# mkdir /mnt/ceph-disk1 # 创建挂载目录
[root@192-168-5-70 ~]# mount /dev/rbd0 /mnt/ceph-disk1 # 进行挂载
[root@192-168-5-70 ~]# df -h /mnt/ceph-disk1/
Filesystem Size Used Avail Use% Mounted on
/dev/rbd0 2.0G 33M 3.0G 2% /mnt/ceph-disk1
[root@192-168-5-70 ~]# dd if=/dev/zero of=/mnt/ceph-disk1/test_file1.txt count=100 bs=2M # 向目录写入数据
100+0 records in
100+0 records out
209715200 bytes (210 MB) copied, 0.250715 s, 836 MB/s
3.8 制作成服务开机自动挂载
[root@192-168-5-70 ~]# cat /usr/local/bin/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@192-168-5-70 ~]# chmod +x /usr/local/bin/rbd-mount
[root@192-168-5-70 ~]# cat /etc/systemd/system/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@192-168-5-70 ~]# systemctl daemon-reload
[root@192-168-5-70 ~]# systemctl enable rbd-mount.service
[root@192-168-5-70 ~]# reboot
vim /usr/local/bin/rbd-mount
四、调整Ceph RBD块大小
Ceph支持 精简配置 块设备,这意味着在开始在块设备上存储数据之前,物理存储空间不会被占用。Ceph Block Device非常灵活;可以从Ceph存储端动态增加或减少RBD的大小。但是, 底层文件系统应该支持 调整大小。高级文件系统(如XFS,Btrfs,EXT,ZFS等)支持文件系统在一定程度上调整大小。
XFS目前不支持收缩,Btrfs和ext4支持收缩,但应谨慎行事!收缩不小心,老板两行泪。
4.1 在挂载目录再创建一个文件
[root@192-168-5-70 ~]# echo 'hello ceph' > /mnt/ceph-disk1/file2.txt
[root@192-168-5-70 ~]# ls /mnt/ceph-disk1/
file2.txt test_file1.txt
4.2 将rbd1由3G扩容到4G
[root@192-168-5-70 ~]# rbd resize --image rbd1 --size 4096 --name client.rbd
Resizing image: 100% complete...done.
[root@192-168-5-70 ~]# rbd info --image rbd1 --name client.rbd
rbd image 'rbd1':
size 4 GiB in 1024 objects
order 22 (4 MiB objects)
id: 11d36b8b4567
block_name_prefix: rbd_data.11d36b8b4567
format: 2
features: layering
op_features:
flags:
create_timestamp: Mon Feb 3 14:59:19 2020
[root@192-168-5-70 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
vda 253:0 0 50G 0 disk
└─vda1 253:1 0 50G 0 part /
rbd0 252:0 0 4G 0 disk /mnt/ceph-disk1
[root@192-168-5-70 ~]# df -h /mnt/ceph-disk1 # 检查文件系统并没有及时调整到4G
Filesystem Size Used Avail Use% Mounted on
/dev/rbd0 3.0G 233M 2.8G 8% /mnt/ceph-disk1
[root@192-168-5-70 ~]# dmesg | grep -i capacity
[ 8.094900] rbd: rbd0: capacity 3221225472 features 0x1
[ 2864.714459] rbd0: detected capacity change from 3221225472 to 4294967296
4.3 让文件系统重新读取一下
[root@192-168-5-70 ~]# xfs_growfs -d /mnt/ceph-disk1/
meta-data=/dev/rbd0 isize=512 agcount=12, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0 spinodes=0
data = bsize=4096 blocks=786432, imaxpct=25
= sunit=1024 swidth=1024 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 786432 to 1048576
[root@192-168-5-70 ~]# df -h /mnt/ceph-disk1
Filesystem Size Used Avail Use% Mounted on
/dev/rbd0 4.0G 233M 3.8G 6% /mnt/ceph-disk1
[root@192-168-5-70 ~]# ls /mnt/ceph-disk1/
file2.txt test_file1.txt
五、创建RBD快照
Ceph扩展了对快照的全面支持,快照是 RBD image 时间点 只读副本。您可以保留 Ceph RBDimage 的状态,通过创建快照和还原快照来获取原始数据。如果在 I/O 正在进行 image 处理时拍摄 RBD image 的快照,则快照可能不一致。如果发生这种情况,您将需要将快照克隆到新映像以使其可安装。拍摄快照时,建议在拍摄快照之前停止应用程序中的 I/O 。这可以通过自定义应用程序以在快照之前发出冻结来完成,也可以使用该 fsfreeze 命令手动完成 。
5.1 创建快照
语法:rbd snap create <pool name>/<image name>@<snap name>
[root@192-168-5-70 ~]# rbd snap create rbd/rbd1@snapshot1 -n client.rbd # 创建快照,名称是snapshot1
[root@192-168-5-70 ~]# rbd snap ls rbd/rbd1 -n client.rbd # 查看rbd1的快照
SNAPID NAME SIZE TIMESTAMP
8 snapshot1 4 GiB Mon Feb 10 15:42:07 2020
5.2 删除文件进行快照恢复
[root@192-168-5-70 ~]# rm -rf /mnt/ceph-disk1/* # 删除文件
[root@192-168-5-70 ~]# umount /mnt/ceph-disk1 # 卸载目录
[root@192-168-5-70 ~]# rbd snap rollback rbd/rbd1@snapshot1 --name client.rbd # 回滚快照
Rolling back to snapshot: 100% complete...done.
[root@192-168-5-70 ~]# mount /dev/rbd0 /mnt/ceph-disk1 # 重新挂载
[root@192-168-5-70 ~]# ls /mnt/ceph-disk1/ # 文件和内容都还存在
file2.txt test_file1.txt
[root@192-168-5-70 ~]# cat /mnt/ceph-disk1/file2.txt
hello ceph
5.3 重命名快照
[root@192-168-5-70 ~]# rbd snap rename rbd/rbd1@snapshot1 rbd/rbd1@snapshot1_newname -n client.rbd
5.4 删除快照
[root@192-168-5-70 ~]# rbd snap rm rbd/rbd1@snapshot1_newname -n client.rbd # 按名称删除快照
Removing snap: 100% complete...done.
[root@192-168-5-70 ~]# rbd snap purge rbd/rbd1 --name client.rbd # 删除多个快照
六、克隆
Ceph支持一个非常好的功能用于从RBD快照创建写入时复制(COW)克隆。这也称为Ceph中的快照分层。分层允许客户创建Ceph RBD的多个即时克隆。这个功能对于OpenStack,CloudStack,Qemu/KVM等云和虚拟化平台非常有用。这些平台通常以快照的形式保护包含 OS/VM 映像的Ceph RBD映像。稍后,将多次克隆此快照以生成新的虚拟机/实例。快照是只读的,但COW克隆是完全可写的; Ceph的这一特性提供了更高的灵活性,在云平台中非常有用。
每个克隆的图像(子图像)都存储其父快照的引用以读取图像数据。因此,在将父快照用于克隆之前,应对其进行保护。在COW克隆映像上写入数据时,它会将新数据引用存储到自身。COW克隆图像与RBD一样好。它们像RBD一样非常灵活,这意味着它们可写,可调整大小,并支持快照和进一步克隆。
6.1 创建具有layering功能的RBD image
[root@192-168-5-70 ~]# rbd create rbd-2 --size 2048 --image-feature layering --name client.rbd
[root@192-168-5-70 ~]# rbd info --image rbd-2 -n client.rbd
rbd image 'rbd-2':
size 2 GiB in 512 objects
order 22 (4 MiB objects)
id: 858c6b8b4567
block_name_prefix: rbd_data.858c6b8b4567
format: 2
features: layering
op_features:
flags:
create_timestamp: Mon Feb 10 15:59:26 2020
6.2 挂载rbd-2设备
[root@192-168-5-70 ~]# rbd map --image rbd-2 --name client.rbd
/dev/rbd1
[root@192-168-5-70 ~]# mkfs.xfs /dev/rbd1
meta-data=/dev/rbd1 isize=512 agcount=8, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=0, sparse=0
data = bsize=4096 blocks=524288, imaxpct=25
= sunit=1024 swidth=1024 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=1
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=8 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@192-168-5-70 ~]# mkdir /mnt/ceph-disk2
[root@192-168-5-70 ~]# mount /dev/rbd1 /mnt/ceph-disk2
[root@192-168-5-70 ~]# echo 'lzfn ceph-2 20200210' > /mnt/ceph-disk2/rbd2file.txt
[root@192-168-5-70 ~]# sync
6.3 为rbd-2的image创建快照,并保护快照。
要创建COW克隆,需要保护快照。这是一个重要的步骤,因为如果快照被删除,所有附加的COW克隆将被销毁
[root@192-168-5-70 ~]# rbd snap create rbd/rbd-2@snapshot_for_clone -n client.rbd # 创建快照名称为snapshot_for_clone
[root@192-168-5-70 ~]# rbd snap protect rbd/rbd-2@snapshot_for_clone -n client.rbd # 保护上面创建的快照
[root@192-168-5-70 ~]# echo 'new file protect after' > /mnt/ceph-disk2/protect.txt # 挂载目录写入一个新文件
6.4 创建链接克隆
[root@192-168-5-70 ~]# rbd clone rbd/rbd-2@snapshot_for_clone rbd/clone_rbd2 --image-feature layering -n client.rbd
[root@192-168-5-70 ~]# rbd info rbd/clone_rbd2 -n client.rbd
rbd image 'clone_rbd2':
size 2 GiB in 512 objects
order 22 (4 MiB objects)
id: 14456b8b4567
block_name_prefix: rbd_data.14456b8b4567
format: 2
features: layering
op_features:
flags:
create_timestamp: Mon Feb 10 16:18:38 2020
parent: rbd/rbd-2@snapshot_for_clone # 有父级镜像的名称
overlap: 2 GiB
# 可以反向查询
[root@192-168-5-70 ~]# rbd children rbd/rbd-2@snapshot_for_clone -n client.rbd
rbd/clone_rbd2
[root@192-168-5-70 ~]# rbd ls -n client.rbd
clone_rbd2
rbd-2
rbd1
# 重新挂载后创建新的文件
[root@192-168-5-70 ~]# umount /mnt/ceph-disk2
[root@192-168-5-70 ~]# rbd map --image clone_rbd2 --name client.rbd
/dev/rbd2
[root@192-168-5-70 ~]# mount /dev/rbd2 /mnt/ceph-disk2
[root@192-168-5-70 ~]# ls /mnt/ceph-disk2/
rbd2file.txt
[root@192-168-5-70 ~]# echo 'clone_rbd2 file' > /mnt/ceph-disk2/clone_rbd2
6.5 创建完整克隆
在 ceph 中,可能叫 flatten ,摊平的意思,但我感觉,叫完整克隆,更便于理解,它与平常的完整克隆不一样的地方是,平常的完整克隆,直接把父 image 上拷贝过来。而这个 flatten ,则是把把父image 拷贝过来后,再把链接克隆上面的内容进行覆盖上去。目前我们有一个链接克隆,它依赖于于 父镜像 ,有的时候,我们不希望这样,而想让他完全独立,这时候就需要完整克隆了,完整克隆是 浪费磁盘 空间的,并且速度较慢。
[root@192-168-5-70 ~]# rbd flatten rbd/clone_rbd2 -n client.rbd # 创建完整克隆
Image flatten: 100% complete...done.
[root@192-168-5-70 ~]# rbd info --image clone_rbd2 -n client.rbd # 已无父级镜像的名称,默认情况下与其父级分离
rbd image 'clone_rbd2':
size 2 GiB in 512 objects
order 22 (4 MiB objects)
id: 14996b8b4567
block_name_prefix: rbd_data.14996b8b4567
format: 2
features: layering
op_features:
flags:
create_timestamp: Mon Feb 10 16:38:58 2020
6.6 删除父级镜像
[root@192-168-5-70 ~]# rbd snap unprotect rbd/rbd-2@snapshot_for_clone -n client.rbd # 去掉快照保护
[root@192-168-5-70 ~]# rbd snap rm rbd/rbd-2@snapshot_for_clone -n client.rbd # 删除快照
Removing snap: 100% complete...done.
6.7 验证文件
# 验证原文件
[root@192-168-5-70 ~]# rbd list -n client.rbd
clone_rbd2
rbd-2
rbd1
[root@192-168-5-70 ~]# umount /mnt/ceph-disk2
[root@192-168-5-70 ~]# mount /dev/rbd1 /mnt/ceph-disk2
[root@192-168-5-70 ~]# ls /mnt/ceph-disk2/
protect.txt rbd2file.txt
# 验证完整克隆image
[root@192-168-5-70 ~]# umount /mnt/ceph-disk2
[root@192-168-5-70 ~]# mount /dev/rbd2 /mnt/ceph-disk2
[root@192-168-5-70 ~]# ls /mnt/ceph-disk2
clone_rbd2 rbd2file.txt