发明内容
本发明提供一种存储虚拟化的装置、数据存储方法及***,用以提高物理存储空间的利用率。
根据本发明的一方面,提供一种存储虚拟化的装置,包括:
逻辑存储单元模块,用于通过对所述至少两个固态存储器进行独立冗余磁盘阵列RAID组划分,形成至少一个逻辑存储单元;
资源块模块,用于对所述逻辑存储单元进行条带化处理,形成分别与所述逻辑存储单元的各条带对应的存储资源块;
映射模块,用于接收主机发送的写请求消息,根据所述写请求消息中携带的逻辑地址获取用于写入待写入数据的逻辑块号;获取空闲的存储资源块,根据所获取的空闲的存储资源块的逻辑存储单元偏移量和逻辑条带号计算所获取的空闲的存储资源块的物理块号,建立所述逻辑块号与所述物理块号的映射关系;
数据写入模块,用于根据所述映射关系将所述待写入数据写入与所述物理块号对应的存储空间。
根据本发明的另一方面,还提供一种数据存储方法,包括:
接收主机发送的写请求消息,根据所述写请求消息中携带的逻辑地址获取用于写入待写入数据的逻辑块号;
获取空闲的存储资源块,其中存储资源块是通过对逻辑存储单元进行条带化处理形成的,所述逻辑存储单元是通过对至少两个固态存储器进行RAID组划分形成的;
根据获取的空闲的存储资源块的逻辑存储单元偏移量和逻辑条带号计算所获取的空闲的存储资源块的物理块号,建立所述逻辑块号与所述物理块号的映射关系;
根据所述映射关系将所述待写入数据写入与所述物理块号对应的存储空间。
根据本发明的再一方面,还提供一种数据存储***,包括:
物理存储模块,包括至少两个固态存储器;
逻辑存储单元模块,用于通过对所述至少两个固态存储器进行独立冗余磁盘阵列RAID组划分,形成至少一个逻辑存储单元;
资源块模块,用于对所述逻辑存储单元进行条带化处理,形成分别与所述逻辑存储单元的各条带对应的存储资源块;
映射模块,用于接收主机发送的写请求消息,根据所述写请求消息中携带的逻辑地址获取用于写入待写入数据的逻辑块号;获取空闲的存储资源块,根据所获取的空闲的存储资源块的逻辑存储单元偏移量和逻辑条带号计算所获取的空闲的存储资源块的物理块号,建立所述逻辑块号与所述物理块号的映射关系;
所述物理存储模块还用于根据所述映射关系将所述待写入数据写入与所述物理块号对应的存储空间。
根据本发明的存储虚拟化的装置、数据存储方法及***,通过不需要预先为用户或主机分配固定的存储资源,仅分配逻辑块号。在接收到写请求消息时,基于资源块模块的存储资源块建立逻辑块号与真实的物理存储资源之间的映射关系,即实现存储资源分配,并且由于基于存储资源块实现资源分配,摆脱了RAID组的限制。因此,实现了用户与物理存储资源之间的动态、灵活映射,从而能够最大限度地提升物理存储空间利用率。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
图1为用于应用本发明实施例的数据存储***的架构图。如图1所示,数据存储***与至少一台主机连接,用于对主机数据进行存储。
图2为本发明实施例的数据存储***的结构示意图。如图2所示,该数据存储***包括物理存储模块21、逻辑存储单元模块22、资源块模块23和映射模块24,其中:
物理存储模块21包括至少两个固态存储器;
逻辑存储单元模块22用于通过对所述至少两个固态存储器进行RAID组划分,形成至少一个逻辑存储单元;
资源块模块23用于对所述逻辑存储单元进行条带化处理,形成分别与所述逻辑存储单元的各条带对应的存储资源块;
映射模块24用于接收主机发送的写请求消息,根据所述写请求消息中携带的逻辑地址获取用于写入待写入数据的逻辑块号;获取空闲的存储资源块,根据所获取的空闲的存储资源块的逻辑存储单元偏移量和逻辑条带号计算所获取的空闲的存储资源块的物理块号,建立所述逻辑块号与所述物理块号的映射关系;
所述物理存储模块21还用于根据所述映射关系将所述待写入数据写入与所述物理块号对应的存储空间。
具体地,该数据存储***一共划分为四层,物理存储模块21、逻辑存储单元模块22、资源块模块23和映射模块24分别对应于存储***的一层,即:物理存储模块21对应于物理存储层,逻辑存储单元模块22对应于逻辑存储单元层,资源块模块23对应于资源块层,映射模块24对应于映射层。在该存储***中,最底层为物理存储层,物理存储层包括实际存在的物理存储介质。该物理存储介质例如为SSD、直连式存储设备(DAS)、网络附属存储(Network Attached Storage,NAS)或存储区域网络(SAN)等,优选为SSD。物理存储层的上一层是逻辑存储单元层。逻辑存储单元层将物理存储层的物理存储介质划分为RAID组。RAID组可以划分为常用的几种RAID级别,例如为RAID1、RAID3、RAID5和RAID10等。
下文中以物理存储介质为SSD盘片,并且RAID组划分为RAID10级别为例进行说明。
在本实施例中,例如物理存储层包括2N个SSD盘片,其中N为自然数。按照RAID10级别,将2N个SSD盘片两两划分为一个RAID组,一共形成N个RAID1组,一个RAID1组即为逻辑存储单元层的一个逻辑存储单元,各逻辑存储单元间以RAID0的方式存在。进一步地,对逻辑存储单元进行条带化处理。图3为逻辑存储单元条带化处理示意图,如图3所示。假设主机I/O以4KB随机分布,则对逻辑存储单元4KB分条深度进行分条,每一个条带都可以作为一个存储的资源,成为存储资源块(CHUNK),将这些CHUNK放入一个资源池,组成了资源块(CHUNK)层23。每个CHUNK标识有该CHUNK对应的逻辑存储单元偏移量(Disk Offset)和逻辑条带号(Logic StripNo)。
CHUNK层之上是映射层。映射层中存放逻辑块号(LBN),LBN的数量与CHUNK层所包括的CHUNK的数量相等。映射层根据用户通过主机发送的存储空间分配指令为用户建立逻辑单元号(LUN),并按照用户需要的存储空间大小分配一定数量的LBN。当接收到用户通过主机下发的写请求消息时,在CHUNK层内取出可用的CHUNK,根据该CHUNK的逻辑存储单元偏移量和逻辑条带号计算该CHUNK的物理块号(PBN)。其中,PBN的结构为“DiskOffset”+“Logic Strip No”。假设分条深度为4KB,则对于存储容量为400GB的SSD盘片,需以27个比特位来标识逻辑条带号;假设逻辑存储单元层包括24个逻辑存储单元,则需以5个比特位来标识逻辑存储单元偏移量,则此时每个PBN的长度为32个比特位。映射层建立并存储用户的LBN与计算获得的PBN之间的映射关系,例如图4所示,图4为LBN与PBN映射关系示意图。
当映射层响应写请求消息,完成用户的LBN与PBN的映射之后,即为该写请求消息的待写入数据完成存储资源的分配后,根据PBN,将待写入数据写入物理存储层中的对应存储位置。至此,完成了数据存储。
当映射层接收到用户通过主机发送的读请求指令时,通过查询该用户的LBN与PBN的映射关系,即可获知待读取数据在物理存储层中的真实存储位置,从而读取出数据,释放该PBN对应的CHUNK,并删除该用户的LBN与PBN的映射关系。
根据上述实施例的数据存储***,通过划分为物理存储模块、逻辑存储单元模块、资源块模块和映射模块,不需要预先为用户或主机分配固定的存储资源,仅分配逻辑块号。在接收到写请求消息时,基于资源块层的存储资源块建立逻辑块号与真实的物理存储资源之间的映射关系,即实现存储资源分配,并且由于基于存储资源块实现资源分配,所以摆脱了RAID组的限制。因此,实现了用户与物理存储资源之间的动态、灵活映射,从而能够最大限度地提升物理存储空间利用率。
进一步地,在上述实施例的数据存储***中,所述映射模块还用于接收主机发送的携带请求分配空间长度的存储空间分配指令,响应所述存储空间分配指令在主机上建立逻辑单元号,根据所述请求分配空间长度和各逻辑块号的空间长度计算需分配的逻辑块号的第一数量,在主机上分配第一数量的逻辑块号,并建立第一数据的所述逻辑单元号与所分配的逻辑块号的对应关系,执行写请求操作。
其中,执行写请求操作即为上述实施例中映射模块接收到主机发送的写请求消息时所执行的相应操作,即:根据所述写请求消息中携带的逻辑地址获取用于写入待写入数据的逻辑块号;获取空闲的存储资源块,根据所获取的空闲的存储资源块的逻辑存储单元偏移量和逻辑条带号计算所获取的空闲的存储资源块的物理块号,并建立所述逻辑块号与所述物理块号的映射关系。第一数量例如可以为请求分配空间长度相对于各逻辑块号的空间长度的倍数。
具体地,图5为用户申请建立LUN的结构示意图。如图5所示,映射层响应用户1的存储空间分配指令建立一个LUN,例如将该LUN标识为LUN 1。假设用户1所申请的存储空间需要4个LBN的空间大小,则映射层从空闲的LBN中划出4个LBN作为LUN 1的LBN,例如为图5中的LBN0-LBN3,LBN0-LBN3的逻辑地址与主机逻辑地址具有对应关系。当接收到用户1通过主机发送的写请求消息时,获知该用户1对应的LUN为LUN1,从而获知该用户所对应的LBN为LBN0-LBN3。由于写请求消息中还携带有主机用于存储待写入数据的主机逻辑地址,例如起始地址为500M,待写入数据长度为4M,则可从LBN0-LBN3中选取出与该主机逻辑地址对应的LBN,例如LBN2。之后,为LBN2分配CHUNK,计算所分配CHUNK的PBN,并建立LBN2与PBN之间的映射关系。
进一步地,在上述实施例的数据存储***中,所述映射模块还用于接收主机发送的携带请求扩展空间长度的容量扩充指令,根据所述请求扩展空间长度和各逻辑块号的空间长度计算需扩展的逻辑块号的第二数量,从空闲逻辑块号中选取所计算的第二数量的逻辑块号,并添加第二数量的所述逻辑单元号与所选取的逻辑块号的对应关系,以对所述逻辑单元号进行容量扩充。
其中,空闲逻辑块号为未建立与任意LUN的对应关系的逻辑块号。第二数量例如为请求扩展空间长度相对于各逻辑块号的空间长度的倍数。
具体地,当LUN1需要扩展时,用户1可向映射层发送容量扩充指令。映射层接收到用户1发送的容量扩充指令后,为用户1再新建一个LUN,例如为LUN5,并在空闲的LBN中继续划分一段连续区域,例如为图5中的LBN11-LBN14,则LUN5与LUN1一起作为用户1的逻辑存储空间。
根据上述实施例的数据存储***,由于为用户建立LUN、为用户LUN分配LBN,以及建立LBN与PBN之间的映射关系均通过映射模块来实现,因此可以使LUN分配不受RAID组的限制任意扩展,即方便地实现跨RAID组的资源分配。
进一步地,在上述实施例的数据存储***中,所述资源块模块还用于将各存储资源块按照逻辑存储单元进行分组,并为各存储资源块设置对应的、用于记录所述存储资源块的写操作次数的写计数值;相应地,所述映射模块响应所述写请求消息从所述资源块模块中获取空闲的存储资源块时,还用于比较各空闲的存储资源块的写计数值与存储***平均写操作次数,以获取写计数值低于存储***平均写操作次数的存储资源块。
具体地,利用上述实施例的数据存储***还可实现全局的磨损均衡。全***的磨损均衡以CHUNK为单位进行,对每个CHUNK增设一个写计数值(Wcnt),每次对该CHUNK进行写操作时,将该CHUNK的写计数值加1。此外,还设立一个全局写操作计数值(Gcnt),即***执行一次写操作,则该全局写操作计数值加1,通过将全局写操作计数值除以该***的逻辑存储单元数量,即可获取***平均写操作次数。因此可以通过遍历***中的全部逻辑存储单元来区分高于或低于***平均写操作次数的CHUNK,进行分类并进行搬移操作,从而实现磨损均衡。
此外,还可在上述实施例的数据存储***中实现负载均衡。具体地,将CHUNK按照所归属的逻辑存储单元进行分组存放,每次写请求消息到来时依次分配下一个逻辑存储单元中的CHUNK。例如,响应第一写请求消息,从第一逻辑存储单元中选取CHUNK;响应第二写请求消息,从第二逻辑存储单元中选取CHUNK,以此类推。按此方式,可将写请求消息发送到不同的逻辑存储单元的CHUNK,实现***内各逻辑存储单元的负载均衡。
进一步地,在上述实施例的数据存储***中,还包括:
所述映射模块还用于当所述资源块模块中的空闲的存储资源块的数量低于预设阈值时发出告警信号,以使用户响应所述告警信号对用户所对应的逻辑单元号进行容量扩充。其中,该预设阈值可以由用户根据需要任意设定,例如设置为空闲的存储资源块的数量为总存储资源块的数量的1/10。
图6为本发明实施例的存储虚拟化的装置的结构示意图。如图6所示,该存储虚拟化的装置包括:
逻辑存储单元模块61,用于通过对所述至少两个固态存储器进行独立冗余磁盘阵列RAID组划分,形成至少一个逻辑存储单元;
资源块模块62,用于对所述逻辑存储单元进行条带化处理,形成分别与所述逻辑存储单元的各条带对应的存储资源块;
映射模块63,用于接收主机发送的写请求消息,根据所述写请求消息中携带的逻辑地址获取用于写入待写入数据的逻辑块号;获取空闲的存储资源块,根据所获取的空闲的存储资源块的逻辑存储单元偏移量和逻辑条带号计算所获取的空闲的存储资源块的物理块号,建立所述逻辑块号与所述物理块号的映射关系;
数据写入模块64,用于根据所述映射关系将所述待写入数据写入与所述物理块号对应的存储空间。
上述实施例的存储虚拟化的装置可以实施于前述的数据存储***根据用户的请求,执行对上述物理存储模块的操作。
具体地,逻辑存储单元模块61例如按照RAID10级别,将2N个SSD盘片两两划分为一个RAID组,一共形成N个RAID1组,一个RAID1组即为逻辑存储单元层的一个逻辑存储单元,各逻辑存储单元间以RAID0的方式存在。进一步地,对逻辑存储单元进行条带化处理。每一个条带都作为一个可以存储的资源,成为CHUNK,将这些CHUNK放入一个资源池,组成了CHUNK层62。每个CHUNK标识有对应的Disk Offset和Logic Strip No。
映射模块63中存放LBN,LBN的数量与CHUNK模块所包括的CHUNK的数量相等。映射模块63根据用户通过主机发送的存储空间分配指令为用户建立LUN,并按照用户需要的空间分配一定数量的LBN。当接收到用户通过主机下发的写请求消息时,在CHUNK模块62内取出可用的CHUNK,根据该CHUNK的逻辑存储单元偏移量和逻辑条带号计算该CHUNK的PBN。其中,PBN的结构为“Disk Offset”+“Logic Strip No”。假设分条深度为4KB,则对于存储容量为400GB的SSD盘片,需以27个比特位来标识逻辑条带号;假设逻辑存储单元层61包括24个逻辑存储单元,则需以5个比特位来标识逻辑存储单元偏移量,则此时每个PBN的长度为32个比特位。映射模块63建立并存储用户的LBN与计算获得的PBN之间的映射关系,例如图4所示。
当映射模块63响应写请求消息,完成用户的LBN与PBN的映射之后,即为该写请求消息的待写入数据完成存储资源的分配后,根据PBN,将待写入数据写入固态存储器的对应存储位置。至此,完成了数据存储。
当映射模块63接收到用户通过主机发送的读请求指令时,通过查询该用户的LBN与PBN的映射关系,即可获知待读取数据在固态存储器中的真实存储位置,从而读取出数据,释放该PBN对应的CHUNK,并删除该用户的LBN与PGN的映射关系。
根据上述实施例的存储虚拟化的装置,通过划分为逻辑存储单元模块、资源块模块和映射模块,不需要预先为用户或主机分配固定的存储资源,仅分配逻辑块号。在接收到写请求消息时,基于资源块层的存储资源块建立逻辑块号与真实的物理存储资源之间的映射关系,即实现存储资源分配,并且由于基于存储资源块实现资源分配,所以摆脱了RAID组的限制。因此,实现了用户与物理存储资源之间的动态、灵活映射,从而能够最大限度地提升物理存储空间利用率。
进一步地,在上述实施例的存储虚拟化的装置中,所述映射模块还用于接收主机发送的携带请求分配空间长度的存储空间分配指令,响应所述存储空间分配指令,在主机上建立逻辑单元号,根据所述请求分配空间长度和各逻辑块号的空间长度计算需分配的逻辑块号的第一数量,在主机上分配所计算的第一数量的逻辑块号,并建立所述第一数量的逻辑单元号与所分配的逻辑块号的对应关系,执行写请求操作。
进一步地,在上述实施例的存储虚拟化的装置中,所述映射模块还用于接收主机发送的携带请求扩展空间长度的容量扩充指令,根据所述请求扩展空间长度和各逻辑块号的空间长度计算需扩展的逻辑块号的第二数量,从空闲逻辑块号中选取所计算的第二数量的逻辑块号,并添加第二数量的所述逻辑单元号与所选取的逻辑块号的对应关系,以对所述逻辑单元号进行容量扩充。
进一步地,在上述实施例的存储虚拟化的装置中,所述资源块模块还用于为各存储资源块设置对应的、用于记录所述存储资源块的写操作次数的写计数值;相应地,所述映射模块响应所述写请求消息从所述资源块模块中获取空闲的存储资源块时,还用于比较各空闲的存储资源块的写计数值与存储***平均写操作次数,以获取写计数值低于存储***平均写操作次数的空闲的存储资源块,可以有效的利用写计数值较低的存储资源块进行读写操作,避免对某些存储资源块过多的进行读写操作,根据上述实施例的存储虚拟化的装置,能够实现固态存储器的磨损均衡,增加固态存储器的使用寿命。
进一步地,在上述实施例的存储虚拟化的装置中,其特征在于,所述映射模块还用于当所述资源块模块中的空闲的存储资源块的数量低于预设阈值时发出告警信号,以使用户响应所述告警信号进行容量扩充。
图7为本发明实施例的数据存储方法的流程示意图。如图7所示,该数据存储方法包括以下步骤:
步骤S701,接收主机发送的写请求消息,根据所述写请求消息中携带的逻辑地址获取用于写入待写入数据的逻辑块号;
步骤S702,获取空闲的存储资源块,其中存储资源块是通过对逻辑存储单元进行条带化处理形成的,所述逻辑存储单元是通过对至少两个固态存储器进行RAID组划分形成的;
步骤S703,根据获取的空闲的存储资源块的逻辑存储单元偏移量和逻辑条带号计算所获取的空闲的存储资源块的物理块号,建立所述逻辑块号与所述物理块号的映射关系;
步骤S704,根据所述映射关系将所述待写入数据写入与所述物理块号对应的存储空间。
上述实施例的数据存储方法由前述任一实施例的存储虚拟化的装置来实现。
具体地,映射模块根据用户通过主机发送的存储空间分配指令为用户建立LUN,并按照用户需要的空间分配一定数量的LBN。当接收到用户通过主机下发的写请求消息时,在CHUNK模块内取出可用的CHUNK,根据该CHUNK的逻辑存储单元偏移量和逻辑条带号计算该CHUNK的PBN。
映射模块建立并存储用户的LBN与计算获得的PBN之间的映射关系。当映射模块响应写请求消息,完成用户的LBN与PBN的映射之后,即为该写请求消息的待写入数据完成存储资源的分配后,根据PBN,将待写入数据写入固态存储器中的对应存储位置。至此,完成了数据存储。
根据上述实施例的数据存储方法,由于不需要预先为用户或主机分配固定的存储资源,仅分配逻辑块号。在接收到写请求消息时,基于资源块模块的存储资源块建立逻辑块号与真实的物理存储资源之间的映射关系,即实现存储资源分配,并且由于基于存储资源块实现资源分配,所以摆脱了RAID组的限制。因此,实现了用户与物理存储资源之间的动态、灵活映射,从而能够最大限度地提升物理存储空间利用率。
进一步地,在上述实施例的数据存储方法中,接收主机发送的写请求消息之前还包括:
接收主机发送的携带请求分配空间长度的存储空间分配指令,响应所述存储空间分配指令,在主机上建立逻辑单元号,根据所述请求分配空间长度和各逻辑块号的空间长度计算需分配的逻辑块号的第一数量,在主机上分配所计算的第一数量的逻辑块号,并建立第一数量的所述逻辑单元号与所分配的逻辑块号的对应关系;
相应地,根据所述写请求消息中携带的逻辑地址获取用于写入待写入数据的逻辑块号具体包括:
从与所述逻辑单元号所对应的逻辑块号中,获取与所述逻辑地址对应的用于写入待写入数据的逻辑块号。
上述用户建立LUN的具体流程与前述实施例的存储***相同,故此处不再赘述。
进一步地,在上述实施例的数据存储方法中,所述接收主机发送的携带请求分配空间长度的存储空间分配指令之后还包括:
接收主机发送的携带请求扩展空间长度的容量扩充指令,根据所述请求扩展空间长度和各逻辑块号的空间长度计算需扩展的逻辑块号的第二数量,从空闲逻辑块号中选取所计算的第二数量的逻辑块号,并添加第二数量的所述逻辑单元号与所选取的逻辑块号的对应关系,以对所述逻辑单元号进行容量扩充。
上述用户扩展LUN的具体流程与前述实施例的存储***相同,故此处不再赘述。
根据上述实施例的数据存储方法,由于为用户建立LUN、为用户LUN分配LBN以及建立LBN与PBN之间的映射关系均通过映射模块来实现,因此可以使LUN分配不受RAID组的限制任意扩展,即方便地实现跨RAID组的资源分配。
进一步地,在上述实施例的数据存储方法中,各存储资源块设置有对应的、用于记录所述存储资源块的写操作次数的写计数值;
相应地,所述从资源块模块中获取空闲的存储资源块具体包括:
比较各空闲的存储资源块的写计数值与存储***平均写操作次数;
确定写计数值低于存储***平均写操作次数的空闲的存储资源块为所获取的空闲的存储资源块。
根据上述实施例的数据存储方法,能够有效实现存储***中的磨损均衡。
进一步地,在上述实施例的数据存储方法中,还包括:
若检测获知所述资源块模块中的空闲的存储资源块的数量低于预设阈值,则发出告警信号,以使用户响应所述告警信号进行容量扩充。
最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。