使用FusionStorage所创建的卷是一个逻辑卷,FusionStorage将这个逻辑卷均分成多个1M大小的块空间,上层应用发出读写的命令,
最终转化成在该卷上的一个LBA地址和偏移量,在FusionStorage中,每个卷都有一个唯一的标识,由tree id、branch id、
snap id构成,再由FusionStorage内部根据LBA地址和偏移量计算出该I/O落在卷的哪个1M空间内,即计算出Block no 值和
该I/O在每个block内的offset,计算方法如下:
由于一个I/O不一定能在一个1M块空间内放得下,有可能出现跨两个1M块空间的情况,此时需要进行I/O分片,由于上层应用下发的I/O大小不会超过512K,因此一个I/O最多分成2片
分片数计算方法:
start_block_no=LBA/1M
end_block_no =(LBA+size)/1M
分片数= end_block_no - start_block_no + 1
每个block内offset的计算方法:
offset_in_start_block =LBA%1M
offset_in_end_block_no = 0
例如:某个I/O的LBA是2000K,size是64K,那么start_block_no=2000k/1024K=1
end_block_no =(2000k+64K)/1024K=2,则该I/O就会被拆分成2片,第一片I/O的 block_no为1,offset为2000k%1024=976K,第二片I/O的block_no为2,offset为0
由上述的tree id、branch id、snap id和Block no构成这个I/O的key,根据这个key值计算出一个哈希值,从而得出该
I/O落在哪个partition内(FusionStorage在2副本场景下默认有3600个partition),再根据MDC中存放的
IO View(IO View是partition和OSD的对应关系,在创建FusionStorage时已经根据内部的partition分布算法
计算好了这个对应关系),最终确定该I/O写在哪个OSD上
OSD会将自己所对应的存储空间也划分为1M大小的块,I/O发给具体的OSD后,OSD会查看自己有没有给这个I/O对应的key分配1M空间,如果已
经分配了,就根据之前计算出的block内的offset写到已分配的1M空间内,如果OSD发现还没有给这个key分配空间,那么就会从还未使用的1M
块的链表中分配一个1M块空间给这个key,并写上这个I/O对应的数据,如果某个key对应的1M空间的数据被全部删除,则该1M空间会重新挂在未使用
的1M块空间链表中
阅读(1151) | 评论(0) | 转发(0) |