一种分布式存储缓存读取和写入方法转让专利

申请号 : CN202010094507.3

文献号 : CN111309262B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 熊江于超

申请人 : 西安奥卡云数据科技有限公司

摘要 :

本发明公开了一种分布式存储缓存读取和写入方法,接收待写入的数据对象,为每个数据对象分配缓存空间,并将数据对象写入对应的缓存空间中;根据数据对象生成对应的数据对象指纹,通过分布式哈希表为数据对象指纹分配存储节点;当存储节点包含当前存储节点时,将数据对象写入当前存储节点的磁盘中;当存储节点不包含当前存储节点时,为数据对象指纹设置本地缓存标识,并将数据对象发送至远程存储节点;通过使用本发明的分布式缓存方法,读写缓存统一入口,软件复杂度低,降低分布式存储系统的访问时间,提升系统性能。

权利要求 :

1.一种分布式存储缓存写入方法,其特征在于,包括:

接收待写入的数据对象,为每个所述数据对象分配缓存空间,并将所述数据对象写入对应的所述缓存空间中;

根据所述数据对象生成对应的数据对象指纹,通过分布式哈希表为所述数据对象指纹分配存储节点;

当所述存储节点包含当前存储节点时,将所述数据对象写入当前存储节点的磁盘中;

当所述存储节点不包含当前存储节点时,为所述数据对象指纹设置本地缓存标识,并将数据对象发送至远程存储节点。

2.如权利要求1所述的一种分布式存储缓存写入方法,其特征在于,当所述远程存储节点接收到所述数据对象后,还包括:所述远程存储节点为每个所述数据对象分配缓存空间,将所述数据对象写入对应的所述缓存空间中,并将数据对象写入当前存储节点的磁盘中。

3.如权利要求2所述的一种分布式存储缓存写入方法,其特征在于,所述分布式哈希表的生成方法为:为每个存储节点生成节点哈希值,并由小到大对所述节点哈希值进行排序,生成所述分布式哈希表。

4.如权利要求1所述的一种分布式存储缓存写入方法,其特征在于,通过分布式哈希表为所述数据对象指纹分配存储节点包括:将所述数据对象指纹依次与所述分布式哈希表中的节点哈希值进行对比,直至找到第一个节点哈希值,且该节点哈希值大于所述数据对象指纹的值,将该节点哈希值对应的存储节点作为所述数据对象指纹对应的数据对象的存储节点;

判断所述数据对象的存储节点数量是否达到预定副本值,若是,则完成分配存储节点;

否则,重复为所述数据对象指纹分配存储节点,直至所述数据对象的存储节点数量达到预定副本值,完成分配存储节点。

5.一种分布式存储缓存读取方法,其特征在于,包括:

根据待读取数据对象对应的逻辑块号查询所述数据对象对应的数据对象指纹;

在缓存空间中查询所述数据对象指纹对应的数据对象:

当所述缓存空间中存在所述数据对象时,返回所述数据对象指纹对应的数据对象;

当所述缓存空间中不存在所述数据对象时,向当前存储节点查询所述数据对象指纹对应的数据对象,若当前存储节点存在该数据对象,则返回所述数据对象指纹对应的数据对象;否则通过分布式哈希表为所述数据对象指纹查询远程存储节点,并通过所述远程存储节点返回所述数据对象指纹对应的数据对象。

说明书 :

一种分布式存储缓存读取和写入方法

【技术领域】

