一、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 对象存储 开发resutful api_客户端

 二、客户端安装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默认池

ceph 对象存储 开发resutful api_块设备_02

确定 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 客户端映射块设备,直接映射会报错

ceph 对象存储 开发resutful api_客户端_03

 使用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 制作成服务开机自动挂载

ceph 对象存储 开发resutful api_块设备_04

ceph 对象存储 开发resutful api_客户端_05

[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的这一特性提供了更高的灵活性,在云平台中非常有用。

ceph 对象存储 开发resutful api_文件系统_06

 每个克隆的图像(子图像)都存储其父快照的引用以读取图像数据。因此,在将父快照用于克隆之前,应对其进行保护。在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