zoukankan      html  css  js  c++  java
  • ceph块存储场景

    image

    1、创建rbd使用的存储池。

    admin节点需要安装ceph才能使用该命令,如果没有,也可以切换到ceph-node1节点去操作。

    [cephfsd@ceph-admin ceph]$ ceph osd pool create rbd_data 64 64
    pool 'rbd_data' created
    [cephfsd@ceph-admin ceph]$ rbd pool init rbd_data
    [cephfsd@ceph-admin ceph]$ ceph -s
      cluster:
        id:     6d3fd8ed-d630-48f7-aa8d-ed79da7a69eb
        health: HEALTH_OK
      
      services:
        mon: 1 daemons, quorum ceph-admin
        mgr: ceph-admin(active)
        mds: cephfs-1/1/1 up  {0=ceph-node3=up:active}, 2 up:standby
        osd: 3 osds: 3 up, 3 in
      
      data:
        pools:   3 pools, 192 pgs
        objects: 21 objects, 7.77KiB
        usage:   3.00GiB used, 27.0GiB / 30.0GiB avail
        pgs:     192 active+clean
      
    [cephfsd@ceph-admin ceph]$

    注:

    # 不能使用之前已经注册的pool。
    [cephfsd@ceph-admin opt]$ sudo rbd pool init cephfs_data
    rbd: pool already registered to a different application.
    [cephfsd@ceph-admin opt]$

    2、创建rbd

    可以看到,rbd池的pg创建完成了,默认情况下,使用的pool是3副本配置,测试创建一块rbd试下

    [cephfsd@ceph-admin ceph]$ rbd create testrbd --size=10G
    rbd: error opening default pool 'rbd'
    Ensure that the default pool has been created or specify an alternate pool name.
    [cephfsd@ceph-admin ceph]
    # 加上-p参数,指定pool的名字
    [cephfsd@ceph-admin ceph]$ rbd create testrbd --size=10G -p rbd_data
    或者
    [cephfsd@ceph-admin ceph]$ rbd create rbd_data/testrbd --size=10G
    [cephfsd@ceph-admin ceph]$ rbd info rbd_data/testrbd
    rbd image 'testrbd':
        size 10GiB in 2560 objects
        order 22 (4MiB objects)
        block_name_prefix: rbd_data.373e6b8b4567
        format: 2
        features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
        flags:
        create_timestamp: Fri Dec  6 16:06:55 2019
    [cephfsd@ceph-admin ceph]$

    3、映射rbd块设备到服务器。

    # 在Ceph client端将该rbd镜像映射为本地设备时出错。
    [cephfsd@ceph-admin ceph]$ sudo rbd map rbd_data/testrbd
    rbd: sysfs write failed
    RBD image feature set mismatch. You can disable features unsupported by the kernel with "rbd feature disable rbd_data/testrbd object-map fast-diff deep-flatten".
    In some cases useful info is found in syslog - try "dmesg | tail".
    rbd: map failed: (6) No such device or address
    # 查看系统打印的信息
    [cephfsd@ceph-admin ceph]$ dmesg | tail
    [147187.581929] fuse init (API version 7.23)
    [154167.356761] libceph: mon0 172.16.143.121:6789 session established
    [154167.356931] libceph: client14124 fsid 6d3fd8ed-d630-48f7-aa8d-ed79da7a69eb
    [171895.244253] rbd: loaded (major 252)
    [174742.162661] libceph: mon0 172.16.143.121:6789 session established
    [174742.162851] libceph: client14145 fsid 6d3fd8ed-d630-48f7-aa8d-ed79da7a69eb
    [174742.166056] rbd: image testrbd: image uses unsupported features: 0x38
    [175730.260351] libceph: mon0 172.16.143.121:6789 session established
    [175730.260439] libceph: client14148 fsid 6d3fd8ed-d630-48f7-aa8d-ed79da7a69eb
    [175730.263530] rbd: image testrbd: image uses unsupported features: 0x38
    [cephfsd@ceph-admin ceph]$
    # 查看系统内核版本
    [cephfsd@ceph-admin ceph]$ uname -a
    Linux ceph-admin 3.10.0-1062.el7.x86_64 #1 SMP Wed Aug 7 18:08:02 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
    [cephfsd@ceph-admin ceph]$ ceph --version
    ceph version 12.2.12 (1436006594665279fe734b4c15d7e08c13ebd777) luminous (stable)
    # 再查看testrbd映像的特性
    [cephfsd@ceph-admin ceph]$ rbd info rbd_data/testrbd
    rbd image 'testrbd':
        size 10GiB in 2560 objects
        order 22 (4MiB objects)
        block_name_prefix: rbd_data.373e6b8b4567
        format: 2
        features: layering, exclusive-lock, object-map, fast-diff, deep-flatten
        flags:
        create_timestamp: Fri Dec  6 16:06:55 2019
    [cephfsd@ceph-admin ceph]$

    可以看到testrbd拥有特性:layering, exclusive-lock, object-map, fast-diff, deep-flatten

    这些特性分别表示:

    • layering: 支持分层
    • striping: 支持条带化 v2
    • exclusive-lock: 支持独占锁
    • object-map: 支持对象映射(依赖 exclusive-lock )
    • fast-diff: 快速计算差异(依赖 object-map )
    • deep-flatten: 支持快照扁平化操作
    • journaling: 支持记录 IO 操作(依赖独占锁)

    不过遗憾的是CentOS的3.10内核仅支持其中的layering feature,其他feature概不支持。我们需要手动disable这些features:

    方法一:直接disable
    # 禁止其他features
    [cephfsd@ceph-admin ceph]$ rbd feature disable rbd_data/testrbd exclusive-lock, object-map, fast-diff, deep-flatten
    [cephfsd@ceph-admin ceph]$ rbd info rbd_data/testrbd
    rbd image 'testrbd':
        size 10GiB in 2560 objects
        order 22 (4MiB objects)
        block_name_prefix: rbd_data.373e6b8b4567
        format: 2
        features: layering
        flags:
        create_timestamp: Fri Dec  6 16:06:55 2019
    [cephfsd@ceph-admin ceph]$ 

    禁用特性后,再次映射成功。

    [cephfsd@ceph-admin ceph]$ sudo rbd map rbd_data/testrbd
    /dev/rbd0
    [cephfsd@ceph-admin ceph]$ ll /dev/rbd0
    brw-rw----. 1 root disk 252, 0 Dec  6 17:09 /dev/rbd0
    方法二:修改配置ceph.conf
    # 不过每次这么来disable可是十分麻烦的,一劳永逸的方法是在各个cluster node的/etc/ceph/ceph.conf中加上这样一行配置:
    rbd_default_features = 1 #仅是layering对应的bit码所对应的整数
    # 设置完后,通过下面命令查看配置变化
    [cephfsd@ceph-admin ceph]$ ceph --show-config|grep rbd|grep features
    rbd_default_features =

    方法三:修改format版本

    经过查看ceph文档rbd 块镜像有支持两种格式: 

    --image-format format-id

    format-id取值为1或2,默认为 2。

    format 1 - 新建 rbd 映像时使用最初的格式。此格式兼容所有版本的 librbd 和内核模块,但是不支持较新的功能,像克隆。

    format 2 - 使用第二版 rbd 格式, librbd 和 3.11 版以上内核模块才支持(除非是分拆的模块)。此格式增加了克隆支持,使得扩展更容易,还允许以后增加新功能。

    这里把format指定为1之后,重新映射就好了。

    # 注意:需要重新建立镜像。
    [cephfsd@ceph-admin ceph]$ rbd create rbd_data/testrbd2 --size=1G --image-format 1
    # 查看已经建立的rbd
    [cephfsd@ceph-admin ceph]$  rbd ls -p rbd_data
    testrbd2
    testrbd
    # 映射该rbd
    [cephfsd@ceph-admin ceph]$ sudo rbd map rbd_data/testrbd2
    /dev/rbd1
    [cephfsd@ceph-admin ceph]$ ll /dev/rbd1
    brw-rw----. 1 root disk 252, 16 Dec  6 17:32 /dev/rbd1

    方法四:指定开启哪个features

    # 创建rbd镜像时就指明需要的特性
    [cephfsd@ceph-admin ceph]$ rbd create rbd_data/testrbd3 --size=1G  --image-feature layering
    [cephfsd@ceph-admin ceph]$ rbd ls -p rbd_data
    testrbd2
    testrbd
    testrbd3
    [cephfsd@ceph-admin ceph]$ rbd map rbd_data/testrbd3
    rbd: sysfs write failed
    In some cases useful info is found in syslog - try "dmesg | tail".
    rbd: map failed: (13) Permission denied
    [cephfsd@ceph-admin ceph]$ sudo rbd map rbd_data/testrbd3
    /dev/rbd2
    [cephfsd@ceph-admin ceph]$ ll /dev/rbd
    rbd/  rbd0  rbd1  rbd2 
    [cephfsd@ceph-admin ceph]$ ll /dev/rbd2
    brw-rw----. 1 root disk 252, 32 Dec  6 17:38 /dev/rbd2
    [cephfsd@ceph-admin ceph]$
    # ok,映射成功,故障解决!

    禁用特性后,再次映射成功。

    # 查看块映射map情况
    [cephfsd@ceph-admin rbd]$ rbd showmapped
    id pool     image    snap device   
    0  rbd_data testrbd  -    /dev/rbd0
    1  rbd_data testrbd2 -    /dev/rbd1
    2  rbd_data testrbd3 -    /dev/rbd2

    4、格式化并挂载该rbd块

    map后,我们就可以像格式化一个空image那样对其进行格式化了,这里格成ext4文件系统(格式化这一步大可不必,在后续小节中你会看到):

    # 格式化该rbd设备
    [cephfsd@ceph-admin ceph]$ sudo mkfs.xfs /dev/rbd0
    meta-data=/dev/rbd0              isize=512    agcount=16, agsize=163840 blks
             =                       sectsz=512   attr=2, projid32bit=1
             =                       crc=1        finobt=0, sparse=0
    data     =                       bsize=4096   blocks=2621440, 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
    # 创建挂载目录
    [cephfsd@ceph-admin ceph]$ sudo mkdir /mnt/rbd
    # 开始挂载
    [cephfsd@ceph-admin ceph]$ sudo mount /dev/rbd0 /mnt/rbd/
    [cephfsd@ceph-admin ceph]$ df -Th
    Filesystem              Type      Size  Used Avail Use% Mounted on
    devtmpfs                devtmpfs  484M     0  484M   0% /dev
    tmpfs                   tmpfs     496M     0  496M   0% /dev/shm
    tmpfs                   tmpfs     496M   39M  458M   8% /run
    tmpfs                   tmpfs     496M     0  496M   0% /sys/fs/cgroup
    /dev/mapper/centos-root xfs        46G  1.9G   44G   5% /
    /dev/sda1               xfs       497M  130M  368M  26% /boot
    tmpfs                   tmpfs     100M     0  100M   0% /run/user/0
    172.16.143.121:6789:/   ceph      8.5G     0  8.5G   0% /opt
    /dev/rbd0               xfs        10G   33M   10G   1% /mnt/rbd
    [cephfsd@ceph-admin ceph]$
    # 挂载成功,写点东西进去
    [cephfsd@ceph-admin rbd]$ sudo touch rbd_test
    [cephfsd@ceph-admin rbd]$ ll
    total 0
    -rw-r--r--. 1 root root 0 Dec  6 18:38 rbd_test
    [cephfsd@ceph-admin rbd]$ sudo vim rbd_test
    [cephfsd@ceph-admin rbd]$ ll
    total 4
    -rw-r--r--. 1 root root 12 Dec  6 18:38 rbd_test
    [cephfsd@ceph-admin rbd]$ cat rbd_test
    adsga
    rbd 0
    [cephfsd@ceph-admin rbd]$

    rbd其他命令

    映射块设备

    # 用 rbd 把映像名映射为内核模块。必须指定映像名、存储池名、和用户名。若 RBD 内核模块尚未加载, rbd 命令会自动加载。
    sudo rbd map {pool-name}/{image-name} --id {user-name}
    # 例如:
    sudo rbd map rbd/myimage --id admin
    # 如果你启用了 cephx 认证,还必须提供密钥,可以用密钥环或密钥文件指定密钥。
    sudo rbd map rbd/myimage --id admin --keyring /path/to/keyring
    sudo rbd map rbd/myimage --id admin --keyfile /path/to/fil

    查看已经映射的块设备

    rbd showmappe

    取消块设备映射

    sudo rbd unmap /dev/rbd/{poolname}/{imagename}

    查看块设备映像

    # 要列出 rbd 存储池中的块设备,可以用下列命令(即 rbd 是默认存储池名字):
    rbd ls
    # 用下列命令罗列某个特定存储池中的块设备,用存储池的名字替换 {poolname} :
    rbd ls {poolname}
    例如:
    rbd ls swimmingpool

    查看映像信息

    # 用下列命令检索某个特定映像的信息,用映像名字替换 {image-name} :
    rbd info {image-name}
    # 例如:
    rbd info foo
    # 用下列命令检索某存储池内的映像的信息,用映像名字替换 {image-name} 、用存储池名字替换 {pool-name} :
    rbd info {pool-name}/{image-name}
    # 例如:
    rbd info swimmingpool/bar

    调整块设备映像大小

    sudo rbd resize --size 512 test/foo --allow-shrink  #调小
    sudo rbd resize --size 4096 test/foo        #调大

    删除块设备

    sudo rbd rm test/foo

    5、创建快照

    [cephfsd@ceph-admin rbd]$ rbd snap create --snap mysnap rbd_data/testrbd
    [cephfsd@ceph-admin rbd]$ rbd snap ls rbd_data/testrbd
    SNAPID NAME    SIZE TIMESTAMP               
         4 mysnap 10GiB Fri Dec  6 19:14:07 2019
    [cephfsd@ceph-admin rbd]$

    如上,创建了一个rbd_data/testrbd的快照,快照名叫mysnap。

    6、回滚

    # 回滚前先看一下现在是什么样子。
    [cephfsd@ceph-admin rbd]$ ll
    total 4
    -rw-r--r--. 1 root root  0 Dec  6 19:17 abc
    -rw-r--r--. 1 root root 12 Dec  6 18:38 rbd_test
    # rbd_test是建快照之前就有的,把所有文件删除
    [cephfsd@ceph-admin rbd]$ sudo rm -rf *
    [cephfsd@ceph-admin rbd]$ ll
    total 0
    [cephfsd@ceph-admin rbd]$ df -TH
    Filesystem              Type      Size  Used Avail Use% Mounted on
    devtmpfs                devtmpfs  508M     0  508M   0% /dev
    tmpfs                   tmpfs     520M     0  520M   0% /dev/shm
    tmpfs                   tmpfs     520M   40M  480M   8% /run
    tmpfs                   tmpfs     520M     0  520M   0% /sys/fs/cgroup
    /dev/mapper/centos-root xfs        49G  2.0G   47G   5% /
    /dev/sda1               xfs       521M  136M  386M  26% /boot
    tmpfs                   tmpfs     104M     0  104M   0% /run/user/0
    172.16.143.121:6789:/   ceph      9.2G     0  9.2G   0% /opt
    /dev/rbd0               xfs        11G   35M   11G   1% /mnt/rbd
    # 卸载块
    [cephfsd@ceph-admin rbd]$ sudo umount /dev/rbd0
    umount: /mnt/rbd: target is busy.
            (In some cases useful info about processes that use
             the device is found by lsof(8) or fuser(1))
    [cephfsd@ceph-admin rbd]$ pwd
    /mnt/rbd
    # 因为当前进入了这个块设备目录,所以无法卸载,先离开当前目录。
    [cephfsd@ceph-admin rbd]$ cd
    # 卸载成功
    [cephfsd@ceph-admin ~]$ sudo umount /dev/rbd0
    [cephfsd@ceph-admin ~]$ df -Th
    Filesystem              Type      Size  Used Avail Use% Mounted on
    devtmpfs                devtmpfs  484M     0  484M   0% /dev
    tmpfs                   tmpfs     496M     0  496M   0% /dev/shm
    tmpfs                   tmpfs     496M   39M  458M   8% /run
    tmpfs                   tmpfs     496M     0  496M   0% /sys/fs/cgroup
    /dev/mapper/centos-root xfs        46G  1.9G   44G   5% /
    /dev/sda1               xfs       497M  130M  368M  26% /boot
    tmpfs                   tmpfs     100M     0  100M   0% /run/user/0
    172.16.143.121:6789:/   ceph      8.5G     0  8.5G   0% /opt
    [cephfsd@ceph-admin ~]$ ll /mnt/rbd/
    total 0
    # 开始回滚
    [cephfsd@ceph-admin ~]$ rbd snap rollback rbd_data/testrbd@mysnap
    Rolling back to snapshot: 100% complete...done.
    # 重新挂载
    [cephfsd@ceph-admin ~]$ sudo mount /dev/rbd0 /mnt/rbd/
    # 检查该文件是否和建立快照时一模一样
    [cephfsd@ceph-admin ~]$ ll /mnt/rbd/
    total 4
    -rw-r--r--. 1 root root 12 Dec  6 18:38 rbd_test
    [cephfsd@ceph-admin ~]$ cat /mnt/rbd/rbd_test
    adsga
    rbd 0
    [cephfsd@ceph-admin ~]$

    7、克隆

    查看该块设备支不支持克隆,image-format必须为2

    [cephfsd@ceph-admin ~]$ rbd info rbd_data/testrbd
    rbd image 'testrbd':
        size 10GiB in 2560 objects
        order 22 (4MiB objects)
        block_name_prefix: rbd_data.373e6b8b4567
        format: 2
        features: layering
        flags:
        create_timestamp: Fri Dec  6 16:06:55 2019
    # 如果不是,则需要在创建快照的时候就指定--image-format为2
    rbd create rbd_data/testrbd4 --size 1G --image-format 2

    把该块做成模板,需要先把该模板的快照设置成protect(重要)

    # 设置快照为protect
    [cephfsd@ceph-admin ~]$ rbd snap protect rbd_data/testrbd@mysnap
    # 可以通过unprotect取消保护,但是这样就不能克隆了
    [cephfsd@ceph-admin ~]$ rbd snap unprotect rbd_data/testrbd@mysnap
    [cephfsd@ceph-admin ~]$ rbd info rbd_data/testrbd
    rbd image 'testrbd':
        size 10GiB in 2560 objects
        order 22 (4MiB objects)
        block_name_prefix: rbd_data.373e6b8b4567
        format: 2
        features: layering
        flags:
        create_timestamp: Fri Dec  6 16:06:55 2019
    # 这里我们把它设置回来,设为protect
    [cephfsd@ceph-admin ~]$ rbd snap protect rbd_data/testrbd@mysnap

    卸载该块

    [cephfsd@ceph-admin ~]$ sudo umount /dev/rbd0
    [cephfsd@ceph-admin ~]$ df -Th
    Filesystem              Type      Size  Used Avail Use% Mounted on
    devtmpfs                devtmpfs  484M     0  484M   0% /dev
    tmpfs                   tmpfs     496M     0  496M   0% /dev/shm
    tmpfs                   tmpfs     496M   45M  452M   9% /run
    tmpfs                   tmpfs     496M     0  496M   0% /sys/fs/cgroup
    /dev/mapper/centos-root xfs        46G  1.9G   44G   5% /
    /dev/sda1               xfs       497M  130M  368M  26% /boot
    tmpfs                   tmpfs     100M     0  100M   0% /run/user/0
    172.16.143.121:6789:/   ceph      8.5G     0  8.5G   0% /opt
    [cephfsd@ceph-admin ~]$

    开始克隆

    [cephfsd@ceph-admin ~]$ rbd clone rbd_data/testrbd@mysnap rbd_data/testrbd_clone
    [cephfsd@ceph-admin ~]$ rbd -p rbd_data ls
    testrbd2
    testrbd
    testrbd3
    testrbd_clone
    [cephfsd@ceph-admin ~]
    # 可以看到多出了一个克隆出来的块testrbd_clone

    查看区别

    检查克隆出来的testrbd_clone和之前的testrbd有没有什么区别:

    # 映射testrbd_clone
    [cephfsd@ceph-admin ~]$ sudo rbd map rbd_data/testrbd_clone
    /dev/rbd3
    # 创建挂载目录
    [cephfsd@ceph-admin ~]$ sudo mkdir /mnt/rbd_clone
    # 挂载克隆的块
    [cephfsd@ceph-admin ~]$ sudo mount /dev/rbd3 /mnt/rbd_clone/
    # 查看克隆的块的详情
    [cephfsd@ceph-admin ~]$ ll /mnt/rbd_clone/
    total 4
    -rw-r--r--. 1 root root 12 Dec  6 18:38 rbd_test
    [cephfsd@ceph-admin ~]$ cat /mnt/rbd_clone/rbd_test
    adsga
    rbd 0
    [cephfsd@ceph-admin ~]$
    # 发现testrbd_clone和testrbd快照的内容是一模一样的,因为是从那个快照克隆过来的
    # 查看 testrbd_clone信息
    [cephfsd@ceph-admin ~]$ rbd info rbd_data/testrbd_clone
    rbd image 'testrbd_clone':
        size 10GiB in 2560 objects
        order 22 (4MiB objects)
        block_name_prefix: rbd_data.375f6b8b4567
        format: 2
        features: layering
        flags:
        create_timestamp: Fri Dec  6 19:56:21 2019
        parent: rbd_data/testrbd@mysnap
        overlap: 10GiB
    [cephfsd@ceph-admin ~]$

    flatten合并

    父镜像与克隆镜像合并

    这个时候的testrbd_clone还是依赖testrbd的镜像mysnap的,如果testrbd的mysnap被删除或者怎么样,testrbd_clone也不能够使用了,要想独立出去,就必须将父镜像的信息合并flattern到子镜像中

    # 合并前
    [cephfsd@ceph-admin ~]$ rbd info rbd_data/testrbd_clone
    rbd image 'testrbd_clone':
        size 10GiB in 2560 objects
        order 22 (4MiB objects)
        block_name_prefix: rbd_data.375f6b8b4567
        format: 2
        features: layering
        flags:
        create_timestamp: Fri Dec  6 19:56:21 2019
        parent: rbd_data/testrbd@mysnap
        overlap: 10GiB
    [cephfsd@ceph-admin ~]$
    # 开始flatten合并
    [cephfsd@ceph-admin ~]$ rbd flatten rbd_data/testrbd_clone
    Image flatten: 100% complete...done.
    # 合并后,查看testrbd_clone发现已经没有parent信息了,因为已经独立了
    [cephfsd@ceph-admin ~]$ rbd info rbd_data/testrbd_clone
    rbd image 'testrbd_clone':
        size 10GiB in 2560 objects
        order 22 (4MiB objects)
        block_name_prefix: rbd_data.375f6b8b4567
        format: 2
        features: layering
        flags:
        create_timestamp: Fri Dec  6 19:56:21 2019
    [cephfsd@ceph-admin ~]$
    # 此时就可以删除快照模板了
    [cephfsd@ceph-admin ~]$ rbd snap unprotect rbd_data/testrbd@mysnap
    [cephfsd@ceph-admin ~]$ rbd snap rm rbd_data/testrbd@mysnap
    [cephfsd@ceph-admin ~]$ rbd snap ls rbd_data/testrbd
    # 镜像模板已删除

    8、k8s使用rbd作后端存储

    参考下一篇文档:https://www.cnblogs.com/doublexi/p/15618609.html

    引用:

    参考:http://www.strugglesquirrel.com/2019/04/23/centos7%E9%83%A8%E7%BD%B2ceph/

    http://docs.ceph.org.cn/rbd/rbd/

  • 相关阅读:
    常用linux命令
    console页面进去太慢优化
    CentOS7 查看最大线程连接数
    外部ssh连接Ubuntu系统
    Ubantu 防火墙管理
    oracle 闪回
    oracle用户密码过期
    base64编码原理
    Linux 备份数据库mysql
    python静态方法-类方法
  • 原文地址:https://www.cnblogs.com/doublexi/p/15618528.html
Copyright © 2011-2022 走看看