日志服务系统及日志记录的处理方法与流程

文档序号:27683369发布日期:2021-12-01 00:28阅读:181来源:国知局
日志服务系统及日志记录的处理方法与流程

1.本发明涉及数据处理技术领域,特别涉及一种日志服务系统及日志记录的处理方法。


背景技术:

2.日志记录可用于记录设备的各种数据处理信息、性能信息以及被使用信息等,还可以用于记录各种业务的操作过程信息。日志记录是开发人员进行溯源或是进行数据分析的其中一项重要的数据。
3.日志服务系统可以应用在各种数据库系统中,其中,云原生数据库便是其中一种。发明人研究发现,目前日志服务系统中的内存被大量重复的日志记录占用,极大的降低了日志服务系统的内存的利用率。


技术实现要素:

4.有鉴于此,本发明提供一种日志服务系统及日志记录的处理方法,应用本发明可提取出日志记录的元信息,并将元信息和日志记录分开保存,由此无需重复保存日志记录,提高日志服务系统的内存的利用率。
5.为实现上述目的,本发明实施例提供如下技术方案:
6.本技术第一方面公开了一种日志服务系统,该系统包括:
7.日志存储模块、日志解析模块以及元信息模块;
8.所述日志存储模块,用于保存主计算节点发送的日志块;
9.所述日志解析模块,用于读取所述日志存储模块中的日志块,并将读取到的日志块确定为目标日志块,获取所述目标日志块中的每条日志记录;对于每条所述日志记录,提取所述日志记录的元信息,确定所述日志记录在所述元信息模块中所属的存储模块,并将所述日志记录的元信息保存至所述日志记录在所述元信息模块中所属的存储模块中,其中,所述元信息包含日志记录的日志序列号和日志长度。
10.上述的系统,可选的,所述日志存储模块,用于在接收到主计算节点发送的日志块后,在所述日志存储模块的各个缓存单元中确定目标缓存单元,将日志块保存至所述目标缓存单元中。
11.上述的系统,可选的,所述元信息模块,包括:
12.多个存储模块;
13.每个所述存储模块中包含至少一个内存块,每个所述存储模块中的各个内存块链接成内存块链;
14.所述内存块,用于保存日志记录的元信息。
15.上述的系统,可选的,所述日志解析模块,用于在获取所述目标日志块中的每条日志记录后,提取每条所述日志记录的元信息,对于每条所述日志记录,确定所述日志记录在所述元信息模块中所属的存储模块,确定所述存储模块的内存块链中的最后一个内存块是
否存在可用空间,若内存块链中的最后一个内存块存在可用空间,则将所述日志记录的元信息保存至所述内存块链中的最后一个内存块中;若内存块链中的最后一个内存块不存在可用空间,则从所述元信息模块的空闲链表中获取空内存块,并将所述空内存块链接至所述内存块链的尾部,并将所述日志记录的元信息保存至链接到所述内存块链的空内存块中。
16.上述的系统,可选的,所述元信息模块,还包括:
17.清理模块;
18.所述清理模块,用于基于所述日志存储模块中被覆盖的各个日志记录确定目标日志序列号;基于所述目标日志序列号,在所述元信息模块中确定满足预设的清除条件的各个内存块;基于每个满足预设的清除条件的内存块在其所属的存储模块中的位置信息,对每个满足预设的清除条件的内存块进行清除操作。
19.上述的系统,可选的,所述清理模块用于将每个所述内存块中最大的日志序列号均确定为判定日志序列号,并将每个所述判定日志序列号均与所述目标日志序列号进行比较,并将小于或等于所述目标日志序列号的判定日志序列号所属的内存块确定为满足所述清除条件的内存块。
20.上述的系统,可选的,还包括:
21.归档模块;
22.所述归档模块,用于从所述日志存储模块中读取日志块,并对读取到的日志块进行归档处理。
23.本技术第二方面公开一种日志记录的处理方法,包括:
24.当从日志存储模块中读取到日志块时,获取所述日志块中的各个日志记录;
25.确定每个所述日志记录在元信息模块中所属的存储模块;
26.提取每个所述日志记录的元信息;
27.对于每个所述日志记录,将所述日志记录的元信息保存至该日志记录在所述元信息模块中所属的存储模块中。
28.上述的方法,可选的,所述确定每个所述日志记录在元信息模块中所属的存储模块,包括:
29.对每个所述日志记录进行解析,确定每个所述日志记录的存储属性;
30.基于每个所述日志记录的存储属性,在所述元信息模块中确定每个所述日志记录所属的存储模块。
31.上述的方法,可选的,所述将所述日志记录的元信息保存至该日志记录在所述元信息模块中所属的存储模块中,包括:
32.获取所述日志记录在所述元信息模块中所属的存储模块的内存块存储信息;
33.基于所述内存块存储信息判断所述存储模块中的最后一个内存块是否存在可用空间;
34.若所述存储模块中的最后一个内存块存在可用空间,则将所述元信息保存至该内存块中;
35.若所述存储模块中的最后一个内存块未存在可用空间,则从所述元信息模块的空闲链表中获取空内存块,并将所述空内存块链接至所述存储模块的最后一个内存块的尾
部,并将所述元信息保存至链接至所述存储模块中的空内存块中。
36.与现有技术相比,本发明具有以下优点:
37.本发明提供一种日志服务系统及日志记录的处理方法,该系统包括日志存储模块、日志解析模块以及元信息模块;日志存储模块用于保存主计算节点发送的日志块;日志解析模块用于读取日志存储块中的日志块,并将读取到的日志块确定为目标日志块,获取目标日志块中的每条日志记录;对于每条日志记录,提取日志记录的元信息,确定日志记录在元信息模块中所属的存储模块,并将日志记录的元信息保存至日志记录在元信息模块中所属的存储模块中,其中,所述元信息包含日志记录的日志序列号和日志长度。本发明提供的系统中,提供了用于保存日志块的日志存储模块以及用于保存日志块中的日志记录的元信息的元信息模块,通过将日志记录和日志记录的元信息分开保存,无需重复保存日志记录,由此避免日志记录重复存储,减少日志记录占用的额外内存,提高了日志服务系统的内存利用率。
附图说明
38.为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
39.图1为本发明实施例提供的一种日志服务系统的结构示意图;
40.图2为本发明实施例提供的一种日志服务系统的另一结构示意图;
41.图3为本发明实施例提供的一种日志记录的处理方法的方法流程图;
42.图4为本发明实施例提供的一种日志记录的处理方法的另一方法流程图;
43.图5a为本发明实施例提供的元信息模块中的数据结构的示例图;
44.图5b为本发明实施例提供的元信息模块中的另一数据结构的示例图;
45.图5c为本发明实施例提供的元信息模块中的又一数据结构的示例图;
46.图5d为本发明实施例提供的元信息模块中的再一数据结构的示例图。
具体实施方式
47.下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
48.在本技术中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个
……”
限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
49.为了解决背景技术中的问题,本发明提供了一种日志服务系统,该系统中保存日志记录的方式不同于传统保存日志记录的方式,便于开发人员在系统中获取到需要的日志
记录,该系统的结构示意图如图1所示,具体说明如下所述:
50.本发明实施例提供一种日志服务系统,该系统包括:日志存储模块101、日志解析模块102以及元信息模块103;
51.所述日志存储模块101,用于保存主计算节点发送的日志块。
52.需要说明的是,主计算节点发送的日志块中包含多条日志记录,日志块中的日志记录是连续存储的,具体如保存完日志记录1后,在日志记录1的尾部开始保存日志记录2,然后再在日志记录2的尾部开始保存日志记录3,以此类推,直至将日志块中的内存空间存满;换句话说,日志块中保存的各条日志记录以串联的方式保存,日志块中的各条日志记录形成了一条数据链。
53.每条日志记录均包含日志序列号,日志序列号具有唯一性,具体的,日志序列号用于确定日志记录在日志存储模块中的存储位置。
54.日志存储模块中包含多个缓存单元,缓存单元的内存大小与日志块的数据大小相同,日志存储模块中的各个缓存单元按顺序排列。日志存储模块在保存日志块时,先在各个缓存单元中确定目标缓存单元,将日志块保存至目标缓存单元中即可,需要说明的是,在目标缓存单元是空缓存单元,此时直接将日志块保存至目标缓存单元中,在目标缓存单元中已经保存了日志块时,将需要保存的日志块覆盖目标缓存单元中已保存的日志块即可。
55.本发明中的日志序列号可用于确定日志记录在日志存储模块的存储位置,具体如所存储的缓存单元和数据起始位置。假设日志存储模块中包含3个缓存单元,分别为缓存单元1、缓存单元2和缓存单元3,每个缓存单元的内存大小为64字节,日志存储模块的总内存大小为192字节,当元信息中的日志序列号为20时,表示日志记录保存在第一个缓存单元中,且缓存单元1的第20个字节为日志记录的数据起始地址;当元信息中的日志序列号为208时,使用208

