数据访问方法、装置、存储节点及存储介质与流程

文档序号:30494642发布日期:2022-06-22 03:37阅读:122来源:国知局
数据访问方法、装置、存储节点及存储介质与流程

1.本发明涉及存储技术领域,具体而言,涉及一种数据访问方法、装置、存储节点及存储介质。


背景技术:

2.持久内存(pmem)虽然可以保证写入pmem的数据掉电重启后不会丢失,但写入pmem的数据往往需要先写到cpu cache里,再通过一系列cpu指令把数据刷到pmem中。由于pmem和cpu的硬件限制,向pmem中写入大于8字节的数据并持久化无法保证写操作的原子性(即如果在持久化写入数据过程中掉电,无法保证数据完整写完),所以如何保证持久化写入pmem的数据的一致性是本领域技术人员亟待解决的问题。


技术实现要素:

3.本发明的目的在于提供了一种数据访问方法、装置、存储节点及存储介质,其能够保证持久化写入pmem的数据的一致性。
4.为了实现上述目的,本发明实施例采用的技术方案如下:
5.第一方面,本发明实施例提供了一种数据访问方法,应用于存储节点,所述存储节点包括持久内存,所述持久内存包括元数据区和数据区,所述存储节点和客户端通信连接,所述方法包括:接收所述客户端发送的写数据请求,其中,所述写数据请求包括待写数据的数据长度和待写位置;根据所述数据长度生成用于管理所述待写数据的第一元数据;根据所述数据长度及所述待写位置,生成用于管理所述待写数据写入日志的第二元数据;将所述待写数据写入至所述数据区之后,将所述第一元数据写入至所述元数据区,以及将所述第二元数据写入至所述数据区。
6.可选地,所述根据所述数据长度生成用于管理所述待写数据的第一元数据的步骤包括:
7.根据所述数据长度和预设长度,计算分段数;
8.将所述待写数据按照所述分段数进行切分,得到至少一个数据分段;
9.根据所述数据分段的个数及每一所述数据分段在所述待写数据中的位置,生成每一所述数据分段的元数据;
10.为所述待写数据生成一个预留元数据,其中,所述预留元数据包括所述数据分段的个数加1后的值;
11.将所述预留元数据及所有所述数据分段的元数据作为所述第一元数据。
12.可选地,所述根据所述数据长度及所述待写位置,生成用于管理所述待写数据写入日志的第二元数据的步骤包括:
13.获取用于表征所述待写数据的成功写入所述数据区的标志位;
14.根据所述标志位、所述数据长度及所述待写位置,生成校验数据;
15.将所述标志位、所述数据长度、所述待写位置及所述校验数据作为所述第二元数
据。
16.可选地,所述元数据区包括多个元数据单元,所述多个元数据单元采用分级管理,每一级别对应一个链表,每一所述链表包括至少一个管理节点,每一所述管理节点用于管理位置相邻的元数据单元,同一链表中的管理节点管理的元数据单元的个数相同,任意两个链表中的管理节点管理的元数据单元的个数不同,所述将所述第一元数据写入至所述元数据区的步骤包括:
17.根据所述数据长度及所述预设长度,确定目标级别;
18.从所述目标级别对应的链表的管理节点中确定第一待写元数据单元和第二待写元数据单元,其中,所述第一待写元数据单元的个数为所述数据分段的个数,所述第二待写元数据单元的个数为1;
19.按照每一所述数据分段在所述待写数据中的位置,依次将每一所述数据分段的元数据写入至每一所述第一待写元数据单元;
20.将所述预留元数据写入至所述第二待写元数据单元。
21.可选地,所述数据区包括多个数据单元,每一元数据单元对应一个数据单元,每一所述数据分段写入至与每一所述目标元数据单元对应的数据单元,所述将所述第二元数据写入至所述数据区的步骤包括:
22.将所述第二待写元数据单元对应的数据单元作为待写数据单元;
23.将所述第二元数据写入至所述待写数据单元。
24.可选地,所述数据区包括多个数据单元,所述存储节点还包括硬盘、刷盘列表及回收列表,所述刷盘列表包括待刷数据的刷盘位置及存储所述待刷数据的数据单元,所述待刷数据为存储至所述持久内存、且待刷入至所述硬盘的数据,所述刷盘位置为写所述待刷数据的写数据请求中的待写位置,所述方法还包括:
25.根据所述待写位置及所述刷盘位置,确定有效数据单元和无效数据单元;
26.若所述有效数据单元未存在于所述刷盘列表中,将所述有效数据单元更新至所述刷盘列表中,以通过所述刷盘列表将所述有效数据单元中的数据从所述持久内存刷入至所述硬盘;
27.若所述无效数据单元存在于所述刷盘列表中,将所述无效数据单元从所述刷盘列表中删除并插入至所述回收列表中,以通过所述回收列表将所述无效数据单元进行回收。
28.可选地,所述将所述无效数据单元从所述刷盘列表中删除并插入至所述回收列表中的步骤包括:
29.若所述回收列表中存在满足预设合并条件的待合并数据单元,将所述待合并数据单元从所述回收列表中删除;
30.将所述待合并数据单元与所述无效数据单元进行合并,得到待插入数据单元;
31.将所述待插入数据单元插入至所述回收列表;
32.若所述回收列表中不存在所述待合并数据单元,则将所述无效数据单元插入至所述回收列表。
33.可选地,所述方法还包括:
34.接收所述客户端发送的读数据请求,其中,所述读数据请求包括待读数据的数据长度和待读位置;
35.根据所述待读数据的数据长度及所述待读位置,从所述硬盘中读出原始数据;
36.根据所述待读位置确定所述刷盘列表中是否存在与待读数据对应的、且未存入所述硬盘的最新数据;
37.将所述原始数据和所述最新数据进行组合,得到所述待读数据。
38.可选地,所述存储节点还包括硬盘,当所述存储节点下电时,所述持久内存存储有待写入所述硬盘的待下盘数据,所述元数据区包括多个元数据单元,每一元数据单元包括日志标识,所述数据区包括多个数据单元,每一所述元数据单元管理一个所述数据单元,所述待下盘数据至少存在于一个所述数据单元中,所述方法还包括:
39.当所述存储节点上电时,按照日志标识将所述多个元数据单元划分为至少一个元数据单元组;
40.对每一所述元数据单元组进行重建处理,以将所述待下盘数据写入所述硬盘。
41.可选地,每一所述元数据单元包括分片数量、分片索引及日志标识,所述对每一所述元数据单元组进行重建处理,以将所述待下盘数据写入所述硬盘的步骤包括:
42.对于所述至少一个元数据单元组中任一目标元数据单元组,根据所述目标元数据单元组中目标元数据单元的分片数量及分片索引,对所述目标元数据单元组进行重建,得到所述目标元数据单元组对应的日志;
43.从最后一个分片索引的目标元数据单元管理的数据单元中读取所述日志的状态,其中,所述日志的状态用于表征所述目标元数据单元中、除最后一个分片索引之外其余的目标元数据单元管理的数据单元中的目标数据是否存在于所述数据区;
44.若所述日志的状态为用于表征所述目标数据存在于所述数据区的缓存状态,则将所述目标数据刷入所述硬盘;
45.将所有日志状态为缓存状态的所述元数据单元组中元数据单元管理的数据单元中的数据刷入所述硬盘,最终将所述待下盘数据写入所述硬盘。
46.可选地,所述方法还包括:
47.若所述日志的状态为表征所述目标数据未存在于所述数据区的非缓存状态,则将所述目标元数据单元的数据单元回收;
48.将所有日志状态为非缓存状态的所述元数据单元组中的元数据单元管理的数据单元回收。
49.第二方面,本发明实施例提供了一种数据访问装置,应用于存储节点,所述存储节点包括持久内存,所述持久内存包括元数据区和数据区,所述存储节点和客户端通信连接,所述装置包括:接收模块,用于接收所述客户端发送的写数据请求,其中,所述写数据请求包括待写数据的数据长度和待写位置;生成模块,用于根据所述数据长度生成用于管理所述待写数据的第一元数据;所述生成模块,还用于根据所述数据长度及所述待写位置,生成用于管理所述待写数据写入日志的第二元数据;写入模块,用于将所述待写数据写入至所述数据区之后,将所述第一元数据写入至所述元数据区,以及将所述第二元数据写入至所述数据区。
50.第三方面,本发明实施例提供了一种存储节点,包括处理器和存储器;所述存储器用于存储程序;所述处理器用于在执行所述程序时,实现上述第一方面中的数据访问方法。
51.第四方面,本发明实施例还提供了一种计算机可读存储介质,其上存储有计算机
程序,该计算机程序被处理器执行时实现如上述第一方面中的数据访问方法。
52.相对于现有技术,本发明实施例提供的数据访问方法、装置、存储节点及存储介质,当接收到客户端发送的写数据请求时,根据写数据请求中的待写数据的数据长度生成管理待写数据的第一元数据,根据数据长度及待写位置,生成管理待写数据写入日志的第二元数据,先将待写数据写入数据区,再将第一元数据和第二元数据分别写入元数据区和数据区,通过第一元数据和第二元数据能够保证向持久内存写入数据时满足原子性,进而保证持久内存中数据的一致性。
附图说明
53.为了更清楚地说明本发明实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
54.图1为本发明实施例提供的应用场景的示例图。
55.图2为本发明实施例提供的存储节点的方框示意图。
56.图3为本发明实施例提供的一种数据访问方法的流程示例图。
57.图4为本发明实施例提供的另一种数据访问方法的流程示例图。
58.图5为本发明实施例提供的另一种数据访问方法的流程示例图。
59.图6为本发明实施例提供的持久内存的地址空间的划分示例图。
60.图7为本发明实施例提供的分级链表的示例图。
61.图8为本发明实施例提供的另一种数据访问方法的流程示例图。
62.图9为本发明实施例提供的链表更新的示例图。
63.图10为本发明实施例提供的待写数据的写入流程的示意图。
64.图11为本发明实施例提供的另一种数据访问方法的流程示例图。
65.图12为本发明实施例提供的各种无效数据和有效数据确定方式的示意图。
66.图13为本发明实施例提供的等级链表插入过程的示例图。
67.图14为本发明实施例提供的另一种数据访问方法的流程示例图。
68.图15为本发明实施例提供的另一种数据访问方法的流程示例图。
69.图16示出了本发明实施例提供的数据访问装置的方框示意图。
70.图标:10-存储节点;11-处理器;12-持久内存;13-硬盘;14-总线;20-客户端;100-数据访问装置;110-接收模块;120-生成模块;130-写入模块;140-读取模块;150-刷盘模块;160-重建模块。
具体实施方式
71.为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施例的组件可以以各种不同的配置来布置和设计。
72.因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护
的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
73.应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
74.在本发明的描述中,需要说明的是,若出现术语“上”、“下”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,或者是该发明产品使用时惯常摆放的方位或位置关系,仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明的限制。
75.此外,若出现术语“第一”、“第二”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
76.需要说明的是,在不冲突的情况下,本发明的实施例中的特征可以相互结合。
77.持久内存是能够通过常规访存指令(而非系统调用)访问的,具有低延迟(而非i/o总线)及字节可寻址(而非块)特性的非易失存储器。字节可寻址(byte-addressable)表示以字节而非块为基本单位进行寻址,而非易失性(non-volatile)表示在掉电后其中的数据不会丢失。持久内存通常处于外存(普通硬盘或者固态硬盘)以及内存(动态随机存取存储器)之间,其不论在容量、性能、价格上都是处于两者的中间位置。
78.在使用持久内存时,需要克服技术障碍是如何避免在使用持久内存时不会出现数据一致性问题。由于处理器中的寄存器及缓存是易失性,而大电容仅能确保掉电后内存控制器中的数据写入持久内存,使得持久内存中的数据可能并非数据的最新副本。因缓存-内存中的数据不一致而引发的问题,便称为数据一致性问题。数据一致性问题的影响,轻则导致数据丢失,重则导致系统无法恢复。
79.现有技术为了避免数据一致性问题,通常由应用程序显示调用持久化指令,且所有持久化指令必须顺序地、毫无重叠(overlapped)执行,这种方式虽然保证了数据一致性,但是持久化指令的执行效率却让人无法接受,在不强调持久化指令完成顺序的情况下,如内存拷贝,通常会牺牲对持久化指令的顺序约束,而获得执行效率上的提升。
80.有鉴于此,本发明实施例提供一种数据访问方法、装置、存储节点及存储介质,既无需牺牲持久化指令的顺序约束,又能保证数据一致性,下面将对其进行详细描述。
81.请参考图1,图1为本发明实施例提供的应用场景的示例图,图1中,存储节点10和客户端20通信连接,存储节点10包括持久内存和硬盘,客户端20向存储节点10发送数据访问请求(包括读数据请求和写数据请求),客户端20发送写数据请求时,存储节点10可以将待写数据写入至硬盘,也可以写入至持久内存,或者为了保证写性能,将待写数据暂存于持久内存后立即响应客户端,之后再将持久内存中暂存的数据从持久内存刷至硬盘。本发明实施例提供的数据访问方法能够适用于待写数据写入至持久内存和待写数据暂存于持久内存,之后再刷至硬盘这两种情况中的至少一种。
82.在本实施例中,存储节点10可以是单个存储服务器、或者存储阵列或者由多个存储服务器组成的服务器组中的任一个存储节点,用于存储客户端20写数据请求需要存储的用户数据或者用于管理用户数据的元数据。
83.客户端20可以是普通主机、服务器或者移动终端等,用户通过客户端20发出数据
访问请求,客户端20将该数据访问请求发送至存储节点10。
84.硬盘可以是串行连接scsi(serial attached scsi,sas)sas硬盘,或者串口sata(serial advanced technology attachment,sata)硬盘等机械硬盘,也可以是固态硬盘ssd((solid state disk,ssd)。
85.基于图1的应用场景,本发明实施例提供了图1中存储节点10的方框示意图,请参照图2,图2为本发明实施例提供的存储节点的方框示意图,图2中,存储节点10包括处理器11、持久内存12、硬盘13和总线14。处理器11、持久内存12、硬盘13通过总线14通信。
86.处理器11可能是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器11中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器11可以是通用处理器,包括中央处理器(central processing unit,简称cpu)、网络处理器(network processor,简称np)等;还可以是数字信号处理器(dsp)、专用集成电路(asic)、现成可编程门阵列(fpga)或者其它可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。
87.存储器12用于存储程序,例如,本发明实施例中的数据访问装置,数据访问装置包括至少一个可以软件或固件(firmware)的形式存储于存储器12中的软件功能模块,处理器11在接收到执行指令后,执行所述程序以实现本发明实施例中的数据访问方法。
88.存储器12还用于存储客户端写数据请求需要存储的用户数据及用于管理用户数据的元数据。
89.存储器12可以是图1中持久内存和硬盘中的至少一种,可选地,存储器12可以是内置于处理器11中的存储装置,也可以是独立于处理器11的存储装置。
90.总线13可以是isa总线、pci总线或eisa总线等。图2仅用一个双向箭头表示,但并不表示仅有一根总线或一种类型的总线。
91.在图1和图2的基础上,本发明实施例提供了一种应用于图1和图2中存储节点10的数据访问方法,请参照图3,图3为本发明实施例提供的一种数据访问方法的流程示例图,该方法包括以下步骤:
92.步骤s100,接收客户端发送的写数据请求,其中,写数据请求包括待写数据的数据长度和待写位置。
93.在本实施例中,待写数据是用户需要存储至存储节点10的数据。存储节点10向客户端20提供可以访问的存储空间,例如,存储节点10向客户端20提供一个10gb的存储空间a,用户可以通过客户端将数据存储至存储空间a的任意位置,例如,用户为了在存储空间a前1gb的空间中写入待写数据,用户通过客户端20向存储节点10发送写数据请求,其中,写数据请求包括待写数据的数据长度为1gb,待写位置为存储空间的起始位置,即第0字节。
94.步骤s101,根据数据长度生成用于管理待写数据的第一元数据。
95.在本实施例中,持久内存可以按照固定长度进行管理,若数据长度大于该固定长度,待写数据会被拆分成多个数据分段写入持久内存,否则,待写数据可以直接写入固定长度的存储空间,第一元数据用于管理待写数据,例如,第一元数据通过记录待写数据拆分的数据分段的个数及每一个数据分段在待写数据中的位置等信息对待写数据进行管理。
96.步骤s102,根据数据长度及待写位置,生成用于管理待写数据写入日志的第二元数据。
97.在本实施例中,第二元数据用于管理待写数据写入日志,写入日志用于记录待写数据的写入情况,写入情况可以包括是否写入成功,写入位置等,例如,第二元数据可以通过不同的标志标识待写数据是否已经成功写入持久内存。
98.步骤s103,将待写数据写入至数据区之后,将第一元数据写入至元数据区,以及将第二元数据写入至数据区。
99.在本实施例中,先写待写数据,再写第一元数据和第二元数据,可以保证待写数据要么全部正确写入至数据区,即此时数据区中是最新数据,要么在异常掉电后重新上电时,根据第一元数据和第二元数据将该数据区恢复至写入待写数据之前的状态,即此时数据区中是写入待写数据之前的旧数据,不会出现数据区中同时存在最新数据和旧数据的数据不一致情况。
100.本发明实施例提供的上述方法,通过第一元数据和第二元数据能够保证向持久内存写入数据时满足原子性,进而保证持久内存中数据的一致性。
101.在图3的基础上,本发明实施例还提供了一种生成第一元数据的具体实施方式,请参照图4,图4为本发明实施例提供的另一种数据访问方法的流程示例图,步骤s101包括以下子步骤:
102.子步骤s1010,根据数据长度和预设长度,计算分段数。
103.在本实施例中,预设长度可以根据实际场景需要进行设置,例如,预设长度设置为4kb。作为一种具体实现方式,分段数可以采用如下公式计算得到:
104.子步骤s1011,将待写数据按照分段数进行切分,得到至少一个数据分段。
105.在本实施例中,可以理解的是,当数据长度为预设长度的整数倍时,按照分段数对待写数据进行切分是平均切分,当数据长度不为预设长度的整数倍时,最后一个数据分段的长度与其余数据分段的长度不同。
106.子步骤s1012,根据数据分段的个数及每一数据分段在待写数据中的位置,生成每一数据分段的元数据。
107.在本实施例中,每一数据分段的元数据可以包括数据分段的个数及每一数据分段在待写数据中的位置。
108.在本实施例中,为了确定属于同一次写入的待写数据的数据分段,还可以在同一次写入的待写数据的每一数据分段中设置相同的标识,标识相同的数据分段属于同一次写入的待写数据。写数据请求的待写数据至少包括以下两种情况:一个写数据请求中的待写数据可一次写入,一个写请求中的待写数据需要分多次写入,对于前者,待写数据划分为多个数据分段,这多个数据分段的标识相同,对于后者,首先确定每次写入的长度,再分别对每次写入的数据进行分段,同一次写入的数据分段的标识相同,不同次写入的数据分段的标识不同。
109.在本实施例中,为了提高每一数据分段的元数据的可靠性,每一数据分段的元数据还可以包括校验数据,以保证数据分段包括的信息的可靠性,若每一数据分段包括数据分段的个数和每一数据分段在待写数据中的位置,则校验数据可以根据数据分段的个数和每一数据分段的位置得到,若每一数据分段包括标识、数据分段的个数和每一数据分段在待写数据中的位置,则校验数据可以根据标识、数据分段的个数及每一数据分段的位置得
到。
110.在本实施例中,为了减少生成校验数据对写性能的影响,可以采用加法运算得到校验数据,例如,将标识、数据分段的个数和每一数据分段在待写数据中的位置三者相加,得到对应的校验数据。当然在写性能影响可接受的范围内,也可以采样其他方式计算校验数据,例如循环冗余校验crc(cyclic redundancy check,crc)。
111.子步骤s1013,为待写数据生成一个预留元数据,其中,预留元数据包括数据分段的个数加1后的值。
112.在本实施例中,和每一数据分段的元数据类似,预留元数据除了包括数据分段的个数加1后的值,也可以包括位置、校验数据和标识,预留元数据的位置为最后一个数据分段之后的位置,预留元数据的标识与任一数据分段的标识相同。
113.子步骤s1014,将预留元数据及所有数据分段的元数据作为第一元数据。
114.本发明实施例提供的上述方法,通过为每一数据分段生成对应的元数据,再将待写数据作为整体,生成一个对应的预留元数据,保证了第一元数据记录待写数据的完整性和准确性。
115.在图3的基础上,本发明实施例还提供了一种生成第二元数据的具体实施方式,请参照图5,图5为本发明实施例提供的另一种数据访问方法的流程示例图,步骤s102包括以下子步骤:
116.子步骤s1020,获取用于表征待写数据的成功写入数据区的标志位。
117.在本实施例中,可以为标志字段设置不同的值以表征待写数据的写入情况,例如,标志字段为“cached”时表征待写数据成功写入数据区,标志字段为“none”时表征待写数据已经从数据区刷入硬盘,当然也可以用不同的整数值来标识,标志字段取值为1表征待写数据成功写入数据区,为0表征从数据区刷入硬盘。
118.子步骤s1021,根据标志位、数据长度及待写位置,生成校验数据。
119.在本实施例中,为了避免生成校验数据对写性能的影响,可以采用加法运算得到校验数据,将标志位、数据长度及待写位置三者相加,得到该校验数据,当然在写性能影响可接受的范围内,也可以采样其他方式计算校验数据,例如循环冗余校验crc(cyclic redundancy check,crc)。
120.子步骤s1022,将标志位、数据长度、待写位置及校验数据作为第二元数据。
121.本发明实施例提供的上述方法,通过标志位可以准确标识待写数据是否成功写入数据区,通过校验数据保证标志位、数据长度、待写位置的可靠性,并将标志位、数据长度、待写位置及校验数据作为第二元数据,保证了待写数据写入日志的完整性和准确性。
122.需要说明的是,在需要将持久内存中的数据刷入至硬盘的应用场景中,为了实现高效刷盘,除了第二元数据,存储节点10还需要生成硬盘元数据,硬盘元数据用于表征待写数据需要写入硬盘的位置,硬盘空间的管理方式不同,硬盘元数据的表示方式也会有差别,例如,硬盘元数据可以包括:硬盘标识,文件标识,对象标识,块标识,版本号等。
123.为了更清楚地说明第一元数据和第二元数据的写入过程,本发明实施例首先介绍一种持久内存的地址空间的具体划分方式,请参照图6,图6为本发明实施例提供的持久内存的地址空间的划分示例图,图6中,持久内存的地址空间被分为第一保留区、第二保留区、元数据区和数据区。
124.第一保留区和第二保留区大小均为4kb,分别设置于持久内存的首尾,且互为备份,这样的设置一方面可以兼具指示持久内存开始和结束位置,另一方面可以增强其中数据的可靠性,以第二保留区为例,该保留区包含3个字段:size字段用于记录持久内存的整个空间的大小,占用8b,magic字段设置为固定值,例如,固定值为0x4a3b2c1d,占用4b,checksum字段用于存储保留区前12个字节(size字段+magic字段)的crc32校验和,占用4b,以保证保留区数据的完整性,reserved字段为预留字段,以备后续扩展时使用,第一保留区与第二保留区一模一样,此处不再赘述。
125.元数据区与第一保留区相邻、且位于第一保留区之后的地址空间,元数据区的地址空间以16b大小对齐,并按照16b大小划分为多个元数据单元,一个元数据包含log id字段、count字段、index字段和checksum字段共4个字段。log id字段用于记录本次日志的日志id,日志是一系列存储数据按照一定顺序进行写入的集合。一条日志可以用log(offset,len)表示,offset表征待写数据应该写入的偏移位置,len标识待写数据的长度,即一条日志可以表征一次同时写入的待写数据,log id可以是当前系统时间到1970年1月1日的秒数+加上一个6位的线性增长的序列号,用于唯一表征一条日志。如果跨秒了,则序列号又重新从0开始计数。
126.count字段表征一次写入的待写数据拆分成的数据分段的分段数+1,例如,待写数据为256kb,拆分成64个4kb的数据分段,则count字段的值为65,count字段占用2b。
127.index字段表征表示本数据分段在待写数据中的相对位置,例如,待写数据分成了64个数据分段,则第一个数据分段的元数据单元中的count字段的值为65,index字段的值为1,其余数据分段的元数据单元中的index值依次递增,index字段占用2b。
128.checksum字段用于存放一个该元数据单元中前12b(即log id+count+index)的校验和,占用4b,由于元数据读写频繁,故校验方式采用前面三个字段相加而得到的校验和,不使用crc32,因为crc32比较耗时。
129.不管是元数据区中的checksum字段还是数据区中的checksum字段,占用的字节数都是4b,均小于8b,而在64位的计算机上,只有8字节的数据存储至持久化内存时才能保证原子性,因此,保证了数据一致性。
130.数据区与元数据区相邻、且位于元数据区之后的地址空间,数据区的地址空间以4kb大小对齐,并按照4kb大小划分为多个数据单元,数据单元与元数据单元一一对应,每一元数据单元管理对应的数据单元,每一数据单元的最后一个4kb用于存储硬盘元数据和第二元数据,其余4kb用于存储数据分段的数据。图6中的硬盘元数据包括硬盘标识字段、硬盘位置字段、文件标识、对象标识、块标识及版本号,第二元数据包括待写位置、数据长度、状态标志(对应前述的标志位)及校验数据。
131.对于图6中的地址空间的划分方式,已知持久内存的大小sizepmem,是可以确定第一保留区、元数据区、数据区及第二保留区的起始地址,并且可以进一步得到任一元数据单元的起始地址,由于元数据单元和数据单元一一对应,则因此也可以得到任一数据单元的起始地址,以便将第一元数据、第二元数据及待写数据写入至各自的地址空间内。下面将具体阐述起始地址的确定方式。
132.第一保留区为持久内存的地址空间的第一个4kb,因此,第一保留区的起始地址空间addrsuper1为:addrsuper1=0。
133.元数据区的起始地址空间为:addrmetabase=addrsuper1+sizesuper1。
134.为了计算数据区的起始地址,先计算出元数据单元的总数cntmeta,即数据单元的总数cntdata,元数据单元的总数的计算方式为:
135.cntmeta=cntdata=(sizepmem

sizesuper1*2)/(sizedata+sizemeta),sizedata为数据单元的长度,sizemeta中为元数据单元的长度,由此可得数据区的起始地址为:
136.addrdatabase=0+sizesuper1+ceiling(cntmeta*sizemeta),其中,ceiling表示对得到和结果按照4k进行对齐,对应持久内存地址空间划分图6中的pad对齐。
137.确定了元数据区和数据区的起始地址,便可根据乘法算出任意元数据单元和任意数据单元的位置。
138.同理可得,第二保留区的起始地址addrsuper2为:
139.addrsuper2=addrdatabase+cntdata*sizedata。
140.结合图6所示的持久内存的空间划分的示例图,本发明实施例具体描述如何确定并写入第一元数据、第二元数据及待写数据对应的元数据单元和数据单元。
141.为了更高效地确定第一元数据、第二元数据及待写数据对应的元数据单元和数据单元,本发明实施例采用分级管理的方式管理元数据单元,每一级别对应一个链表,每一链表包括至少一个管理节点,每一管理节点用于管理位置相邻的元数据单元,同一链表中的管理节点管理的元数据单元的个数相同,任一两个链表中的管理节点管理的元数据单元的个数不同。链表的级别可以根据一次写入的数据的最大长度和数据单元的长度确定,例如,一次写入的数据的最大长度设置为256kb,数据单元的长度为4kb,则链表的级别为:1~256kb/4kb,即1~64kb,请参照图7,图7为本发明实施例提供的分级链表的示例图,图7中,共包括64级链表,链表1~链表64,各链表中一个管理节点管理的元数据单元的个数分别为:1、2、3、4,

,64。
142.基于图3,同时结合图6的空间划分及图7的分级链表的示例说明第一元数据写入元数据区的过程,请参照图8,图8为本发明实施例提供的另一种数据访问方法的流程示例图,步骤s103包括以下子步骤,以写入第一元数据:
143.子步骤s103-10,根据数据长度及预设长度,确定目标级别。
144.在本实施例中,根据数据长度及预设长度,可以得到数据分段的个数,即分段数,根据分段数,确定初始级别,初始级别=分段数+1,若初始级别对应的链表中存在管理节点,则将初始级别确定为目标级别,若初始级别对应的链表中不存在管理节点,则从初始级别开始,找到的第一个存在管理节点的链表的级别确定为目标级别,例如,分段数为5,初始级别为5+1=6,链表6中不存在管理节点,从链表6开始,找到的第一个存在管理节点的链表为链表10,则链表10的级别10为目标级别。
145.子步骤s103-11,从目标级别对应的链表的管理节点中确定第一待写元数据单元和第二待写元数据单元,其中,第一待写元数据单元的个数为数据分段的个数,第二待写元数据单元的个数为1。
146.在本实施例中,若目标级别对应的链表中存在多个管理节点,则从中任意选择一个管理节点,再从该管理节点中确定第一待写元数据单元和第二待写元数据单元,第一待写元数据单元的个数为数据分段的个数,即分段数。
147.子步骤s103-12,按照每一数据分段在待写数据中的位置,依次将每一数据分段的元数据写入至每一第一待写元数据单元。
148.在本实施例中,第一待写元数据单元和第二待写元数据单元是地址连续的,当第一待写元数据单元为多个时,多个第一待写元数据单元也是地址连续的,根据每一数据分段在待写数据中的位置,将每一数据分段的元数据依次写入至第一待写数据单元中,即第一个数据分段的元数据写入第一个第一待写元数据单元,第二个数据分段的元数据写入第二个第一待写元数据单元,以此类推。
149.子步骤s103-13,将预留元数据写入至第二待写元数据单元。
150.在本实施例中,第二待写元数据单元与最后一个第一待写元数据单元相邻。
151.继续参照图8,步骤s103还包括以下子步骤,以写入第二元数据:
152.子步骤s103-20,将第二待写元数据单元对应的数据单元作为待写数据单元。
153.子步骤s103-21,将第二元数据写入至待写数据单元。
154.需要说明的是,数据分段按照其在待写数据中的位置依次写入其元数据单元对应的数据单元中,例如,第一个数据分段写入第一个数据分段的元数据单元对应的数据单元中。第一元数据和第二元数据是同时写入的、且都是在待写数据一次写入的全部数据分段写入至对应的数据单元之后才写入的,由此可以在异常掉电的情况下保证数据分段的数据一致性。
155.还需要说明的是,由于第一待写元数据单元和第二待写元数据单元已经被占用,因此,需要将其从对应链表的对应管理节点中删除,若第一待写元数据单元和第二待写元数据单元的个数之和与管理节点管理的元数据单元的个数相等,则直接删除对应的管理节点,若二者之和小于管理节点管理的元数据单元的个数,除了需要将其从对应链表的对应管理节点中删除之外,此时由于会导致管理节点管理的元数据单元的个数发生变化,为了满足链表的分级管理,需要根据变化后的管理节点中的元数据单元的个数将该元数据单元插入至对应级别的链表,请例参照图9,图9为本发明实施例提供的链表更新的示例图,第一待写元数据单元为5个,第二待写元数据单元为1个,链表6为空,链表7不为空,则从链表7中的管理节点中分配出6个元数据单元,链表7还剩余1个元数据单元,将这剩余的这一个元数据单元从链表7中插入至链表1中,需要说明的是,图9中只画出了和示例相关的链表1、链表6和链表7,其余链表用省略号代替,并不代表其他链表不存在。
156.还需要说明的是,作为一种具体实施方式,最开始可以只有一个级别的链表包括管理节点,例如,链表64中只有一个管理节点,管理所有元数据单元,其余级别的链表为空,随着管理节点的分配,该级别链表的管理节点逐渐被分割,插入至对应级别的链表中,具体过程本领域技术人员可以根据上述描述的分配过程不付出创造性劳动即可得到。
157.本发明实施例还基于图6提供待写数据的写入流程的示意图,请参照图10,图10为本发明实施例提供的待写数据的写入流程的示意图,图10中,待写数据的数据长度为254kb,由于245kb不是4kb的整数倍,因此,需要从硬盘中读取数据,将其补齐为4kb的整数倍256kb,参见图中斜线框中的示例,256kb被拆分成64个4kb,占用元数据区的65个元数据单元和数据区的65个数据单元,图10中只示例出第一个数据分段的元数据单元、预留元数据的元数据单元、及第一个数据分段对应的数据单元中各字段取值,其余数据分段与之类似,此处不再赘述。
158.在本实施例中,对于待写数据暂存于持久内存,最终要存储至硬盘的应用场景而言,需要将持久内存中的待写数据刷入(或者称为存储)至硬盘中,一旦待写数据成功刷入至硬盘中,为了及时释放待写数据占用的持久内存的空间,需要将待写数据占用的元数据单元及对应的数据单元释放,以便在后续写其他待写数据时使用。为了实现更高效的刷盘和释放,本发明实施例引入了刷盘列表和收回列表,待写数据写入至持久内存时,还会将待写数据及存储待写数据的数据单元加入至刷盘列表中,当刷盘列表中的数据刷入硬盘后,已刷入的数据对应的数据单元会加入至回收列表,以便进行回收。作为一种具体实现方式,刷盘流程和回收流程可以分别用两个独立的线程周期性地执行。本发明实施例还提供了一种刷盘流程的具体实现方式,请参照图11,图11为本发明实施例提供的另一种数据访问方法的流程示例图,该方法还包括以下步骤:
159.步骤s200,根据待写位置及刷盘位置,确定有效数据单元和无效数据单元。
160.在本实施例中,有效数据单元为需要刷入硬盘的数据单元,无效数据单元为不需要刷入硬盘的数据单元,例如,第一个写请求在位置1写入数据a,则a写入持久内存,在a未刷入至硬盘之前,写请求2在位置1写入数据b,则实际刷盘时,数据a是不需要刷入硬盘的,只需要将最新的数据b刷入硬盘即可。
161.在本实施例中,刷盘列表中可以包括多个待刷数据,每一待刷数据均对应一个刷盘位置,待写位置需要与刷盘列表中每一刷盘位置进行一一比对,以确定所有有效数据单元和无效数据单元,待写位置与任一刷盘位置进行比对的方式均相同,下面只就待写位置与任一刷盘位置比对进行描述。
162.根据待写位置与刷盘位置的不同,可以分为如下3种情况,每一种情况又包括3种不同的情形,下面将对每一种情况的每一种情形进行详细描述。
163.为了便于说明,待写位置和刷盘位置分别用login和logcmp表示,待写位置和刷盘位置均包括各自的开始偏移beginoffset、结束偏移endoffset,为了便于区分待写数据和待刷数据的写入顺序,待写数据和待刷数据均带有各自的版本号,版本号越大,表征对应的数据写入时间越晚,数据越新。根据待写位置和刷盘位置的开始偏移beginoffset、结束偏移endoffset可以确定其中的有效数据和无效数据,有效数据对应的数据单元为有效数据单元,无效数据对应的数据单元为无效数据单元,下面分情况、分情形重点描述确定无效数据和有效数据的具体实现方式。
164.情况1:login的开始偏移小于logcmp的开始偏移
165.情况1.1:login的结束偏移小于logcmp的结束偏移
166.在此种情况下,需要比较login和logcmp的版本号,如果login的版本号小于logcmp的版本号,那么说明logcmp在login里面的数据为无效数据,其余数据为有效数据;否则,将login的结束偏移赋值给logcmp的开始偏移,以表示login在logcmp里面的数据是有效的。
167.在本实施例中,本发明实施例针对每一情况、每一情形均利用图示说明,请参照图12,图12为本发明实施例提供的各种无效数据和有效数据确定方式的示意图,为了便于表述,图12中的所有图中矩形框中白色部分表示有效数据,带底纹的斜线部分表示无效数据,情况1.1的有效数据和无效数据的示意图如图12(a)所示。
168.情况1.2:login的结束偏移等于logcmp的结束偏移
169.在此种情况下,需要比较login和logcmp的版本号,如果login的版本号小于logcmp的版本号,那么说明logcmp在login里面的数据为无效数据,将logcmp的开始偏移赋值给login的结束偏移以表示之,其余数据为有效数据;否则,则说明整个logcmp里面的数据为无效数据,情况1.2的有效数据和无效数据的示意图如图12(b)所示。
170.情况1.3:login的结束偏移大于logcmp的结束偏移
171.在此种情况下,需要比较login和logcmp的版本号,如果login的版本号小于logcmp的版本号,那么说明logcmp在login里面的数据为无效数据,将logcmp的开始偏移赋值给login的结束偏移以表示之;否则,则说明整个logcmp里面的数据为无效数据。情况1.3的有效数据和无效数据的示意图如图12(c)所示。
172.情况2:login的开始偏移小于logcmp的开始偏移
173.情况2.1:login的结束偏移小于logcmp的结束偏移
174.在此种情况下,需要比较login和logcmp的版本号,如果login的版本号小于logcmp的版本号,则说明整个login中的数据是无效数据;否则,将login的结束偏移赋值给logcmp的开始偏移以指示logcmp的有效数据。情况2.1的有效数据和无效数据的示意图如图12(d)所示。
175.情况2.2:login的结束偏移等于logcmp的结束偏移
176.在此种情况下,需要比较login和logcmp的版本号,如果login的版本号小于logcmp的版本号,则说明整个login中的数据是无效数据,整个logcmp中的数据是有效数据,否则,则说明整个logcmp中的数据是无效数据,整个login中的数据是有效数据,情况2.2的有效数据和无效数据的示意图如图12(e)所示。
177.情况2.3:login的结束偏移大于logcmp的结束偏移
178.在此种情况下,需要比较login和logcmp的版本号,如果login的版本号小于logcmp的版本号,那么说明logcmp在login里面的数据为无效数据,其余数据为有效数据,将logcmp的结束偏移赋值给login的开始偏移以表示之;否则,则说明整个logcmp中的数据是无效数据,其余数据为有效数据,情况2.3的有效数据和无效数据的示意图如图12(f)所示。
179.情况3:login的开始偏移大于logcmp的开始偏移
180.情况3.1:log
in
的结束偏移小于logcmp的结束偏移
181.在此种情况下,需要比较login和logcmp的版本号,如果login的版本号小于logcmp的版本号,则说明整个login中的数据是无效数据,其余数据为有效数据;否则,说明logcmp在login里面的数据为无效数据,其余数据为有效数据,情况3.1的有效数据和无效数据的示意图如图12(g)所示。
182.情况3.2:login的结束偏移等于logcmp的结束偏移
183.在此种情况下,需要比较login和logcmp的版本号,如果login的版本号小于logcmp的版本号,则说明整个login中的数据是无效数据;否则,说明logcmp在login里面的数据为无效数据,将login的开始偏移赋值给logcmp的结束偏移以表示之,情况3.2的有效数据和无效数据的示意图如图12(g)所示。
184.情况3.3:login的结束偏移大于logcmp的结束偏移
185.在此种情况下,需要比较login和logcmp的版本号,如果login的版本号小于
logcmp的版本号,则说明logcmp在log
in
里面的数据为无效数据,其余数据为有效数据,将logcmp的结束偏移赋值给login的开始偏移以表示之;否则,说明login在logcmp里面的数据为无效数据,其余数据为有效数据,将login的开始偏移赋值给logcmp的结束偏移以表示之,情况3.3的有效数据和无效数据的示意图如图12(h)所示。
186.需要说明的是,作为一种具体实施方式,对于无效数据,需要将该无效数据对应的第二元数据中的标志位从“cached”设置为“none”,以便对该无效数据对应的数据单元进行回收。
187.步骤s201,若有效数据单元未存在于刷盘列表中,将有效数据单元更新至刷盘列表中,以通过刷盘列表将有效数据单元中的数据从持久内存刷入至硬盘。
188.需要说明的是,上述9种情况中,如果导致刷盘列表中已有的有效数据单元发生变化,则需要更新发生变化的有效数据单元的第一元数据、第二元数据;如果待写数据对应的数据单元部分变为无效,则需要对应更新待写数据的第一元数据和第二元数据;并且将变为无效的数据单元插入至回收列表中,以通过回收列表将其进行回收;如果待写数据对应的数据单元全部变为无效,则需要将其插入至回收列表中,以通过回收列表将无效数据单元进行回收。
189.步骤s202,若无效数据单元存在于刷盘列表中,将无效数据单元从刷盘列表中删除并插入至回收列表中,以通过回收列表将无效数据单元进行回收。
190.在本实施例中,为了及时、有效地对数据单元进行回收,同时又不至于使持久内存空间过于碎片化,本发明实施例还提供了一种插入回收列表的具体实现方式:
191.首先,若回收列表中存在满足预设合并条件的待合并数据单元,将待合并数据单元从回收列表中删除。
192.在本实施例中,满足预设合并条件可以是回收列表中的数据单元与无效数据单元的地址连续,地址连续可以是无效数据单元的结束地址和回收列表中的数据单元的起始地址连续,或者是无效数据单元的起始地址和回收列表中的数据单元的结束地址连续,或者是无效数据单元的起始地址和一个数据单元的结束地址连续、且无效数据单元的结束地址和另一个数据单元的起始地址连续。
193.在本实施例中,为了快速找到满足预设合并条件的待合并数据单元,可以采用红黑树的方式管理持久内存中的数据单元。
194.其次,将待合并数据单元与无效数据单元进行合并,得到待插入数据单元。
195.第三,将待插入数据单元插入至回收列表。
196.最后,若回收列表中不存在待合并数据单元,则将无效数据单元插入至回收列表。
197.可以理解的是,对回收列表中的数据单元回收时,由于数据单元和元数据单元是一一对应的,也需要将数据单元对应的元数据单元中的信息进行对应更新,例如,将元数据单元中各字段的值设置为0或者无效值。
198.需要说明的是,作为一种实施方式,回收列表可以是独立于等级链表的列表,对回收列表进行回收的过程实际上是将回收列表中的数据单元对应的元数据单元插入至等级链表中的过程,作为另一种实施方式,回收列表可以就是等级链表,将待插入数据单元插入至回收列表就是将待插入数据单元对应的元数据单元插入至等级链表的过程。当有新的元数据单元插入等级链表时,可能会导致等级链表中节点的变化,请参照图13,图13为本发明
实施例提供的等级链表插入过程的示例图,图13中,待插入的元数据单元3,链表2中包括元数据单元1和2,链表3包括的元数据单元4、5、6,由于元数据单元2和元数据单元4均与元数据单元3连续,则可以将元数据单元1-元数据单元6合并,合并后将元数据单元1-元数据单元6作为一个管理节点插入至链表6中。
199.本实施例提供的上述方法,可以避免无效数据的刷盘,减少了刷入硬盘的数据量,从而减小了对写性能的影响,同时将无效数据对应的数据单元及时释放,以提高持久内存的利用率,在插入回收列表时,尽量对需要回收的数据单元进行合并,有效地减少了持久内存空间的碎片化。
200.在本实施例中,在读取存储节点10中存储的数据时,欲读取的数据可能存储在持久内存中,也可能存储在硬盘中,也可能一部分在持久内存中,一部分在硬盘中,为了将数据正确读出,本发明实施例还提供了一种读数据的具体实现方式,请参照图14,图14为本发明实施例提供的另一种数据访问方法的流程示例图,该方法还包括以下步骤:
201.步骤s300,接收客户端发送的读数据请求,其中,读数据请求包括待读数据的数据长度和待读位置。
202.步骤s301,根据待读数据的数据长度及待读位置,从硬盘中读出原始数据。
203.步骤s302,根据待读位置确定刷盘列表中是否存在与待读数据对应的、且未存入硬盘的最新数据。
204.步骤s303,将原始数据和最新数据进行组合,得到待读数据。
205.在本实施例中,原始数据和最新数据可以重叠,也可以不重叠,当重叠时,用最新数据替代原始数据中二者重叠的部分,得到待读数据,当不重叠时,将原始数据和最新数据进行拼接得到待读数据。
206.在本实施例中,若刷盘列表中不存在与待读数据对应的、且未存入硬盘的最新数据,则表明硬盘中读出的原始数据已经是最新数据,此时,原始数据就是待读数据。
207.在本实施例中,在实际的运行环境中,存储节点10可能出现突然掉电的情况。掉电以后,如果正在写的数据只写一半,在存储节点10重新启动的时,读取掉电时写数据的位置,可能出现读取的数据即不是最新的,也不是次新的。此时,就会出现数据不一致性,为了避免出现数据不一致,本发明实施例还提供了一种重新上电后对数据进行重建的流程,请参照图15,图15为本发明实施例提供的另一种数据访问方法的流程示例图,该方法包括以下步骤:
208.步骤s400,当存储节点上电时,按照日志标识将多个元数据单元划分为至少一个元数据单元组。
209.在本实施例中,日志标识可以是存储于元数据单元中的标识字段,对于同一次写入的待下盘数据,其对应的元数据单元中的日志标识是相同的。
210.在本实施例中,当存储节点10下电时,持久内存存储有待写入硬盘的待下盘数据,待下盘数据至少存在于一个数据单元中,对应至少一个元数据单元。
211.步骤s401,对每一元数据单元组进行重建处理,以将待下盘数据写入硬盘。
212.在本实施例中,可以根据每一元数据单元组中的元数据单元中记录的信息进行重建。
213.在具体重建之前,为了保证数据的可靠性,作为一种具体实施方式,可以先读取出
第一保留区或者第二保留区中信息,通过比对checksum字段和magic字段、size字段确定其中的信息是完整,如果不完整,则认为是第一次初始化持久内存,对整个持久内存进行初始化操作。
214.初始化时,遍历每个元数据单元,将除checksum字段以外的字段赋值为0,计算元数据单元的校验值并将其写入checksum字段。然后将整个元数据区作为一个分片,按照前述实施例中的回收流程生成分级列表和对应的红黑树。最后,持久化元数据单元的前8个字节(日志标识字段),完成后再持久化元数据单元的后8个字节(count字段、index字段和checksum字段)。
215.如果第一保留区和第二保留区中的信息是完整的,则对比size字段,是否和现在的持久内存的大小一致。如果不一致则认为出错。如果一致则启动具体重建流程。
216.作为一种具体实施方式,具体重建过程可以是:
217.首先,对于至少一个元数据单元组中任一目标元数据单元组,根据目标元数据单元组中目标元数据单元的分片数量及分片索引,对目标元数据单元组进行重建,得到目标元数据单元组对应的日志。
218.在本实施例中,作为一种具体实现方式,分片数量和分片索引分别可以根据元数据单元中的count字段和index字段得到,由此可以将元数据单元按照index字段的值进行排序,进而得到对应的排序后的数据单元。
219.其次,从最后一个分片索引的目标元数据单元管理的数据单元中读取日志的状态,其中,日志的状态用于表征目标元数据单元中、除最后一个分片索引之外其余的目标元数据单元管理的数据单元中的目标数据是否存在于数据区。
220.在本实施例中,由于最后一个目标元数据单元管理的数据单元存储的是第二元数据,其中包括了标志位、数据长度、待写位置及校验数据,可以通过校验数据对标志位、数据长度、待写位置进行校验,校验通过后再进行后续处理。
221.第三,若日志的状态为用于表征目标数据存在于数据区的缓存状态,则将目标数据刷入硬盘。
222.最后,将所有日志状态为缓存状态的元数据单元组中元数据单元管理的数据单元中的数据刷入硬盘,最终将待下盘数据写入硬盘。
223.在本实施例中,若日志的状态为表征目标数据未存在于数据区的非缓存状态,此时需要将目标元数据单元的数据单元回收,具体处理如下:
224.若日志的状态为表征目标数据未存在于数据区的非缓存状态,则将目标元数据单元的数据单元回收。
225.将所有日志状态为非缓存状态的元数据单元组中的元数据单元管理的数据单元回收。
226.在本实施例中,对于数据单元的回收在前述实施例中的步骤s202中已有描述,此处不再赘述。
227.为了执行上述实施例及各个可能的实施方式中的相应步骤,下面给出一种数据访问装置100的实现方式。请参照图16,图16示出了本发明实施例提供的数据访问装置100的方框示意图。需要说明的是,本实施例所提供的数据访问装置100,其基本原理及产生的技术效果和上述实施例相同,为简要描述,本实施例部分未提及指出。
228.数据访问装置100包括接收模块110、生成模块120、写入模块130、读取模块140、刷盘模块150及重建模块160。
229.接收模块110,用于接收客户端发送的写数据请求,其中,写数据请求包括待写数据的数据长度和待写位置。
230.可选地,接收模块110,还用于接收客户端发送的读数据请求,其中,读数据请求包括待读数据的数据长度和待读位置。
231.生成模块120,用于根据数据长度生成用于管理待写数据的第一元数据。
232.可选地,生成模块120具体用于:根据数据长度和预设长度,计算分段数;将待写数据按照分段数进行切分,得到至少一个数据分段;根据数据分段的个数及每一数据分段在待写数据中的位置,生成每一数据分段的元数据;为待写数据生成一个预留元数据,其中,预留元数据包括数据分段的个数加1后的值;将预留元数据及所有数据分段的元数据作为第一元数据。
233.生成模块120,还用于根据数据长度及待写位置,生成用于管理待写数据写入日志的第二元数据。
234.可选地,生成模块120具体还用于:获取用于表征待写数据的成功写入数据区的标志位;根据标志位、数据长度及待写位置,生成校验数据;将标志位、数据长度、待写位置及校验数据作为第二元数据。
235.写入模块130,用于将待写数据写入至数据区之后,将第一元数据写入至元数据区,以及将第二元数据写入至数据区。
236.可选地,元数据区包括多个元数据单元,多个元数据单元采用分级管理,每一级别对应一个链表,每一链表包括至少一个管理节点,每一管理节点用于管理位置相邻的元数据单元,同一链表中的管理节点管理的元数据单元的个数相同,任意两个链表中的管理节点管理的元数据单元的个数不同,写入模块130具体用于:根据数据长度及预设长度,确定目标级别;从目标级别对应的链表的管理节点中确定第一待写元数据单元和第二待写元数据单元,其中,第一待写元数据单元的个数为数据分段的个数,第二待写元数据单元的个数为1;按照每一数据分段在待写数据中的位置,依次将每一数据分段的元数据写入至每一第一待写元数据单元;将预留元数据写入至第二待写元数据单元。
237.可选地,数据区包括多个数据单元,每一元数据单元对应一个数据单元,每一所述数据分段写入至与每一目标元数据单元对应的数据单元,写入模块130用于将第二元数据写入至数据区时具体用于:将第二待写元数据单元对应的数据单元作为待写数据单元;将第二元数据写入至待写数据单元。
238.可选地,读取模块140,用于:根据待读数据的数据长度及待读位置,从硬盘中读出原始数据;根据待读位置确定刷盘列表中是否存在与待读数据对应的、且未存入硬盘的最新数据;将原始数据和最新数据进行组合,得到待读数据。
239.可选地,数据区包括多个数据单元,存储节点还包括硬盘、刷盘列表及回收列表,刷盘列表包括待刷数据的刷盘位置及存储待刷数据的数据单元,待刷数据为存储至持久内存、且待刷入至硬盘的数据,刷盘模块150用于:根据待写位置及刷盘位置,确定有效数据单元和无效数据单元;若有效数据单元未存在于刷盘列表中,将有效数据单元更新至刷盘列表中,以通过刷盘列表将有效数据单元中的数据从持久内存刷入至硬盘;若无效数据单元
存在于刷盘列表中,将无效数据单元从刷盘列表中删除并插入至回收列表中,以通过回收列表将无效数据单元进行回收。
240.可选地,刷盘模块150具体用于:若回收列表中存在满足预设合并条件的待合并数据单元,将待合并数据单元从回收列表中删除;将待合并数据单元与无效数据单元进行合并,得到待插入数据单元;将待插入数据单元插入至回收列表;若回收列表中不存在待合并数据单元,则将无效数据单元插入至回收列表。
241.可选地,存储节点还包括硬盘,当存储节点下电时,持久内存存储有待写入硬盘的待下盘数据,元数据区包括多个元数据单元,每一元数据单元包括日志标识,数据区包括多个数据单元,每一元数据单元管理一个数据单元,待下盘数据至少存在于一个数据单元中,重建模块160用于:当存储节点上电时,按照日志标识将多个元数据单元划分为至少一个元数据单元组;对每一元数据单元组进行重建处理,以将待下盘数据写入硬盘。
242.可选地,每一元数据单元包括分片数量、分片索引及日志标识,重建模块160具体用于:对于至少一个元数据单元组中任一目标元数据单元组,根据目标元数据单元组中目标元数据单元的分片数量及分片索引,对目标元数据单元组进行重建,得到目标元数据单元组对应的日志;从最后一个分片索引的目标元数据单元管理的数据单元中读取日志的状态,其中,日志的状态用于表征目标元数据单元中、除最后一个分片索引之外其余的目标元数据单元管理的数据单元中的目标数据是否存在于数据区;若日志的状态为用于表征目标数据存在于数据区的缓存状态,则将目标数据刷入硬盘;将所有日志状态为缓存状态的元数据单元组中元数据单元管理的数据单元中的数据刷入硬盘,最终将待下盘数据写入硬盘。
243.可选地,重建模块160具体还用于:若日志的状态为表征目标数据未存在于数据区的非缓存状态,则将目标元数据单元的数据单元回收;将所有日志状态为非缓存状态的元数据单元组中的元数据单元管理的数据单元回收。
244.本发明实施例提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现如上述的数据访问方法。
245.综上所述,本发明实施例提供了一种数据访问方法、装置、存储节点及存储介质,应用于存储节点,存储节点包括持久内存,持久内存包括元数据区和数据区,存储节点和客户端通信连接,所述方法包括:接收客户端发送的写数据请求,其中,写数据请求包括待写数据的数据长度和待写位置;根据数据长度生成用于管理待写数据的第一元数据;根据数据长度及待写位置,生成用于管理待写数据写入日志的第二元数据;将待写数据写入至数据区之后,将第一元数据写入至元数据区,以及将第二元数据写入至数据区。相对于现有技术,本发明实施例通过第一元数据和第二元数据能够保证向持久内存写入数据时满足原子性,进而保证持久内存中数据的一致性。
246.以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1