1、RADOS块设备

  • RBD(RADOS Block Devices),是一种构建在RADOS存储集群之上为客户端提供块设备接口的存储服务中间层。
    • 这类客户端包括虚拟化平台KVM(qemu)
    • 云计算操作系统OpenStack或CloudStack
    • 操作系统内核使用的块设备
  • RBD基于RADOS存储集群中的多个OSD进行条带化,支持存储空间的简配(thin-provisioning)和动态扩容等特性,并能够借助于RADOS集群实现快照、副本和一致性
  • BD自身也是RADOS存储集群的客户端,它通过将存储池提供的存储服务抽象为一到多个image(表现为块设备)向客户端提供块级别的存储接口。
  • 客户端访问RBD设备的方式有两种

    • 通过内核模块rbd.ko将image映射为节点本地的块设备,相关的设备文件一般为 /dev/rdb#(#为设备编号,例如rdb0等)
    • 另一种则是librbd提供的API接口,它支持C/C++和Python等编程语言,qemu即是此类接 口的客户端

      2、rbd管理操作

      RBD相关的管理操作有如image的创建、删除、修改和列出等基础CRUD操作,也有分 组、镜像、快照和回收站等相的管理需求,这些均能够通过rbd命令完成

      2.1、RBD存储池管理

      使用块设备客户端之前必须事先创建专用的存储池、启用rbd并完成其初始化
  • 创建并初始化RBD存储池

    1. ]$ ceph osd pool create rbddata 64 # 创建存储池
    2. ]$ ceph osd pool application enable rbddata rbd # 启用rbd
    3. ]$ rbd pool init -p rbddata # rbd初始化
  • 查看存储池状态

    1. ]$ ceph osd pool stats rbddata
    2. pool rbddata id 2
  • 修改存储池副本数

    1. ]$ ceph osd pool set rbddata size 1
    2. set pool 1 size to 1
  • 查看存储池副本数

    1. ]$ ceph osd pool get rbddata size
    2. size: 3

    2.2、image管理

    rbd存储池并不能直接用于块设备,而是需要事先在其中按需创建映像(image),并把映像文件作为块设备使用。

  • 在rbddata存储池中创建一个大小为1GB的image img1

    ]$ rbd create img1 --size 1024 --pool rbddata
    

    存储池中的各image名称需要唯一。

  • 查看存储池中的image

    ]$ rbd ls --pool rbddata
    img1
    
  • 获取指定image的详细信息

    # 支持4种命令获取image详细信息
    ]$ rbd --image img1 --pool rbddata info
    ]$ rbd info rbddata/img1
    ]$ rbd info --pool rbddata --image img1
    ]$ rbd info --pool rbddata img1
    rbd image 'img1':    # image大小
      size 1 GiB in 256 objects    # image空间
      order 22 (4 MiB objects)    # 块大小(条带)的标识序号,有效范围为12-25,分别对应着4K-32M之间的大小 
      snapshot_count: 0     # 快照数量
      id: 5e405878315d     # image id
      block_name_prefix: rbd_data.5e405878315d  # 当前image相关的object的名称前缀
      format: 2     # image格式,v2
      features: layering, exclusive-lock, object-map, fast-diff, deep-flatten  # 特性
      op_features:  # 可选的功能特性
      flags:
      create_timestamp: Sun Aug 15 12:35:58 2021  # 创建时间
      access_timestamp: Sun Aug 15 12:35:58 2021
      modify_timestamp: Sun Aug 15 12:35:58 2021
    
  • 调整image大小

    • 扩展image容量

      ]$ rbd resize -p rbddata --image img1 --size 2G
      Resizing image: 100% complete...done.
      
    • 缩小image容量

      ]$ rbd resize -p rbddata --image img1 --size 1G --allow-shrink
      
  • 删除image

删除image会导致数据丢失,且不可恢复;建议使用trash命令先将其移入trash,确定不再需要时再从trash中删除。

]$ rbd remove [--pool <pool>] [--image <image>] [--no-progress] <image-spec>
]$ rbd trash {list|move|purge|remove|restore}

2.3、image特性features

