块存储空间管理

2020-05-17  本文已影响0人  Yves_Chen
块存储资源管理

块存储 资源管理

由IO路径看资源布局。

IO start

Volume层

Pool层

Thin LUN

Meta Volume

Data Volume

Alloc Queue

grain分配队列

使用场景:

写thin lun,在查询map tree对应grain未分配时触发空间分配;

step1:空间以顺序分配的方式进行,分配时,增加offset偏移并可能改变队首(对首Item全部分配完时),并生成grain info返回。

step2:在map tree中插入新的映射项(grain id -> Extent ID + offset),如果和前一个node满足合并条件则合并。

step3:如果alloc queue中可分配的grain低于阈值,则触发后台空间分配,首先从SPA中获取Extent并生成Item插入alloc queue队尾,如果SPA空间不足,不能分配Extent,则从free tree中取出Item,直接插入到alloc queue。

Item Head

Tier:0,1,2(为0时,一个bit表示一个grain,每升1,乘以64)

Offset:记录Extent已经分配grain的偏移。

Bitmap:0xFFFFFFFFFFFFFFFF(64字节)

Item

Item

...

Item Tail

Item

结构

合并

归属于相同的Extent,且表示的grain范围相同的Item可以合并。

tier为0的item,集满64个bit后,tier提升为1,并根据offset将新的item对应位置的1个bit置位;

tier为1的item,集满64*64个bit后,tier提升为2,并根据offset将新的item对应位置的1个bit置位;

以此类推;

分配

Grain Free Tree

资源释放树

使用场景:

删除thin lun,去激活快照等操作,需要释放响应的grain空间,本树中记录了已经释放的grain,释放的grain从map tree摘下放到free queue,free queue将队列中同一个extent的grain合并到一个item,最终和free tree的item合并,当item集满整个Extent时,将Extent释放给SPA。

node

node

node...

Grain Map Tree

thin lun的空间分配树。

使用场景:

1.写thin lun时,查询本树相应grain是否分配,未分配时从alloc queue分配grain并在本树插入相应node。

2.删lun、去激活快照等,需要回收空间,需要查询并删除本树的节点,同时查询free t,如果free queue已经存在 相同的Extent的Item,将相应grain的offset bit置位,否则生成新的Item插入free queue的队尾。

node

在对Thin LUN做连续写时,从分配队列分配的grain很可能满足合并条件(在资源充足,从SPA分配到整个Extent时,连续写分配的Grain必然可以合并;未从SPA分配到Extent时,去Free Tree取出Item分配,这里由于释放grain时的随机性,能合并的可能较小)。

由于存在合并的情况,使用grain id来map tree查询时,可能响应的grain已经和前面的node合并,所以查询策略略有不同,未查询到时,还需要查询前面的node中value的范围是否包含了查询的grain。

- key:LBA/grain size
- value:Extent Id + offset

node

node...

Ckg Map Tree

POOL的CKG映射树(ckg id -> disk + lba)

负责ckg id到盘的路由

node

node

node...

Extent Map Tree

LUN的空间映射树(extent id -> ckg id)

该树负责extent到ckg的路由,由pool管理,物理分布在root extent中,节点有nodeMgr分配在非预留的extent node上。

读写:通过extent id进行索引,查到树上存在对应的节点,获取ckg id和offset,到pool的ckg map tree上进一步查询;

node

node

...

node

Free Queue

grain空间释放队列

使用场景:

删lun或去激活快照时,触发空间释放;

step1:将grain id的映射信息从map tree中摘下,并可能导致map tree node分裂(之前相邻的node满足属于同一个Extent且grain id连续)。

step2:以释放的grain的Extent id + offset去free queue查找,若找到,将相应bit置位,否则,生成新的Item插入队尾。

step3:后台释放:遍历free queue,将同一个extent的Item合并。

step4:将合并的Item去free tree查找,找到对应项则合并,否则新插入Item,若合并后Item集满整个Extent,将Extent释放给SPA。

Question:step2先查询,有相同Extent的Item置位对应bit,为什么step3还可能合并同一Extent的Item?存在同一个Extent的Item不能合并的情况?可能跟Item结构有关。。

Item Tail

Item

Item

...

Item Head

Disks

CowTree(Snapshot)

node

在对Thin LUN做连续写时,从分配队列分配的grain很可能满足合并条件(在资源充足,从SPA分配到整个Extent时,连续写分配的Grain必然可以合并;未从SPA分配到Extent时,去Free Tree取出Item分配,这里由于释放grain时的随机性,能合并的可能较小)。

由于存在合并的情况,使用grain id来map tree查询时,可能响应的grain已经和前面的node合并,所以查询策略略有不同,未查询到时,还需要查询前面的node中value的范围是否包含了查询的grain。

- key:LBA/grain size
- value:Extent Id + offset

node

node...

上一篇 下一篇

猜你喜欢

热点阅读