ceph rbd数据写入流程

拓补图:

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/3/image_14d0de28111417c8dc2aa9088c5b6136.png

图片解析:
存储过程:一个文件切割为很多部分 比如一个100M的文件最终会切割成25个4M(默认4M)的文件
切割之后:每个object都会有一个object id object id 需要存储到pg里面去 此处进行一个运算把object id 作为一个哈希 >> 对其进行掩码运算 >> 得到pgidpg上面:存储多个object >> 通过crush算法把pg做一次运算分配到 集群中对应的osd节点上(根据crush层次的不同osd也会落到不同的地方 )
比如crush算法定义的是以机架为单位的 此时便会落到不同的机架上的osd上从而确保数据的高可用性

实际操作演示:

文件切割大小验证 演示文件 id: rbd_data.38074c091b82.0000000000000200

1
2
3
4
5
6
7
8
9
10
11
12
13
14
rbd info ceph-demo/rbd-demo.img   或    rbd -p ceph-demo info rbd-demo.img (查看命令)
rbd image 'rbd-demo.img':
size 11 GiB in 2816 objects
order 22 (4 MiB objects)
snapshot_count: 0
id: 38074c091b82
block_name_prefix: rbd_data.38074c091b82
format: 2
features: layering
op_features:
flags:
create_timestamp: Sat Nov 5 21:41:38 2022
access_timestamp: Sat Nov 5 21:41:38 2022
modify_timestamp: Sat Nov 5 21:41:38 2022

解析:

共:11G 分为:2816个文件 每个文件:4M
object的前缀都是以: rbd_data.38074c091b82 开头
查看验证:rados -p ceph-demo ls |grep rbd\_data.38074c091b82 (查看所有文件)
查看大小:rados -p ceph-demo stat rbd\_data.38074c091b82.0000000000000200 (每个都是4M)

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/3/image_6f53063cda709eabdb71f3cd486276b4.png

查看文件最终落在的地方:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ceph osd map ceph-demo rbd_data.38074c091b82.0000000000000200     (查看文件最终落于)
//返回
osdmap e49 pool 'ceph-demo' (1) object 'rbd_data.38074c091b82.0000000000000200' -> pg 1.7811abdf (1.5f) -> up ([0,1], p0) acting ([0,1], p0)

ceph osd tree
ID CLASS WEIGHT TYPE NAME STATUS REWEIGHT PRI-AFF
-1 0.01178 root default
-3 0.00589 host node-1
0 hdd 0.00589 osd.0 up 1.00000 1.00000
-5 0.00589 host node-2
1 hdd 0.00589 osd.1 up 1.00000 1.00000

解析: 文件pool池deph-demo >> 落在pgid为:1.7811abdf 上面 >> 解析掩码哈希分配于 >> osd.0 osd.1上面
一个文件拆分为多个object这些object都会落在不同的pg上 pg最终落在不同的osd上
验证:
for循环验证
for i in `rados -p ceph-demo ls |grep rbd_data.38074c091b82` ; do ceph osd map ceph-demo $i; done
落于不同的pg上

解析: 文件pool池deph-demo >> 落在pgid为:1.7811abdf 上面 >> 解析掩码哈希分配于 >> osd.0 osd.1上面一个文件拆分为多个object这些object都会落在不同的pg上 pg最终落在不同的osd上

验证:for循环验证

1
for i in \`rados -p ceph-demo ls |grep rbd\_data.38074c091b82\` ; do ceph osd map ceph-demo \$i;  done

落于不同的pg上

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/3/image_29628694717b3300ec37f4ed88d5abbb.png

rbd是瘦分配的会根据使用情况去自动的扩这些空间

1
2
3
4
rados -p ceph-demo ls |grep rbd_data.38074c091b82 |wc -l        # 当前这个块有五十多个object
//返回
56

当前这个块有五十多个object 每个4M 实际分配了也就二百多M的空间 当前只用了40多M 使用增长的话会动态的去扩容object的数量 满足 我们需要的空间

1
watch -n 1 'rados -p ceph-demo ls |grep rbd_data.38074c091b82 |wc -l '    (动态监视object文件变化)

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/3/image_7c31491c234c587d7d0cc391e7fce3d6.png

往挂载的目录写入数据:

1
2
3
4
5
6
cd /mnt/rbd-demo

dd if=/dev/zero of=test.img bs=1M count=1024 (往目录写入1G数据)
# 写入真实数据
dd if=/dev/urandom of=file bs=100M count=9000 iflag=fullblock status=progress

可以看到最终object增加到313个

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/3/image_cc6f5bd1aac93adf5cc215f62178f499.png

https://github.com/zznn-cloud/zznn-cloud-blog-images/raw/main/Qexo/24/3/image_64fcc6f1de8cc79e192aa157631a06d9.png