Ceph RBD:创建image + image元数据详解

文章目录

  • 引言
  • Image关键元数据
    • 创建卷
    • 如何找到卷:rbd_directory
    • 卷都有什么属性:rbd_header.{rbd_id}
    • 卷的数据在那里:rbd_data.{rbd_id}.{offset_idx}
    • 元数据汇总
  • 创建卷流程

引言

在Ceph RBD中,image是一个对外提供的逻辑概念,image由数据和元数据组成,数据和原数据都存储在底层RADOS对象中。因此,image的操作就可以分为:

  • 数据操作:IO流程
  • 元数据操作:配置流程
    对于创建image这种配置流程来说,主要就是操作元数据。

Image关键元数据

我们从实践出发,看一下image有哪些元数据。

创建卷

通过RBD命令创建一个image。

rbd create blockpool/vol_2 --size 100M

查看rados对象。

[root@VM-16-10-centos data]# rados -p blockpool ls
rbd_directory
rbd_id.vol_2
rbd_info
rbd_object_map.2488ba1d0ed49
rbd_header.2488ba1d0ed49

如何找到卷:rbd_directory

rbd_directory中存储了卷信息,卷的名字为vol_2,卷的id为2488ba1d0ed49,结合上面命令,可以找到rbd_id.vol_2rbd_header.2488ba1d0ed49rbd_object_map.2488ba1d0ed49相关对象。

[root@VM-16-10-centos data]# rados -p blockpool listomapvals rbd_directory
id_2488ba1d0ed49
value (9 bytes) :
00000000  05 00 00 00 76 6f 6c 5f  32                       |....vol_2|
00000009

name_vol_2
value (17 bytes) :
00000000  0d 00 00 00 32 34 38 38  62 61 31 64 30 65 64 34  |....2488ba1d0ed4|
00000010  39                                                |9|
00000011

卷都有什么属性:rbd_header.{rbd_id}

在rbd_header对象中我们可以看到image的相关属性。

[root@VM-16-10-centos data]# rados -p blockpool listomapvals rbd_header.2488ba1d0ed49
access_timestamp
value (8 bytes) :
00000000  49 96 56 62 1d d5 31 10                           |I.Vb..1.|
00000008

create_timestamp
value (8 bytes) :
00000000  49 96 56 62 1d d5 31 10                           |I.Vb..1.|
00000008

features
value (8 bytes) :
00000000  3d 00 00 00 00 00 00 00                           |=.......|
00000008

modify_timestamp
value (8 bytes) :
00000000  49 96 56 62 1d d5 31 10                           |I.Vb..1.|
00000008

object_prefix
value (26 bytes) :
00000000  16 00 00 00 72 62 64 5f  64 61 74 61 2e 32 34 38  |....rbd_data.248|
00000010  38 62 61 31 64 30 65 64  34 39                    |8ba1d0ed49|
0000001a

order
value (1 bytes) :
00000000  16                                                |.|
00000001

size
value (8 bytes) :
00000000  00 00 40 06 00 00 00 00                           |..@.....|
00000008

snap_seq
value (8 bytes) :
00000000  00 00 00 00 00 00 00 00                           |........|
00000008

卷的数据在那里:rbd_data.{rbd_id}.{offset_idx}

数据的rados对象是在写的时候生成的,我们写入8M的数据。再次查看RADOS对象。可以看到多了两个rbd_data..对象。由于header中order为0x16,因此rados对象大小为1<<0x16=4M,因此每个数据对象表示4M的范围。order值为配置文件中rbd_default_order配置项。

[root@VM-16-10-centos data]# rados -p blockpool ls
rbd_directory
rbd_id.vol_2
rbd_data.2488ba1d0ed49.0000000000000001
rbd_info
rbd_object_map.2488ba1d0ed49
rbd_header.2488ba1d0ed49
rbd_data.2488ba1d0ed49.0000000000000000

元数据汇总

RADOS对象 记录 类型 描述
rbd_id. rbd_id data 记录image名称到image id的单向映射关系
rbd_header. data_pool_id omap 指定将数据对象存储在与元数据对象不同的存储池
rbd_header. features data 已启用的功能特性
rbd_header. object_prefix omap 数据对象名称前缀
rbd_header. order omap 组成image的数据对象容量大小,以2为底的指数
rbd_header. parent omap 当存在克隆关系时,克隆image记录的关联的父image快照信息
rbd_header. size omap 容量大小
rbd_header. snap_seq omap 最近一次创建的快照的快照id
rbd_header. snapshot_ omap id为snap_id的快照的基本信息
rbd_header. stripe_count omap 条带宽度,数据对象间进行条带化的参数
rbd_header. strip_unit omap 条带大小,数据对象间进行条带化的参数
rbd_header. lock.rbd_lock omap 控制image互斥访问的锁信息
rbd_object_map. rbd_object_map data 记录组成image的所有数据对象的存在状态
RADOS对象 记录 类型 描述
rbd_directory name_ omap 记录image名称所对应的image id
rbd_directory id_ omap 记录image id所对应的image名称

创建卷流程

创建卷就是将原数据写入相应rados对象的过程,参考Ceph原代码注释即可。

  /**
   * @verbatim
   *
   *                                  <start> . . . . > . . . . .
   *                                     |                      .
   *                                     v                      .
   *                               VALIDATE DATA POOL           v (pool validation
   *                                     |                      .  disabled)
   *                                     v                      .
   * (error: bottom up)         ADD IMAGE TO DIRECTORY  < . . . .
   *  _______<_______                    |
   * |               |                   v
   * |               |            CREATE ID OBJECT
   * |               |               /   |
   * |      REMOVE FROM DIR <-------/    v
   * |               |           NEGOTIATE FEATURES (when using default features)
   * |               |                   |
   * |               |                   v         (stripingv2 disabled)
   * |               |              CREATE IMAGE. . . . > . . . .
   * v               |               /   |                      .
   * |      REMOVE ID OBJ <---------/    v                      .
   * |               |          SET STRIPE UNIT COUNT           .
   * |               |               /   |  \ . . . . . > . . . .
   * |      REMOVE HEADER OBJ<------/    v                     /. (object-map
   * |               |\           OBJECT MAP RESIZE . . < . . * v  disabled)
   * |               | \              /  |  \ . . . . . > . . . .
   * |               |  *<-----------/   v                     /. (journaling
   * |               |             FETCH MIRROR MODE. . < . . * v  disabled)
   * |               |                /   |                     .
   * |     REMOVE OBJECT MAP<--------/    v                     .
   * |               |\             JOURNAL CREATE              .
   * |               | \               /  |                     .
   * v               |  *<------------/   v                     .
   * |               |           MIRROR IMAGE ENABLE            .
   * |               |                /   |                     .
   * |        JOURNAL REMOVE*<-------/    |                     .
   * |                                    v                     .
   * |_____________>___________________<finish> . . . . < . . . .
   *
   * @endverbatim
   */

你可能感兴趣的:(Ceph,RBD,分布式,linux,云计算)