本发明涉及数据存储技术领域,具体的说是涉及一种基于分布式块存储的虚拟磁盘分层缓存设计方法。
背景技术:
分布式存储系统中,数据往往需要通过网络,数据路径过长,导致性能降低,延迟增大,对于性能要求较高的使用场景,往往是望而却步。目前主流的分布式存储系统,无论是开源或是商用,几乎都是在虚拟磁盘端增加缓存系统来提升性能以满足一些高端使用场景。主要有两种方向:一种是基于内存的缓存,一种是基于ssd的缓存。基于内存缓存由于内存的掉电易失性,无法满足数据安全的需求。基于ssd的缓存如果选用nvmessd是比较理想的选择,但是价格非常昂贵。如果是选用sata/sasssd则性能略显不足。
目前软件定义存储的概念逐渐深入人心,这种基于通用x86服务的,分布式的,纯软件的存储系统逐渐被广大用户所接受。相对于传统阵列存储系统,分布式存储系统的性能是巨大的弱点,通过缓存技术能显著改善,使其使用场景更加广泛。
技术实现要素:
针对现有技术中的不足,本发明要解决的技术问题在于提供了一种基于分布式块存储的虚拟磁盘分层缓存设计方法。
为解决上述技术问题,本发明通过以下方案来实现:一种基于分布式块存储的虚拟磁盘分层缓存设计方法,该方法通过内存与sata/sasssd组成分层缓存系统结构,通过快速算法检测数据访问热点,热点度最高的数据存放在内存,热点读较高的数据存放在sata/sasssd中;
缓存分层包括内存和sata/sasssd两个物理组件,由软件实现热点判断和数据在各级缓存中的上浮与下层,缓存算法针对磁盘的读写特性设计,并非通用的缓存,主要应用于分布式块存储系统的前端虚拟磁盘中,为虚拟磁盘加速;
所述分布式块存储系统包括:
控制主机:所述控制主机生成虚拟磁盘,为虚拟磁盘准备高速缓冲存储器,作为存储数据路径的前端主机,完成数据接收、缓存、转发功能;
策略主机:所述策略主机为分布式块存储系统的大脑,控制主机需要创建虚拟磁盘时,将从存储主机中调度处满足条件的主机,生成存储组件供控制主机连接使用;
存储主机:分布式设于系统中,数据最终的存放地点,将存储资源抽象成多个存储组件;
所述方法包括块设备的写入和读取方法,该块设备的写入和读取方法如下:
块设备的读取或写入都是一次读取或写入一块连续的数据,其应用程序写入的数据的参数为:offset,length,data;读取的参数为:offset,length,buffer;
offset:读写磁盘的位置,起始位置为0,offset为距离起始位置的偏移量;
length:读写磁盘数据的长度;
data:需要写入磁盘的数据;
buffer:将磁盘中的对应数据填入buffer中。
进一步的,所述分层缓存系统结构将存储空间划分为cache对象,每个cache对象固定大小,所述分层缓存系统结构的第一层是内存索引,内存索引由一组item组成,每个item占用4个字节代表一个cache对象;内存索引主要维护cache对象的引用计数,标志对应的item是否在cache树中,如果在,该cache对象在cache树的id;
内存索引所需要的内存空间,假设ssd缓存空间为1tb,一个item占用4个字节空间代表4mb的cache对象:
内存索引占用空间=1tb÷4mb*4=1mb;
内存索引占用空间较小几乎可以忽略不计;提到具体的cache对象时缓存在cache树中的,cache树是一颗完全二叉树,并组织成最小堆;完全二叉树表示其每个节点可以用整数编号,并且随着插入,删除节点,依然能满足完全二叉树条件;最小堆表示树根节点一定是二叉树中key值最小的;通过不同的计算引用计数的方式可以实现不同的缓存淘汰算法;cache树的value用于存储ssdcache的偏移id,以快速找到ssdcache的block;
cache树将ssdcache中的block组织成完全二叉树,ssdcache将存储空间划分为一组block,一个block对应一个cache对象,通过简单的映射算法将将要从hdd读取或写入的数据加载到ssdcache中;
计算cache树占用内存空间,最小堆以数组的形式实现无需指针:
cache树的节点数量=1tb÷4mb=262144;
cache树占用内存空间=262144*16=4mb。
进一步的,基于述各模块的描述,描述cache的具体写入流程步骤:
步骤①:应用程序发起写入请求,请求中包含(offset,length,data);
步骤②:虚拟磁盘io处理程序接收到该请求,根据offset获取内存索引对应的item项,直接通过移位运算得到时间复杂度为o(1),将引用计数 1;
步骤③:如果有需要将数据拆分成多个cache对象,插入cache树中,将根节点替换掉,如果没有设置为o_direct则直接返回,后续数据将异步同步到ssdcache和hdd中;
步骤④:如果设置了o_direct,将cache对象的数据同步到节点对应的ssdcacheblock中返回;后续由异步进程同步到后端hdd中;
基于cache系统的读取流程步骤:
步骤①:应用程序发起读取请求,请求中包含(offset,length,buffer);
步骤②:虚拟磁盘io处理程序接收到该请求,根据offset获取内存索引对应的item项,直接通过移位运算得到时间复杂度为o(1),将引用计数 1;
步骤③:根据item的最高位bit,判断offset对应的数据是否在cache中;如果在cache中,在直接从item读取到其对应的cache树的索引id值,如果cache对象保存了数据,将数据读取返回;如果cache对象内存数据已是否,则根据cache树节点的值对应的ssdcache偏移id,从ssd读取数据;
步骤④:如果所请求不在cache中,则直接请求存储主机,读取数据;
步骤⑤:比较该请求对应item的引用计数,如果该item的引用计数大于cache树根节点的引用计数,则节点替换,缓存更新;
步骤⑥:如果该item的引用计数小于cache树根节点的引用计数,表示该数据块热度不够,数据返回后,则不更新缓存。
进一步的,由于内存的掉电易失性,内存中仅仅保存读取的数据,更新的数据需要写入ssd中以防掉电数据丢失。
相对于现有技术,本发明的有益效果是:本发明提出一种全新的基于分布式块存储的虚拟磁盘分层缓存设计方法。通过内存与sata/sasssd组成分层缓存结构,通过快速算法检测数据访问热点,热点度最高的数据存放在内存,热点读较高的数据存放在sata/sasssd中。由于内存的掉电易失性,内存中仅仅保存读取的数据。更新的数据需要写入ssd中以防掉电数据丢失。缓存分层由内存和sata/sasssd两个物理组件组成。由软件实现热点判断和数据在各级缓存中的上浮与下层。本发明的缓存算法针对磁盘的读写特性设计,并非通用的缓存,主要应用于分布式块存储系统的前端虚拟磁盘中,为虚拟磁盘加速。采用本发明的分层缓存方案,避免了内存的掉电易失性,相比于sata/sasssd能大幅度提升性能,同时能带来巨大的成本效益,为客户降低存储上的总拥有成本(tco)。
附图说明
图1为本发明的分布式块存储系统架构图;
图2为本发明的分层缓存系统结构图;
图3为本发明的磁盘读写方法流程图;
图4为本发明的第一类内存索引结构图;
图5为本发明的内存cache树结构图;
图6为本发明的第二类内存索引结构图。
具体实施方式
下面结合附图对本发明的优选实施例进行详细阐述,以使本发明的优点和特征能更易于被本领域技术人员理解,从而对本发明的保护范围做出更为清楚明确的界定。
请参照附图1-6,本发明的一种基于分布式块存储的虚拟磁盘分层缓存设计方法,该方法通过内存与sata/sasssd组成分层缓存系统结构,通过快速算法检测数据访问热点,热点度最高的数据存放在内存,热点读较高的数据存放在sata/sasssd中;
缓存分层包括内存和sata/sasssd两个物理组件,由软件实现热点判断和数据在各级缓存中的上浮与下层,缓存算法针对磁盘的读写特性设计,并非通用的缓存,主要应用于分布式块存储系统的前端虚拟磁盘中,为虚拟磁盘加速;
所述分布式块存储系统包括:
控制主机:所述控制主机生成虚拟磁盘,为虚拟磁盘准备高速缓冲存储器,作为存储数据路径的前端主机,完成数据接收、缓存、转发功能;
策略主机:所述策略主机为分布式块存储系统的大脑,控制主机需要创建虚拟磁盘时,将从存储主机中调度处满足条件的主机,生成存储组件供控制主机连接使用;
存储主机:分布式设于系统中,数据最终的存放地点,将存储资源抽象成多个存储组件;
如图3所示,所述方法还包括块设备的写入和读取方法,该块设备的写入和读取方法如下:
块设备的读取或写入都是一次读取或写入一块连续的数据,其应用程序写入的数据的参数为:offset,length,data;读取的参数为:offset,length,buffer;
offset:读写磁盘的位置,起始位置为0,offset为距离起始位置的偏移量;
length:读写磁盘数据的长度;
data:需要写入磁盘的数据;
buffer:将磁盘中的对应数据填入buffer中。
所述分层缓存系统结构将存储空间划分为cache对象,每个cache对象固定大小(以4mb为例),如图4所示,所述分层缓存系统结构的第一层是内存索引,内存索引由一组item组成,每个item占用4个字节代表一个cache对象;内存索引主要维护cache对象的引用计数,标志对应的item是否在cache树中,如果在,该cache对象在cache树的id;
内存索引所需要的内存空间,假设ssd缓存空间为1tb,一个item占用4个字节空间代表4mb的cache对象:
内存索引占用空间=1tb÷4mb*4=1mb;
内存索引占用空间较小几乎可以忽略不计;提到具体的cache对象时缓存在cache树中的,如图5所示,cache树是一颗完全二叉树,并组织成最小堆;完全二叉树表示其每个节点可以用整数编号,并且随着插入,删除节点,依然能满足完全二叉树条件;最小堆表示树根节点一定是二叉树中key值最小的;通过不同的计算引用计数的方式可以实现不同的缓存淘汰算法;cache树的value用于存储ssdcache的偏移id,以快速找到ssdcache的block;
cache树将ssdcache中的block组织成完全二叉树,如图6所示,ssdcache将存储空间划分为一组block,一个block对应一个cache对象,通过简单的映射算法将将要从hdd读取或写入的数据加载到ssdcache中;
计算cache树占用内存空间,最小堆以数组的形式实现无需指针:
cache树的节点数量=1tb÷4mb=262144;
cache树占用内存空间=262144*16=4mb。
基于述各模块的描述,描述cache的具体写入流程步骤:
步骤①:应用程序发起写入请求,请求中包含(offset,length,data);
步骤②:虚拟磁盘io处理程序接收到该请求,根据offset获取内存索引对应的item项,直接通过移位运算得到时间复杂度为o(1),将引用计数 1;
步骤③:如果有需要将数据拆分成多个cache对象,插入cache树中,将根节点替换掉,如果没有设置为o_direct则直接返回,后续数据将异步同步到ssdcache和hdd中;
步骤④:如果设置了o_direct,将cache对象的数据同步到节点对应的ssdcacheblock中返回;后续由异步进程同步到后端hdd中;
基于cache系统的读取流程步骤:
步骤①:应用程序发起读取请求,请求中包含(offset,length,buffer);
步骤②:虚拟磁盘io处理程序接收到该请求,根据offset获取内存索引对应的item项,直接通过移位运算得到时间复杂度为o(1),将引用计数 1;
步骤③:根据item的最高位bit,判断offset对应的数据是否在cache中;如果在cache中,在直接从item读取到其对应的cache树的索引id值,如果cache对象保存了数据,将数据读取返回;如果cache对象内存数据已是否,则根据cache树节点的值对应的ssdcache偏移id,从ssd读取数据;
步骤④:如果所请求不在cache中,则直接请求存储主机,读取数据;
步骤⑤:比较该请求对应item的引用计数,如果该item的引用计数大于cache树根节点的引用计数,则节点替换,缓存更新;
步骤⑥:如果该item的引用计数小于cache树根节点的引用计数,表示该数据块热度不够,数据返回后,则不更新缓存。
由于内存的掉电易失性,内存中仅仅保存读取的数据,更新的数据需要写入ssd中以防掉电数据丢失。
以上所述仅为本发明的优选实施方式,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其它相关的技术领域,均同理包括在本发明的专利保护范围内。