一、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.rbdid 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
四、调整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
来源:https://www.cnblogs.com/cyleon/p/12291580.html