ceph支持 layering,striping exclusive lock, object map,fast diff ,deep-flatten等特性。

  • layering
    • 分层技术。是否支持image的克隆操作,可以对image创建快照并保护,然后从快照克隆出新的image出来,父子image之间采用COW技术,共享对象数据。
  • striping
    • 是否支持条带化对象数据,类似raid 0,可改善顺序读写场景较多情况下的性能。
  • exclusive-lock
    • 排它锁,是一个分布式锁,在开启的时候,确保只有一个客户端在访问image,否则锁的竞争会导致io急剧下降。 主要应用场景是qemu live-migration。
  • object-map
    • 对象位图,主要用于加速导入、导出及已用容量统计等操作,依赖于exclusive-lock特性。
  • fast-diff
    • 快速比较,此特性依赖于object map和exlcusive lock。快速比较image的snapshot之间的差异。
  • deep-flatten
    • layering特性使得克隆image的时候,父子image之间采用COW,他们之间的对象文件存在依赖关系,flatten操作的目的是解除父子image的依赖关系
  • journaling
    • 是否支持日志IO,即是否支持记录image的修改操作至日志对象;依赖于exclusive-lock特性。
  • data-pool

    • 是否支持将image的数据对象存储于纠删码存储池,主要用于将image 的元数据与数据放置于不同的存储池
      2.3.1、image特性管理
  • J版本起,image默认支持的特性有layering、exclusive-lock、object-map、fast-diff和 deep-flatten五个;

    • 注意,如果作为Linux客户端加载到内核时,object-map、fast-diff和 deep-flatten三个特性不支持,需要禁用。
  • rbd create命令的—feature选项支持创建时自定义支持的特性;
  • 现有image的特性可以使用rbd feature enable或rbd feature disable命令修改

    # 禁用特性
    ]$ rbd feature disable rbddata/img1 object-map fast-diff deep-flatten
    

    3、客户端使用image

    在RBD客户端节点上以本地磁盘方式使用块设备之前,需要先将目标image映射至本地内核,而且,若存储集群端启用了CephX认证,还需要指定用户名和keyring文件。

  • 创建用户并生成keyring文件

    ]$ ceph auth add client.rbduser mon 'allow rw' osd 'allow * pool=rbddata'
    ]$ ceph auth get client.rbduser -o ceph.client.rbduser.keyring
    
  • 拷贝keyring文件和ceph.conf到客户端主机

    ]$ scp ceph.client.rbduser.keyring root@10.211.55.3:/etc/ceph/
    ]$ scp ceph.conf root@10.211.55.3:/etc/ceph/
    
  • 客户端需要安装ceph-common程序包来支持ceph rbd

    ]$ yum -y install ceph-common
    
  • 验证指定用户查看集群状态

    ]$ ceph --user rbduser -s
    cluster:
      id:     817bb5ff-1b92-4734-baa8-f21ede4cb9c2
      health: HEALTH_OK
    
    services:
      mon: 3 daemons, quorum ceph-mon1,ceph-mon2,ceph-mon3 (age 10h)
      mgr: ceph-mon1(active, since 23h), standbys: ceph-mon2
      mds: cephfs:1 {0=ceph-mon1=up:active}
      osd: 6 osds: 6 up (since 23h), 6 in (since 23h)
      rgw: 2 daemons active (ceph-mon1, ceph-mon2)
    
    task status:
    
    data:
      pools:   7 pools, 256 pgs
      objects: 215 objects, 4.6 KiB
      usage:   6.0 GiB used, 378 GiB / 384 GiB avail
      pgs:     256 active+clean
    
  • 映射image

    • 注意,客户端需要映射,用户必须对osd拥有所有权限。
      ]# rbd --user rbduser map rbddata/img1
      /dev/rbd0
      
  • 查看设备信息并格式化挂载image

    ]$ fdisk -l
    磁盘 /dev/rbd0:2147 MB, 2147483648 字节,4194304 个扇区
    Units = 扇区 of 1 * 512 = 512 bytes
    扇区大小(逻辑/物理):512 字节 / 512 字节
    I/O 大小(最小/最佳):4194304 字节 / 4194304 字节
    ]$ mkfs.xfs /dev/rbd0   # 格式化
    ]$ mount /dev/rbd0 /rbdimg # 挂载
    ]$ df -h
    /dev/rbd0                2.0G   33M  2.0G    2% /rbdimg
    
  • 查看已经映射的image

    ]$ rbd showmapped
    id pool    namespace image snap device
    0  rbddata           img1  -    /dev/rbd0
    
  • 断开映射

    ]$ umount /rbdimg
    ]$ rbd unmap rbddata/img1
    

    注意:节点重启后,使用rbd命令建立的image映射会丢失

    4、image快照