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