当前位置:首页 > 范文大全 > 自我介绍 > 正文
 

ceph,rbd分析

发布时间:2024-04-27 03:04:53 影响了:

 Ceph rbd 分析

  张建伟

 一、 rbd 之于 ceph

 Rados: 代表 ceph 存储集群。

 Librados: 在 rados 之上,提供 key/value 存取接口。

 Radosgw: 基于 librados 提供 s3/swift 接口。

 Rbd: 基于 librados 提供块儿设备接口。

 Cephfs: 基于 librados 提供分布式文件系统接口。

 二、 rbd 的功能 1、镜像(image)相关操作。

 2、Block(对应于 ceph 集群的 object)的存取。

 block 存取较简单直观,下面主要介绍 image 相关操作实现。

 三、 Image 的创建 创建 image 就是,就是向 rados 中写入一些 key/value 对,记录 image 的元数据。例如以下命令创建 image :rbd create foo --size 10240 --order 22 --pool rbd 则记录的元信息如下:

 Key(oid) Value 备注 rbd_id.foo 1d3e74b0dc51 记录 image name 到 image id 的映射 image id 是用 rand()函数,按一定规则生成 rbd_header. 1d3e74b0dc51 size : 10240 order : 22 object_prefix: rbd_data. 1d3e74b0dc51 snap_seq: 0 记录元信息 Order 是用来计算 block size,如order 为 22,block size 为 1<<22 = 4M rbd_directory …… name_foo: id_1d3e74b0dc51 Id_1d3e74b0dc51: name_foo rbd_directory 中 记 录 了 所 有image 的 name 和 id 的双向映射关系

 四、 Image 的更新 Image 的更新就比较简单了,就是更新如上的元数据。

 比如 resize 操作,就是修改 rbd_header. 1d3e74b0dc51 的 size 属性。

 五、 Image 的 的 snapshot rbd snap create --snap foo.snap1 --image foo 元信息修改情况如下:

 Key(oid) Value 备注 rbd_header. 1d3e74b0dc51 …… snap_seq: 1 snapshot_0000000000000001: foo.snap1 … 修改 snap_seq 编号 添加 snapshot 信息

 先回顾下 oid 对应文件名的命名规则:

 每个 object 的文件名格式为:

 objectname_key_head(snap_num)_hash_namespace_poolid ? objectname:对象名 ? key、namespace:都是客户端指定,做名称空间细分用。当块儿设备使用时,一般都置为空 ? head(snap_num):snapshot 版本,如果是 head,则代表可写的 head 版本,如果是数字,则代表 snapshot 的序号 ? hash:由 objectname 计算得到,u_int32_t 类型,这里转换为 16 进制字符打印,如 3AF0B980 ? poolid:pool 的 id

 对于 rbd 操作,objectname 的生成规则大致为:用读写块儿设备的偏移除以 block size 得到 64 位表示的 block 序号,转换为 16 进制字符表示,再用 object_prefix作为前缀,即组成了 objectname。举例:

 假设偏移为13M,13M/4M + 1 = 4,用64位16进制字符表示为0000000000000004,则 objectname 为 rbd_data. 1d3e74b0dc51. 0000000000000004

 带 snapshot 的 image 的写流程如下:

 Image写请求如果有,带snap序号seq1seq1>head oid 的seq默认head oid的seq为0将head版本,clone一份到snap版本seq1Seq号由librbd查询image的元数据得到正常写head更新head oid的seq号更新为seq1正常写head例如将:rbd_data.1d3e74b0dc51.00000000000013e0__head_1604F591__2复制到rbd_data.1d3e74b0dc51.00000000000013e0__1_1604F591__2YN

 六、 Image 的 的 clone rbd snap protect --snap foo.snap1 --image foo

  rbd clone --snap foo.snap1 --dest foo.clone1 --image foo protect 命令是让 foo.snap1 处于 proctet 状态,使其无法被删除。因为 clone 是 cow机制实现,snapshot 删除后 clone 的 image 会受到影响。

 Clone 得到的 foo.clone1 的元信息如下:

 Key(oid) Value 备注 rbd_id.foo.clone1 1d563d1b58ba 记录 image name 到 image id 的映射 image id 是用 rand()函数,按一定规则生成 rbd_header. 74b0dc51 size : 10240 order : 22 object_prefix: rbd_data. 1d563d1b58ba parent:

 rbd/foo@foo.snap1 snap_seq: 0 记录元信息 还会另外记录父子关系:

 Key(oid) Value 备注 rbd_children 1d3e74b0dc51_0000000000000001:

 1d563d1b58ba … 1d3e74b0dc51 是 parent,即 foo 的 image id ;0000000000000001 代 表snap 版本 1d563d1b58ba 是 child,即foo.clone1 的 imageid

 Clone 得到的 image, 写流程如下:

 1、先 clone parent 对应的 oid,到本 image 2、正常写

 读流程如下:

 1、读本 image,如果读到就返回,读不到走第 2 部 2、读 parent 七、 Image 的 的 rollback rbd --image foo snap rollback --snap foo.snap1

 Rollback 操作,会遍历 image 中的每个 object,如果此 object 只有 head 版本,不做任何操作,否则对其执行如下操作:

 1、delete head 2、将指定的 snap 版本 clone 到 head

 因为要遍历所有 object,所以 clone 的效率是很低的。

 八、 Image 的 的 import/export Export rbd export instance-0000008f_disk ./instance-0000008f_disk.export 遍历所有 block,如果 block 存在,则写入文件,如果 block 不存在,则补空洞写入文件。

 Import rbd import ./instance-0000008f_disk.export test.import 将文件按 block size 切分,一个个写入 rados。如果写入的 block 是空洞,则跳过。

相关热词搜索:分析 ceph rbd

相关文章
最新文章

Copyright © 2008 - 2017 版权所有 博文学习网

工业和信息化部 湘ICP备09005888号-2