• Ceph 块存储及客户端配置(二)


    一、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
  • 相关阅读:
    HDU5343:MZL's Circle Zhou(SAM,记忆化搜索DP)
    动归皆背包——那些做过的背包
    CODEVS 3943 数学奇才琪露诺
    codevs 1540 银河英雄传说
    CODEVS 1004四子连棋
    洛谷1082 同余方程
    洛谷1006 传纸条
    洛谷1508 Likecloud-吃、吃、吃
    洛谷1108 低价购买
    洛谷1156 垃圾陷阱
  • 原文地址:https://www.cnblogs.com/cyleon/p/12291580.html
Copyright © 2020-2023  润新知