本技术涉及分布式存储优化,具体涉及一种磁盘空间回收方法、装置、电子设备以及存储介质。
背景技术:
1、bcache是linux kernel中块设备层的缓存系统,它将多个(>=1)个高速块设备(一般是固态硬盘)构建为多个低速块设备(一般是机械硬盘)的缓存,ssd设备为高速硬盘(固态硬盘),sda-sdn为低速硬盘(机械硬盘)。ssd硬盘为缓存盘,它为后端的低速硬盘提供缓存服务。bcache将应用层的io数据写到缓存设备(高速块设备)上,然后bcache会将缓存设备上的数据回写到后端的低速块设备上,从而达到更高的写性能。
2、bcache中的cache磁盘一般采用高速ssd磁盘,后端存储磁盘采用hdd机械盘,而ssd的特性决定了ssd磁盘不能像普通hdd磁盘那样工作。当在操作系统中删除一个文件时,系统并没有真正删掉这个文件的数据,它只是把这些数据占用的地址标记为‘空’,即可以覆盖使用。但这只是在文件系统层面的操作,硬盘本身并不知道那些地址的数据已经‘无效’,除非系统通知它要在这些地址写入新的数据。在hdd上本无任何问题,因为hdd允许覆盖写入,但到ssd上问题就来了,ssd不允许覆盖,只能先擦除再写入,要得到‘空闲’的闪存空间来进行写入,ssd就必须进行垃圾回收(gc)操作。在正常工作中,ssd无法事先知道那些被‘删除’的数据页已经是‘无效’,必须到系统要求在相同的地方写入数据时才知道那些数据可以被擦除,这样就无法在最适当的时机做出最好的优化,既影响gc的效率(间接影响性能),又影响ssd的寿命。
3、因此,如何高效回收bcache中cache磁盘中的失效存储空间,是目前急需解决的问题。
技术实现思路
1、本技术提供一种磁盘空间回收方法、装置、电子设备以及存储介质,能够高效回收bcache中cache磁盘中的失效空间。
2、为实现上述目的,本技术提供以下方案。
3、第一方面,本技术提供了一种磁盘空间回收方法,所述方法包括以下步骤:
4、获取文件系统层下发的数据块失效指令;其中,所述数据块失效指令包括后端存储磁盘的扇区地址和扇区长度;
5、基于所述扇区地址以及所述扇区长度,生成对应的失效键值;
6、遍历缓存磁盘中的b+tree,若所述失效键值存在于所述b+tree的节点上,则对所述缓存磁盘上与所述失效键值对应的失效数据块进行回收。
7、进一步的,所述获取文件系统层下发的数据块失效指令之前,包括以下步骤;
8、基于后端存储磁盘与缓存磁盘之间的数据对应关系,在缓存磁盘中构建b+tree;
9、获取文件系统层下发的失效通知指令;
10、基于所述失效通知指令的属性,判定所述失效通知指令为数据块失效指令。
11、进一步的,所述获取文件系统层下发的数据块失效指令之前,包括以下步骤;
12、基于后端存储磁盘与缓存磁盘之间的数据对应关系,在缓存磁盘中构建b+tree;
13、获取文件系统层下发的失效通知指令;
14、基于所述失效通知指令的属性,判定所述失效通知指令为数据块失效指令。
15、进一步的,所述基于所述失效通知指令的属性,判定所述失效通知指令为数据块失效指令,包括以下步骤:
16、在所述b+tree上确定目标节点,并将其设置为命令属性检查点;
17、利用所述命令属性检查点,检查所述失效通知指令的属性是否为req_op_discard;
18、若是,则判定所述失效通知指令为数据块失效指令。
19、进一步的,所述遍历缓存磁盘中的b+tree,若所述失效键值存在于是否存在于所述b+tree的节点上,则对所述缓存磁盘上与所述失效键值对应的失效数据块进行回收,包括以下步骤:
20、获取所述b+tree上的根节点,并从所述根节点遍历所述b+tree上所有节点;
21、若所述失效键值存在于所述b+tree的节点中,则获取在所述缓存磁盘上与所述失效键值对应的数据块地址;
22、对所述数据块地址上存在的数据块进行垃圾回收。
23、进一步的,所述方法还包括:
24、若所述失效键值不存在于所述b+tree的节点中,则不对所述缓存磁盘中的存储数据块进行垃圾回收。
25、进一步的,所述对所述数据块地址上存在的数据块进行垃圾回收,包括以下步骤:
26、基于所述失效键值对应的位于后端缓存磁盘的第一失效数据块地址,获取位于缓存设备上的第二失效数据块地址;
27、基于所述第二失效数据块地址,生成更新后的失效键值;
28、若所述更新后的失效键值存在于所述b+tree上,则将所述失效键值对应失效数据块地址与所述b+tree上原有的数据块地址进行合并;
29、将合并后的第二数据块地址封装成bio命令;
30、基于所述bio命令,调用垃圾回收机制回收与将所述第二失效数据块地址对应的失效数据块。
31、将合并后的第二数据块地址封装成bio命令之前,包括以下步骤:
32、当达到定时器到时触发时刻时,判断所述b+tree是否为空;
33、若所述b+tree是否为空,则不对所述缓存磁盘上的数据进行垃圾回收操作。
34、进一步的,所述将合并后的第二数据块地址封装成bio命令之前,包括以下步骤:
35、当达到定时器到时触发时刻时,判断所述b+tree是否为空;
36、若所述b+tree是否为空,则不对所述缓存磁盘上的数据进行垃圾回收操作。
37、第二方面,本技术提供了一种磁盘空间回收装置,所述装置包括:
38、失效指令获取模块,其用于获取文件系统层下发的数据块失效指令;其中,所述数据块失效指令包括后端存储磁盘的扇区地址和扇区长度;
39、键值获取模块,其用于基于所述扇区地址以及所述扇区长度,生成对应的失效键值;
40、回收模块,其用于遍历缓存磁盘中的b+tree,若所述失效键值存在于所述b+tree的节点上,则对所述缓存磁盘上与所述失效键值对应的失效数据块进行回收。
41、进一步的,所述失效指令获取模块,还包括:
42、b+tree构建子模块,其用于基于后端存储磁盘与缓存磁盘之间的数据对应关系,在缓存磁盘中构建b+tree;
43、失效通知指令获取子模块,其用于获取文件系统层下发的失效通知指令;
44、判断子模块,其用于基于所述失效通知指令的属性,判定所述失效通知指令为数据块失效指令。
45、进一步的,所述判断子模块,包括:
46、检查点设置单元,其用于在所述b+tree上确定目标节点,并将其设置为命令属性检查点;
47、属性判断单元,其用于利用所述命令属性检查点,检查所述失效通知指令的属性是否为req_op_discard;
48、判定单元,其用于若是,则判定所述失效通知指令为数据块失效指令。
49、进一步的,所述回收模块,包括:
50、遍历子模块,其用于获取所述b+tree上的根节点,并从所述根节点遍历所述b+tree上所有节点;
51、地址解析子模块,其用于若所述失效键值存在于所述b+tree的节点中,则获取在所述缓存磁盘上与所述失效键值对应的数据块地址;
52、垃圾回收子模块,其用于对所述数据块地址上存在的数据块进行垃圾回收。
53、进一步的,所述垃圾回收子模块,包括:
54、地址获取单元,其用于基于所述失效键值对应的位于后端缓存磁盘的第一失效数据块地址,获取位于缓存设备上的第二失效数据块地址;
55、键值更新单元,其用于基于所述第二失效数据块地址,生成更新后的失效键值;
56、合并单元,其用于若所述更新后的失效键值存在于所述b+tree上,则将所述失效键值对应失效数据块地址与所述b+tree上原有的数据块地址进行合并;
57、封装单元,其用于将合并后的第二数据块地址封装成bio命令;
58、调用单元,其用于基于所述bio命令,调用垃圾回收机制回收与将所述第二失效数据块地址对应的失效数据块。
59、进一步的,所述封装单元,还包括:
60、空集判断单元,其用于当达到定时器到时触发时刻时,判断所述b+tree是否为空;
61、第一操作单元,其用于若所述b+tree是否为空,则不对所述缓存磁盘上的数据进行垃圾回收操作。
62、本技术提供的技术方案带来的有益效果包括:
63、本技术中缓存磁盘控制器获取文件系统层下发的数据块失效指令;其中,数据块失效指令包括后端存储磁盘的扇区地址和扇区长度;基于扇区地址以及扇区长度,生成对应的失效键值;遍历缓存磁盘中的b+tree,若失效键值存在于b+tree的节点上,则对缓存磁盘上与失效键值对应的失效数据块进行回收。采用本方法可以在正常工作环境下提前“通知”前端缓存磁盘哪些数据块已失效,使垃圾回收驱动提前回收缓存磁盘中的失效数据块,避免缓存磁盘中为了合并空闲空间复制已被操作系统定义为无效的数据到空闲块内,从而使得垃圾回收时象需要复制的数据减少,也就提高了对磁盘空闲空间的失效数据回收效率。