Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1945797
  • 博文数量: 1000
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 7921
  • 用 户 组: 普通用户
  • 注册时间: 2013-08-20 09:23
个人简介

storage R&D guy.

文章分类

全部博文(1000)

文章存档

2019年(5)

2017年(47)

2016年(38)

2015年(539)

2014年(193)

2013年(178)

分类: 服务器与存储

2015-01-09 22:51:00

使用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块空间链表中
阅读(1154) | 评论(0) | 转发(0) |
0

上一篇:FusionStorage技术白皮书

下一篇:gfs

给主人留下些什么吧!~~