[0001] 本发明属于计算机存储技术领域,尤其涉及一种分布式存储缓存读取和写入方法。【背景技术】
[0002] 存储系统正在向着大规模、分布式、虚拟化方向发展,分布式存储系统应运而生,在分布式存储系统中都引入了高速缓存系统,高速缓存被定义为系统中为更快地处理将来的请求而保留的数据的存储容量。缓存中存储的数据由于经常被访问而存储在那里,或者是存储在另一个位置的数据的重复副本。缓存本质上使将来的访问更快。
[0003] 当前分布式存储系统的缓存系统,大多是节点内缓存,业务数据通DHT或者其它离散算法发到节点,节点收到IO请求后进行相应流程处理。这样就给系统带来了以下缺陷:
[0004] 1)缓存系统是节点内缓存,需要在存储节点外增加分布式模块,进行副本或者EC的处理流程。
[0005] 2)缓存系统不会缓存其它节点的数据,针对读热点数据需要跨节点访问,读性能受到极大影响。
[0006] 3)缓存系统的读缓存和写缓存是独立的,增加了软件复杂度;读数据时需要先读写缓存,不成功在再读读缓存,不成功再读SSD POOL,读请进路径复杂,步骤多影响读性能。
[0007] 4)使用SSD WAL cache作持久化保证,整个写性能受限于SSD的性能,系统的写性能受到极大影响。
[0008] 5)通用分布式存储缓存系统针对HDD和SSD等存储介质各不相同,不能统一使用一套方案。
[0009] 由于上述缺陷的存在,导致了现有的分布式存储系统中数据访问时间长,系统性能低。【发明内容】
[0010] 本发明的目的是提供一种分布式存储缓存读取和写入方法,以降低分布式存储系统的访问时间,提升系统性能。
[0011] 本发明采用以下技术方案:一种分布式存储缓存写入方法,包括:
[0012] 接收待写入的数据对象,为每个数据对象分配缓存空间,并将数据对象写入对应的缓存空间中;
[0013] 根据数据对象生成对应的数据对象指纹,通过分布式哈希表为数据对象指纹分配存储节点;
[0014] 当存储节点包含当前存储节点时,将数据对象写入当前存储节点的磁盘中;
[0015] 当存储节点不包含当前存储节点时,为数据对象指纹设置本地缓存标识,并将数据对象发送至远程存储节点。
[0016] 进一步地,当远程存储节点接收到数据对象后,还包括:
[0017] 为每个数据对象分配缓存空间,将数据对象写入对应的缓存空间中,并将数据对象写入当前存储节点的磁盘中。
[0018] 进一步地,分布式哈希表的生成方法为:
[0019] 为每个存储节点生成节点哈希值,并由小到大对节点哈希值进行排序,生成分布式哈希表。
[0020] 进一步地,通过分布式哈希表为数据对象指纹分配存储节点包括:
[0021] 将数据对象指纹依次与分布式哈希表中的节点哈希值进行对比,直至找到第一个节点哈希值,且该节点哈希值大于数据对象指纹的值,将该节点哈希值对应的存储节点作为数据对象指纹对应的数据对象的存储节点;
[0022] 判断数据对象的存储节点数量是否达到预定副本值,若是,则完成分配存储节点;否则,重复为数据对象指纹分配存储节点,直至数据对象的存储节点数量达到预定副本值,完成分配存储节点。
[0023] 本发明的另一种技术方案:一种分布式存储缓存读取方法,包括:
[0024] 根据待读取数据对象对应的逻辑块号查询数据对象对应的数据对象指纹;
[0025] 在缓存空间中查询数据对象指纹对应的数据对象:
[0026] 当缓存空间中存在数据对象时,返回数据对象指纹对应的数据对象;
[0027] 当缓存空间中不存在数据对象时,向当前存储节点查询数据对象指纹对应的数据对象,若当前存储节点存在该数据对象,则返回数据对象指纹对应的数据对象;否则通过分布式哈希表为数据对象指纹查询远程存储节点,并通过远程存储节点返回数据对象指纹对应的数据对象。
[0028] 本发明的有益效果是:通过使用本发明的分布式缓存方法,读写缓存统一入口,软件复杂度低;写缓存使用NVDIMM保存数据,不存在持久化性能瓶颈;读缓存使用普通内存,成本可控;读缓存保存跨节点数据,减少读流程的跨节点访问。缓存系统结合内置分布式模块完成副本或者EC处理,无需额外分布式模块。针对HDD和SSD等存储介质使用统一方案,维护成本低。【附图说明】
[0029] 图1为现有技术中通用HDD存储写缓存处理流程示意图;
[0030] 图2为现有技术中通用HDD存储读缓存处理流程示意图;
[0031] 图3为现有技术中通用SSD存储写缓存处理流程示意图;
[0032] 图4为现有技术中通用SSD存储读缓存处理流程示意图;
[0033] 图5为本发明实施例中软件模块架构图;
[0034] 图6为本发明实施例中分布式存储缓存写流程示意图;
[0035] 图7为本发明实施例中分布式存储缓存读流程示意图;
[0036] 图8为本发明实施例中分布式哈希表示意图。【具体实施方式】
[0037] 下面结合附图和具体实施方式对本发明进行详细说明。
[0038] 现有技术中通常的HDD缓存处理流程和SDD缓存处理流程概述如下:
[0039] 通用HDD存储写缓存处理流程
[0040] 如图1所示,是通用HDD存储写缓存处理流程,存储节点收到业务的写IO操作(图中Write IO)时,会将Write IO在MemoryWrite Cache内存中保存一份,同时同步以日志的方式记录到SSD WAL Cache中并返回成功完成本次写操作,这个流程通常称为Write IO流程。
[0041] 通常SSD Disk Cache分为两个部分:SSD Write Cache和SSD Read Cache。MemoryWrite Cache中的数据会进行排序重整并等待满分条以副本或EC的方式直接写入到SSD Write Cache中并返回;对于大块IO则直接由MemoryWrite Cache直通写到HDD中,而不驻留在SSD Write Cache里;当SSD Write Cache中的保存数据水位达到刷盘阀值时,则由SSD Write Cache往HDD中搬迁。
[0042] 随着MemoryWrite Cache中的数据逐步刷盘到SSD Write Cache时,SSD WAL Cache中的数据将逐步淘汰掉,通常会进行异步的垃圾回收。
[0043] 通用HDD存储读缓存处理流程:
[0044] 如图2所示,是通用HDD存储读缓存处理流程,存储节点在收到业务的读IO操作时,会进行如下步骤处理:
[0045] 步骤1,从内存“Memory Write Cache”中查找是否存在所需数据,存在则直接返回,否则执行步骤2;
[0046] 步骤2,从内存“Memory Read Cache”中查找是否存在所需数据,存在则直接返回,否则执行步骤3;
[0047] 步骤3,从“SSD Write Cache”中查找是否存在所需数据,存在则直接返回,否则执行步骤4;
[0048] 步骤4,从“SSD Read Cache”中查找是否存在所需数据,存在则直接返回,否则执行步骤5;
[0049] 步骤5,从硬盘中查找到所需数据并返回,同时增加该数据的热点访问因子,如果热点访问因子达到阀值,则会被缓存在“SSD Read Cache”中。
[0050] 通用SSD存储写缓存处理流程:
[0051] 如图3所示,是通用SSD存储写缓存处理流程,存储节点收到业务的写IO操作(图中Write IO)时,会将Write IO在MemoryWrite Cache内存中保存一份,同时同步以日志的方式记录到SSD WAL Cache中并返回成功完成本次写操作,这个流程通常称为Write IO流程。
[0052] Memory Write Cache中的数据会进行排序重整并等待满分条以副本或EC的方式直接写入到SSD POOL中并返回;
[0053] 当MemoryWrite Cache中的保存数据水位达到刷盘阀值时,则由Memory Write Cache往SSD POOL中搬迁。随着MemoryWrite Cache中的数据逐步刷盘到SSD POOL时,SSD WAL Cache中的数据将逐步淘汰掉,我们通常会进行异步的垃圾回收。
[0054] 通用SSD存储读缓存处理流程:
[0055] 如图4所示,是通用SSD存储读缓存处理流程,存储节点在收到业务的读IO操作时,会进行如下步骤处理:
[0056] 步骤1,从内存“Memory Write Cache”中查找是否存在所需数据,存在则直接返回,否则执行步骤2;
[0057] 步骤2,从内存“Memory Read Cache”中查找是否存在所需数据,存在则直接返回,否则执行步骤3;
[0058] 步骤3,从SSD POOL中查找到所需数据并返回,同时增加该数据的热点访问因子,如果热点访问因子达到阀值,则会被缓存在“Memory Read Cache”中。
[0059] 由上述可知,现有的缓存方法具有以下缺陷:
[0060] 1)缓存系统是节点内缓存,需要在存储节点外增加分布式模块,进行副本或者EC的处理流程。2)缓存系统不会缓存其它节点的数据,针对读热点数据需要跨节点访问,读性能受到极大影响。3)缓存系统的读缓存和写缓存是独立的,增加了软件复杂度;读数据时需要先读写缓存,不成功在再读读缓存,不成功再读SSD POOL,读请求处理路径复杂,步骤多影响读性能。4)使用SSD WAL cache作持久化保证,整个写性能受限于SSD的性能,系统的写性能受到极大影响。5)通用分布式存储缓存系统针对HDD和SSD等存储介质各不相同,不能统一使用一套方案。
[0061] 因此,本发明实施例提供了一种分布式存储缓存写入方法,包括:
[0062] 接收待写入的数据对象,为每个数据对象分配缓存空间,并将数据对象写入对应的缓存空间中;根据数据对象生成对应的数据对象指纹,通过分布式哈希表为数据对象指纹分配存储节点;当存储节点包含当前存储节点时,将数据对象写入当前存储节点的磁盘中;当存储节点不包含当前存储节点时,为数据对象指纹设置本地缓存标识,并将数据对象发送至远程存储节点。
[0063] 通过使用本发明的分布式缓存方法,读写缓存统一入口,软件复杂度低;写缓存使用NVDIMM保存数据,不存在持久化性能瓶颈;读缓存使用普通内存,成本可控;读缓存保存跨节点数据,减少热点读请求的跨节点访问。缓存系统结合内置分布式模块完成副本或者EC处理,无需额外分布式模块。针对HDD和SSD等存储介质使用统一方案,维护成本低。
[0064] 具体的,当远程存储节点接收到数据对象后,还包括:
[0065] 为每个数据对象分配缓存空间,将数据对象写入对应的缓存空间中;并将数据对象写入当前存储节点的磁盘中。
[0066] 本发明给出了的一种分布式存储缓存写入方法的具体实施例,该实施例是基于如图5所示的软件模块架构图,该图中灰色部分表示缓存系统。本实施例中,单个存储节点大体分为三个大模块,VLUN处理LUN导出等控制流程以及IO请求。CACHE模块响应IO请求,处理多副本或者EC流程,负责对接后端Object Store模块;Object Store实现处理单机版的对象存储。
[0067] CACHE模块大体分为四个模块,Cache Line模块负责读写缓存统一入口管理;NVDIMM模块负责写缓存空间分配;MEMORY模块负责读缓存空间分配;DHT负责维护集群拓扑,负责多副本或者EC处理。
[0068] 如图6所示,为本实施例的写流程示意图,图中包含了:1.存储节点1,2,3;2.每个节点中,分别运行了:a.VLUN模块,b.CACHE模块,c.Object Store模块;3.用户数据对象1和用户数据对象2;4.逻辑卷LUN1。
[0069] 具体的,系统的写流程按如下流程进行:
[0070] 系统向用户展现逻辑卷,即逻辑空间LUN1;
[0071] 用户向逻辑空间LUN1发送写请求;
[0072] 每当有新的用户数据到达系统,系统先将用户数据拆分成固定大小(例如4KB)的数据对象,即数据对象1和数据对象2;
[0073] 数据对象发给CACHE模块,CACHE模块处理主要步骤如下:
[0074] 1)首先分配一个匿名的缓存对象控制结构对象;
[0075] 2)从NVDIMM中申请对象存储空间,将数据对象写入对象存储空间中;
[0076] 3)把对象存储空间地址记录到控制结构对象中;
[0077] 4)计算数据对象指纹,查询DHT放置策略,如果不包含本节点,则打上local cache标志,保证local cache对象刷到后端对象存储中,只保存在缓存中,以便加速后续的读请求。
[0078] 5)将控制对象插入缓存统一入口中。
[0079] 6)根据DHT放置策略,将数据副本写入远端CACHE模块,远端处理方式重复上面的步骤1)到步骤5),只是不处理放置策略相关内容。
[0080] 系统返回写成功。
[0081] 当写缓存空间达到一定水位后,异步刷到后端对象存储系统中。
[0082] 作为一种具体的实现方式,分布式哈希表的生成方法为:
[0083] 为每个存储节点生成节点哈希值,并由小到大对节点哈希值进行排序,生成分布式哈希表。通过分布式哈希表为数据对象指纹分配存储节点包括:将数据对象指纹依次与分布式哈希表中的节点哈希值进行对比,直至找到第一个节点哈希值,且该节点哈希值大于数据对象指纹的值,将该节点哈希值对应的存储节点作为数据对象指纹对应的数据对象的存储节点。
[0084] 判断数据对象的存储节点数量是否达到预定副本值,若是,则完成分配存储节点;否则,重复为数据对象指纹分配存储节点,直至数据对象的存储节点数量达到预定副本值,完成分配存储节点。
[0085] 更为具体的,本实施例还提供了具体的实现方式,如图8所示,为分布式哈希表的结构示意图。该分布式哈希表的工作流程如下:
[0086] 1.以存储节点的某一种属性或某几种属性的综合为节点设置不同的权重,根据权重在哈希环上为存储节点分配不同数目的环点。因此,权重越高,分配的哈希环点越多。比如:我们单纯依据磁盘的容量。每一Megabytes(兆字节)数据为一点权重的话。一个容量为100GB的存储节点权重就是102400,分配102400个环点;一个容量为50GB的存储节点权重就是51200,分配51200个环点。
[0087] 2.为每个存储节点每个环点命名,并计算哈希值。例如:节点名为sda,那么它的环点的命名依次就是sda_0,sda1,…,sda_102399。以此计算出各个环点的哈希值。
[0088] 3.组合各个存储节点环点算出的哈希值成一个哈希数组,按照哈希的数值大小排列。由于哈希本身是随机,且均匀的。那么按照哈希数值大小排列后,各个存储节点的哈希环点就被均匀的分布在了DHT环上。
[0089] 4.根据配置的副本数或者EC信息和存储节点拓扑为每一个存储节点环点分配几个存储节点构成环点放置策略组。要注意的是,某个存储节点(A)生成的DHT环点及其放置策略组涉及的存储节点可能不包含自己(A),只包含其它节点(例如两副本情况BC)。
[0090] 5.每当有新的数据要写入,对数据块进行哈希计算,得到数据的指纹。数据指纹在从上述哈希环起始位置开始进行查询,直到找到第一个比数据指纹值更大的存储节点环点。那么,该环点所属的存储节点,就是新的数据块应该被保存的存储节点。只要数据块的内容不变,它的指纹就不会变。因此,写入算出的环点,在读请求的时候会得到相同的环点。从而使得读请求会去数据所在的存储节点上去寻找数据。
[0091] 6.当有存储节点增减的时候,根据新的存储节点拓扑结果,哈希环点将被重新计算并排序。不变环点的相对位置不会发生变化;变化的只是新加入或被删除存储节点对应的那些环点,以及与之相关的数据。因此,只有发生变化的存储节点上的数据需要移出或移入,并且移动后的数据还是均匀成比例分布在新的存储节点组合上。整个系统还是保持稳定平衡的状态。
[0092] 另外,本发明的另一个实施例给出了一种分布式存储缓存读取方法,包括:
[0093] 根据待读取数据对象对应的逻辑块号查询数据对象对应的数据对象指纹;在缓存空间中查询数据对象指纹对应的数据对象:当缓存空间中存在数据对象时,返回数据对象指纹对应的数据对象;当缓存空间中不存在数据对象时,向当前存储节点查询数据对象指纹对应的数据对象,若当前存储节点存在该数据对象,则返回数据对象指纹对应的数据对象;否则通过分布式哈希表为数据对象指纹查询远程存储节点,并通过远程存储节点返回数据对象指纹对应的数据对象。
[0094] 作为更为具体的实施例,如图7所示,图中包含了:1.存储节点1,2,3;2.每个节点中,分别运行了:a.VLUN模块,b.CACHE模块,c.Object Store模块;3.逻辑卷LUN1。
[0095] 该实施例中系统的读流程按如下流程进行:
[0096] 节点1向用户展现逻辑卷,即逻辑空间LUN1;
[0097] 用户向逻辑空间LUN1发送读请求,请求中带有所要读取的逻辑块号;
[0098] 逻辑空间模块查询元数据,找到对应的数据对象的指纹1;
[0099] 逻辑空间将指纹1发给CACHE模块请求读取数据,CACHE模块处理主要步骤如下:
[0100] 1)从缓存统一入口查询缓存,读到数据则返回;
[0101] 2)否则,首先分配一个匿名的缓存对象控制结构对象;
[0102] 3)从MEMORY模块中申请对象存储空间;
[0103] 4)把对象存储空间地址记录到控制结构对象中;
[0104] 5)向后端Object Store模块读取数据,如果读不到则进入第8)步,读到数据进行下一步;
[0105] 6)把数据写到之前申请的对象存储空间中;
[0106] 7)将控制对象插入缓存统一入口中,将缓存数据对象返回给用户;
[0107] 8)根据指纹1查询DHT模块获取副本放置策略组,
[0108] 9)向放置策略组的第一个节点请求数据,读到数据则进行6)7)步;
[0109] 10)如果读不到数据,则向放置策略组的其它所有节点并发请求数据,读到数据则进行6)7)步;
[0110] 11)所有节点都读不到数据,则向用户返回失败。
[0111] 在上述实施例中,对写入和读取实施例的描述都各有侧重,由于数据写入和数据读取是两个相似的操作流程,所以,在数据读取实施例中没有详述或记载的部分,可以参见数据写入实施例的相关描述。
[0112] 本发明的写入和读取方法,可以用于分布式存储中的缓存管理,不是节点内缓存系统,而是跨节点的分布式缓存系统;读缓存和写缓存统一入口,读写流程更加简单化;与磁盘无关的缓存系统,适用于HDD和SSD等分布式存储系统。
[0113] 通过本发明的分布式缓存技术,使得读写缓存统一入口,软件复杂度低;写缓存使用NVDIMM保存数据,不存在持久化性能瓶颈;读缓存使用普通内存,成本可控;读缓存保存跨节点数据,减少读程的跨节点访问。缓存系统结合内置分布式模块完成副本或者EC处理,无需额外分布式模块。针对HDD和SSD等存储介质使用统一方案,维护成本低。