(64*3)=16,则表示日志记录保存在缓存单元1中,且日志记录的数据起始地址为缓存单元1中的第16个字节,需要说明的丝,该日志记录在存入缓存单元中时,是将缓存单元中已保存的日志记录进行覆盖后保存的。
56.所述日志解析模块102,用于读取所述日志存储模块中的日志块,并将读取到的日志块确定为目标日志块,获取所述目标日志块中的每条日志记录;对于每条所述日志记录,提取所述日志记录的元信息,确定所述日志记录在所述元信息模块中所属的存储模块,并将所述日志记录的元信息保存至所述日志记录在所述元信息模块中所属的存储模块中,其中,所述元信息包含日志记录的日志序列号和日志长度。
57.元信息模块包括多个存储模块;每个所述存储模块中包含至少一个内存块,每个存储模块中的各个内存块链接成内存块链;所述内存块,用于保存日志记录的元信息。进一步的,每个内存块的大小是相同的,每个元信息的大小也是相同的。存储模块中的各个内存块通过链表连接成内存块链。可通过元信息确定日志记录在日志存储模块中的存储位置,日志记录在日志存储模块中的存储位置具体如:保存该日志记录所属的日志块的缓存单元的位置、日志记录在日志存储模块中的日志起始位置等信息。
58.进一步的,日志解析模块中设置有解析线程,通过执行解析线程进而实现对日志记录的解析。日志解析模块读取日志存储块中日志块时,按照日志存储模块中的各个缓存单元的单元编号从小到大的顺序依次读取缓存单元中的日志块。具体如:日志解析模块先读取单元编号为1的缓存单元中的日志块,再读取单元编号为2的缓存单元中的日志块,以
此类推,在读取到最后一个缓存单元中的日志块后,重新读取单元编号为1的缓存单元中的日志块,以此循环反复。
59.日志解析模块将当前读取到的日志块确定为目标日志块,并对目标日志块进行解析,以获取目标日志块中的每条日志记录,对于每条所述日志记录,提取该日志记录的元信息,具体的,在提取日志记录的元信息时,提取日志记录的日志序列号和日志长度,并根据存储模块中的内存块所保存的数据的数据结构,将日志序列号和日志长度组成满足该数据结构的元信息,进一步的,日志长度为上文所述的日志记录的数据长度;在确定日志记录在元信息模块中所属的存储模块时,可根据日志记录的日志属性、生成该日志记录的计算机或是日志记录的存储类型确定日志记录在元信息模块中所属的存储模块。
60.在确定日志记录在元信息模块中所属的存储模块后,确定存储模块的内存块链中的最后一个内存块是否存在可用空间,若内存块链中的最后一个内存块存在可用空间,则将日志记录的元信息保存至内存块链中的最后一个内存块中;若内存块链中的最后一个内存块不存在可用空间,则从日志存储模块的空闲链表中获取空内存块,并将空内存块链接至内存块链的尾部,并将日志记录的元信息保存至链接到内存块链的空内存块中。其中,在存储模块的内存块链的各个内存块中,不是位于末端的内存块均已存满元信息。需要说明的是,内存块的大小可为10kb,元信息的大小可为10b,因此,一个内存块中可保存1024个元信息;其中,空闲链表中包含多个空内存块,内存块的大小可根据实际需求进行设置。
61.进一步的,元信息模块还存在对应的模块信息集合表,其中,模块信息集合表中包含但不限于空闲链表、映射表以及模块集合表等,其中,空闲链表中包含多个空内存块、映射表中包含每个存储模块和外部的存储节点的映射关系,模块集合表中包含每个存储模块的模块信息。
62.进一步的,每个存储模块中的各个内存块逐个连接成内存块链,进一步的,还可将内存块链称为内存块链表;存储模块存在指向内存块链表中的第一个内存块的模块信息。每个存储模块存在对应的内存块集合表,内存块集合表中包含每个内存块中首个元信息中的日志序列号以及每个内存块的地址。
63.进一步的,每个内存块还有表示该内存块的映射关系的内存头,其中,内存头中包含但不限于内存块中的第一个元记录中的日志序列号、与该内存块链接的内存块的块地址。
64.本发明实施例提供的系统中,元信息模块还包括清理模块,清理模块,用于基于所述日志存储模块中被覆盖的各个日志记录确定目标日志序列号;基于目标日志序列号,在元信息模块中确定满足预设的清除条件的各个内存块;基于每个满足预设的清除条件的内存块在其所属的存储模块中的位置信息,对每个满足预设的清除条件的内存块进行清除操作。进一步的,目标日志序列号为被覆盖的各个日志记录的日志序列号中最大的日志序列号;在确定目标日志序列号时,还可以将最近一次被覆盖的日志块中最大的日志序列号确定为目标日志序列号。
65.进一步的,清理模块在确定满足清除条件的内存块时,具体过程为:将每个内存块中最大的日志序列号均确定为判定日志序列号,并将每个判定日志序列号均与目标日志序列号进行比较,并将小于或等于目标日志序列号的判定日志序列号所属的内存块确定为满足清除条件的内存块。换句话说,满足清除条件的内存块为内存块中最大的日志序列号小
于或等于目标日志序列号的内存块。
66.清除模块在对满足清除条件的内存块进行清除操作时,需要基于每个满足清除条件的内存块在其所属是存储模块中的位置信息执行对应的清除操作,具体的,对于每个满足清除条件的内存块,若该内存块的位置信息表征该内存块为其所属的存储模块中唯一的内存块时,不清除将该内存块中保存的各个元信息,即对该内存块中的各元信息不做任何操作;若该内存块的位置信息表征该内存块在其所属的存储模块中不是唯一的内存块,且该内存块不为最后一个内存块时,将该内存块直接摘除,进一步的,将摘除后的内存块链接至元信息模块中的空闲链表中,后续再使用该内存块时将新的元信息覆盖该内存块中原先保存的元信息;若该内存块的位置信息表征该内存块在其所属的存储模块中不是唯一的内存块,且该内存块为最后一个内存块时,对该内存块中保存各个元信息不做任何操作。
67.本发明实施例提供的系统中,通过在元信息模块中设置清除模块,可将已经不会用到的内存块清除,可以释放内存块的存储空间,使得日志服务系统中的内存空间可以得到高效的利用。
68.参照图2,为本发明实施例提供的系统的另一结构示意图,结合图1中的内容对图2进行说明,如图2所示,基于图1所示的日志服务系统,图2所示的日志服务系统相对于图1还包括:归档模块104;图2中的日志存储模块101、日志解析模块102以及元信息模块103可参照上述图1中的说明,此处不再进行赘述。
69.所述归档模块,用于从所述日志存储模块中读取日志块,并对读取到的日志块进行归档处理。
70.进一步的,归档模块中设置了归档进程,通过执行归档进程实现了对日志块进行归档处理。
71.本发明实施例提供的系统中,日志存储模块,用于在日志存储模块中保存的日志块中的每条日志记录均已被外部节点消费时,将该日志块确定为已消费日志块。进一步的,外部节点包括但不限于存储节点、从计算节点。
72.本发明实施例提供的系统中,该系统包括日志存储模块、日志解析模块以及元信息模块;日志存储模块用于保存主计算节点发送的日志块;日志解析模块用于读取日志存储块中的日志块,并将读取到的日志块确定为目标日志块,获取目标日志块中的每条日志记录;对于每条日志记录,提取日志记录的元信息,确定日志记录在元信息模块中所属的存储模块,并将日志记录的元信息保存至日志记录在元信息模块中所属的存储模块中,其中,元信息包含日志记录的日志序列号和日志长度。本发明提供的系统中,通过使用用于保存日志块的日志存储模块和用于保存日志记录的元信息的元信息模块,将日志记录和日志记录的元信息分开保存,从而避免了日志记录的重复存储,避免日志记录占用日志服务系统中额外的内存,进而提高日志服务系统的内存利用率。
73.参照图3,为本发明实施例提供一种日志记录的处理方法,该方法可应用于日志服务系统中的日志解析模块,该方法包括:
74.s401、当从日志存储模块中读取到日志块时,获取日志块中的各个日志记录。
75.s402、确定每个日志记录在元信息模块中所属的存储模块。
76.本发明提供的另一实施例中,对确定每个日志记录在元信息模块中所属的存储模块的过程进行说明:
77.对每个日志记录进行解析,确定每个日志记录的存储属性。
78.日志记录的存储属性可由日志记录所属的业务类型确定,其中,不同的存储属性对应不同的存储模块。
79.基于每个日志记录的存储属性,在元信息模块中确定每个日志记录所属的存储模块。
80.存储模块中至少包含一个内存块。
81.s403、提取每个日志记录的元信息,其中,元信息用于确定日志记录在日志存储模块中的存储位置。
82.元信息包含日志记录的日志序列号以及日志长度,可根据日志序列号确定日志块在日志存储模块中的日志起始地址。
83.s404、对于每个日志记录,将日志记录的元信息保存至该日志记录在所述元信息模块中所属的存储模块中。
84.参照图4,为本发明实施例提供的将日志记录保存至存储模块中的方法流程图,具体说明如下所述:
85.s501、获取日志记录在元信息模块中所属的存储模块的内存块存储信息。
86.元信息模块中包含多个存储模块,每个存储模块中至少包含一个内存块,存储模块中的各个内存块的首尾链接成内存块链,其中,首个内存块的首部未与内存块链接,最后一个内存块的尾部未与内存块链接。
87.内存块存储信息中包含每个内存块的内存空间的使用信息情况信息。
88.s502、基于内存块存储信息判断存储模块中的最后一个内存块是否存在可用空间;若存储模块中的最后一个内存块存在可用空间,则执行s503;若存储模块中的最后一个内存块未存在可用空间,则执行s504。
89.s503、将元信息保存至该内存块中。
90.s504、从元信息模块的空闲链表中获取空内存块,并将空内存块链接至存储模块的最后一个内存块的尾部,并将元信息保存至链接至存储模块中的空内存块中。
91.本发明实施例提供的方法中,当从日志存储模块中读取到日志块时,获取日志块中的各个日志记录,确定每个日志记录在元信息模块中所属的存储模块;提取每个日志记录的元信息,元信息用于确定日志记录在日志存储模块中的存储位置;对于每个日志记录,将日志记录的元信息保存至该日志记录在元信息模块中所属的存储模块中。本发明提供的方法,可以提取出日志记录的元信息,该元信息用于确定日志记录在日志存储模块中的存储位置,并将提取出的元信息保存至存储模块中,使得元信息与日志记录分离,避免了日志服务系统中的日志记录重复保存,进而提高日志服务系统中的内存利用率。
92.上述各个实施例的具体实施过程及其衍生方式,均在本发明的保护范围之内。
93.本发明实施例提供的日志服务系统中,日志存储模块可使用block cache表示,block cache中包含多个block,block表示缓存单元;日志解析模块用parser表示;元信息模块用segment cache表示,segment cache中包含多个segment,segment表示存储模块。进一步的,日志服务系统中还包括归档模块archive;本技术中的日志也指日志记录。
94.日志服务系统还与主计算节点primary、从计算节点secondary以及多个存储节点page server相连接,存储节点与日志服务系统中的存储模块一一对应;主计算节点用于向
日志服务系统发送日志块,从计算节点用于向日志服务系统发送请求,以获取日志服务系统反馈的日志块,并对获取到的日志块的每条日志记录进行处理;存储节点用于向日志服务系统发送请求,以获取日志服务系统反馈的日志记录。
95.元信息模块整体由大量的10k字节大小(或者其他大小)的内存块组成。这些内存块在初始化的时候预先分配好,并存放在空闲链表中。内存块中不保存日志记录的数据,而且仅仅保存日志记录的元信息,包括日志记录的日志序列号(log sequence number,lsn)和日志长度。优选的,日志记录的元信息大小可以为10字节,包括8个byte的日志序列号,2个byte的日志长度,元信息的大小可根据实际需求进行设置。元信息的数据结构可由record_meta表示,record_meta中包含表示日志长度的rec_len以及表示日志序列号的lsn,record_meta的结构如图5a表示。所以一个内存块中可以保存1k个日志记录的元信息。当需要查找日志时,通过日志记录的日志序列号找到该日志在日志存储模块中的相应位置,结合日志长度获取该日志记录的数据内容。
96.每一个存储模块由若干内存块组成,并且内存块通过链表首尾相连,相当于由若干内存块拼装成一个大的可以动态调整的内存区域,由此,可以动态调整每个存储模块的内存空间大小。存储模块的存储结构由meta_list表示,如图5b所示,meta_list主要包含:1、meta_block_ptr:指向该存储模块中第一个内存块的地址;2、meta_block_lsn_map:包含所有内存块的第一个日志记录的日志序列号和指向该内存块的指针,是以一对一对的形式保存(lsn,address),日志块中的第一个日志记录的序列号是日志块中最小的日志序列号,因为在内存块中,日志按照日志序列号顺序升序排列,第一个永远是最小的。
97.元信息模块的存储结构可由segment_list表示,segment_list的结构具体如图5c,segment_list中主要包含:1、meta_list_map:保存所有segment的标记值和指向属于该segment的meta_list的指针,也是成对的(number,pointer);标记值是一个数字,每个不同的segment有不同的数字,以示区分;2、meta_list_num:表示整个segment cache中有多少个segment;3、free_block_list:一个指针,指向空闲内存块链表。
98.在某一时刻,每个segment包含的日志数量不同,而且还在随时间而变化。如果每个segment分配一个固定大小的内存区域,当日志记录在segment之间不均匀分布时,会造成某些segment内存空间浪费,而另外一些segment内存空间不足,需要动态调整。
99.segment的每一个内存块都有一个控制信息,控制信息中包含但不限于内存块的锁信息、lsn信息以及前后内存块的指针信息,控制信息可使用数据结构meta_block表示,具体如图5d所示,数据结构meta_block中包括:1、first_lsn:该内存块中第一个日志的日志序列号,也是内存块最小的日志序列号;2、rec_count:该内存块内有多少个日志的元信息;3、prev:一个指针,指向该segment内存块链表中的前一个内存块;4、next;一个指针,指向该segment内存块链表中的后一个内存块。
100.为了优化segment中日志记录的查找,我们将内存块的首个元信息中的日志序列号以及指向该内存块的地址存放在hash map(meta_block_lsn_map)中。当消费者需要某一个日志时,通过hash map找到该lsn所属的内存块(具有小于该lsn,并且起始lsn最大的日志块)然后在该内存块中再继续寻找相应的日志记录,以及使用二分查找方法查找,或者其他某种形式的查找。
101.日志解析模块读取日志块的流程:
102.1、从日志存储模块中读取一个日志块;
103.2、如果该日志块可用,则执行3;否则,等待并返回1;
104.3、解析该日志块,分析每一条日志记录,对于每条日志记录,将日志记录的元信息提取出来,根据一定的哈希规则,将其存放在相应的存储模块中。整个存储过程不需要锁的使用,提高了数据插入性能;
105.3.1、将日志记录的lsn和日志长度拼成一个长度为10b的结构体,直接插入到相应的存储模块最后一个内存块的末尾,其中,内存块的末尾通过rec_count来计算得到,rec_count*10b就是内存块的末尾;
106.3.2、不需要对存储模块的最后一个内存块加锁、解锁,通过改变原子变量rec_count完成;
107.3.3、存储模块清理时确保不清理最后一个内存块,所以日志块清理和插入之间无冲突,无需对内存块进行加锁、解锁,减少锁冲突,提升系统性能;
108.4、如果当前存储模块中的内存块无可用空间,则从空闲链表中获取一个空的内存块,链接到当前存储模块最后一个内存块的尾部;并将元信息保存至新增加的内存块中;
109.5、将该内存块的第一个日志信息添加到meta_list的meta_block_lsn_map中,并将该内存块链接到上一个内存块上;
110.6、block处理完毕,返回步骤1。
111.存储节点获取日志记录的流程:
112.1、根据请求的存储节点的身份信息或身份标识通过哈希算法确定对应的存储模块,获得存储模块的存储结构meta_list;
113.2、通过要获取的日志记录的lsn从meta_list中的meta_block_lsn_map中找到对应的内存块;
114.3、使用二分查找法在内存块中查找对应日志记录的元信息;
115.4、如果找到该日志记录的元信息,则根据lsn计算该日志记录在日志存储模块中的存储位置,具体如在所存储的日志块中的起始存储位置,结合日志长度信息直接获取日志记录;
116.5、根据存储节点的特定的要求,将日志记录发送给存储节点。
117.归档模块、从计算节点获取日志块的过程:
118.1、根据归档模块或从计算节点请求的日志记录的lsn,在日志存储模块中找到相应的日志块block m;
119.2、从block m开始在block cache中循环读取日志块block;
120.3、如果block m的起始lsn和用户请求lsn相同,则将其发送给secondary、archive,返回步骤2,读取再下一个block;
121.4、如果block m记录的起始lsn比用户请求lsn小,则说明该block是即将被覆盖的旧的block,该block已经被发送完毕。这种情况下,停止循环读取日志block,等待archive、secondary的新请求。
122.block cache中并没有单独的线程去清理日志块,新日志块在加入block cache的同时将旧的日志块覆盖;因为旧的日志块被覆盖,segment cache的各个segment需要定期将已经过期的元信息清理。segment需要一个独立的清理线程,从map中读取已经完全不会
用到的内存块,并将其回收到free链表,过程中可以对相应的内存块加写锁(防止当前有读取操作,理论上不应该存在这部分读操作,所以大概率不会有锁阻塞)。
123.对segment进行清理时,根据block cache计算出已经被覆盖的最大的lsn,记为overwrite_max;根据overwrite_max在每个segment的hash map中查找确定需要清除的内存块;如果确定需要清除的内存块不是最后一个内存块,则不需要任何加锁,直接将这些内存块从segment链表中摘除,并返回给空闲链表;同时将这些内存块从hash map中清空(需要对hash map加锁);如果被清理的内存块是segment的最后一个内存块,则该内存块不会被摘除,且无需对该内存块中保存的元信息进行操作。
124.本发明提供的日志服务系统在保存日志记录时,以无锁化的方式保存日志记录,日志服务系统中仅保存日志记录的一份数据,可以满足所有消费者对读取日志块和日志记录的需求;使用连续内存保存日志,避免了内存的碎片化,提高系统的性能和提高了系统内存的使用率。
125.本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统或系统实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的系统及系统实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
126.专业人员还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
127.对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1