一种基于多队列的数据库预写日志方法和装置与流程

未命名 08-13 阅读:123 评论:0


1.本发明涉及计算机数据管理技术领域,尤其涉及一种基于多队列的数据库预写日志方法和装置。


背景技术:

2.预写日志是一项高效的日志算法,它在数据项写入数据库之前,先行将数据项写入到预写日志文件中,使得数据项不会因终端设备故障而丢失,保障了数据库系统的持久性和原子性。
3.预写日志是写入请求与磁盘交互的第一关,所以预写日志的写入吞吐能力基本决定了数据库整体的写入性能上限。因此对预写日志写入吞吐能力的调优是至关重要的。
4.一般来讲,优化预写日志的写入吞吐能力可以从以下几个方向入手:(1)增大每次系统调用写入的数据量;(2)将磁盘的随机i/o转换为顺序i/o。然而,在很多nosql数据库的实现中,预写日志文件和数据库或数据分区间的对应关系是强耦合的,如leveldb中预写日志文件和数据库实例形成一对一关系,influxdb中预写日志文件和数据分片形成一对一关系,这种强耦合关系限制了数据库在预写日志写入吞吐能力上的调优。


技术实现要素:

5.为解决现有技术中预写日志写入吞吐能力调优难的问题,本发明提供一种基于多队列的数据库预写日志方法和装置,使用预写日志队列作为基本的预写任务执行单元,每一个预写日志队列只有一个正在写入的预写日志文件,不同内存表会被动态分配给不同的预写日志队列,因此一个预写日志文件可以对不同内存表预写日志,实现了预写日志文件和内存表的解耦,进而使预写日志写入吞吐能力的调优容易实现。
6.第一方面,本发明提供一种基于多队列的数据库预写日志方法,用于基于lsm树存储引擎的数据库的预写日志端,所述预写日志端包含多个预写日志队列,每一个预写日志队列只有一个正在写入的预写日志文件,所述方法包括:
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.步骤1:将所述日志控制文件中具有创建标识且不具有落盘标识的内存表认定为未落盘内存表;
36.步骤2:比较所有未落盘内存表的初始数据项所在日志数据文件的编号,得到最小值;
37.步骤3:删除所述预写日志队列中编号小于所述最小值的日志数据文件;
38.步骤4:计算所述预写日志队列的预写日志有效信息占比;
39.步骤5:当所述预写日志有效信息占比低于给定占比阈值时,依照预设条件触发所述未落盘内存表快照或刷盘;
40.步骤6:若触发了任一所述未落盘内存表快照或刷盘,则返回步骤1,否则结束。
41.根据本发明提供的基于多队列的数据库预写日志方法,所述计算所述预写日志队列的预写日志有效信息占比,包括:
42.对所有未落盘内存表进行内存大小求和,得到第一求和值;将磁盘中与所述预写日志队列对应的所有内存表进行内存大小求和,得到第二求和值;
43.将所述第一求和值与所述第二求和值的求和值,记为第三求和值;
44.所述第一求和值与所述第三求和值的比值作为所述预写日志队列的预写日志有效信息占比。
45.根据本发明提供的基于多队列的数据库预写日志方法,所述依照预设条件触发所述未落盘内存表快照或刷盘,包括:若所述未落盘内存表满足大小低于给定内存表阈值且快照次数未达上限的条件,则在所述预写日志文件中为所述未落盘内存表做快照;
46.若所述未落盘内存表满足大小不低于给定内存表阈值或快照次数达上限的条件,则触发所述未落盘内存表刷盘。
47.第二方面,本发明提供一种基于多队列的数据库预写日志装置,用于基于lsm树存储引擎的数据库的预写日志端,所述预写日志端包含多个预写日志队列,每一个预写日志队列只有一个正在写入的预写日志文件,所述装置包括:
48.获取模块,用于获取写入请求中的数据项及其对应的内存表;
49.确定模块,用于确定为所述内存表分配的预写日志队列;
50.表示模块,用于采用二元组表示所述数据项和所述内存表的编号;
51.预写模块,用于控制所述预写日志队列将所述二元组写入自身的预写日志文件中。
52.本发明提供一种基于多队列的数据库预写日志方法和装置,获取写入请求中的数据项及其对应的内存表;确定为所述内存表分配的预写日志队列;将所述数据项和所述内存表的编号构成的二元组写入所述预写日志队列中的预写日志文件。本发明使用预写日志队列作为基本的预写任务执行单元,每一个预写日志队列只有一个正在写入的预写日志文件,不同内存表会被动态分配给不同的预写日志队列,因此一个预写日志文件可以对不同内存表预写日志,实现了预写日志文件和内存表的解耦,进而使预写日志写入吞吐能力的调优容易实现。
附图说明
53.为了更清楚地说明本发明或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
54.图1是本发明提供的基于多队列的数据库预写日志方法的流程示意图;
55.图2是本发明提供的预写日志队列结构以及动态分配的内存表的示意图;
56.图3是本发明提供的日志控制文件和日志数据文件数据写入流程示意图;
57.图4是本发明提供的日志数据文件快照原理示意图;
58.图5是本发明提供的基于多队列的数据库预写日志装置的结构示意图;
59.图6是本发明提供的电子设备的结构示意图;
60.附图标记:
61.610:处理器;620:通信接口;630:存储器;630:通信总线。
具体实施方式
62.为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明中的附图,对本发明中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
63.下面结合图1-图6描述本发明的基于多队列的数据库预写日志方法和装置。
64.为减少磁盘的读写开销,数据库通常会在内存中建立内存表以缓存对数据的写操作,在内存表数据量达到一定值后再落入磁盘,但是如果终端设备在内存表落盘前发生故障,内存表中写入的写操作就可能被丢失或损坏。因此预写日志应运而生,它的介入使得写入请求在其对应的预写日志落盘后再写入内存表中,在终端设备故障时保障数据库系统的持久性和原子性。
65.可以看出,预写日志的写入吞吐能力基本决定了数据库整体的写入性能上限,因此对预写日志写入吞吐能力的调优是至关重要的。一般来讲,优化预写日志的写入吞吐能力可以从以下几个方向入手:(1)增大每次写入预写日志文件的数据量;(2)将磁盘的随机i/o转换为顺序i/o。
66.然后,现有技术中,预写日志和内存表的对应关系是强耦合的,如leveldb中预写日志和数据库实例形成一对一关系,influxdb中预写日志和数据分片形成一对一关系,不同数据库实例或数据分片对应不同的内存表,内存表数量因应用业务或计算环境发生变更而变化时,与之耦合的预写日志的资源占用会一同发生变更。这种内存表和预写日志间的强耦合关系限制了对预写日志写入吞吐能力的调优,还导致了预写日志的资源占用大。例如influxdb中,如果数据分片从10变为100,并发写入的预写日志也会从10增加到100,写入请求被分散到不同的预写日志上,不仅无法进行批量写入,还降低了同一预写日志中内存写入的并发度,在极端情况下(如预写日志数量达数千量级),零落分散的预写日志还会产生大量磁盘随机i/o,造成预写日志写入吞吐能力下降。
67.为此,本发明提供一种基于多队列的数据库预写日志方法,用于基于lsm树存储引擎的数据库的预写日志端,所述预写日志端包含多个预写日志队列;一个预写日志队列只有一个正在写入的预写日志文件,如图1所示,所述方法包括:
68.s11、获取写入请求中的数据项及其对应的内存表;
69.本发明基于lsm树存储引擎的数据库的写入端,响应于写入请求,得到数据项和用于将数据项路由至其对应内存表的元数据;预写日志端与写入端通过交互方式得到写入请求中的数据项及其对应的内存表。
70.这里数据项指的是待写入数据,包括但不限于:新建数据、删除数据、更新数据、追
加数据和覆盖数据。
71.s12、确定为所述内存表分配的预写日志队列;
72.事实上,可以有任意数量个内存表被分配给一个预写日志队列。
73.s13、采用二元组表示所述数据项和所述内存表的编号;
74.本发明通过二元组《d,b》记录数据项d及其对应内存表b的编号,以明确数据项和内存表间的索引关系。
75.s14、控制所述预写日志队列将所述二元组写入自身的预写日志文件中。
76.本发明提供一种基于多队列的数据库预写日志方法,获取写入请求中的数据项及其对应的内存表;确定为所述内存表分配的预写日志队列;采用二元组表示所述数据项和所述内存表的编号;控制所述预写日志队列将所述二元组写入自身的预写日志文件中。使用预写日志队列作为基本的预写任务执行单元,每一个预写日志队列只有一个正在写入的预写日志文件,不同内存表会被动态分配给不同的预写日志队列,因此一个预写日志文件可以针对不同内存表预写日志,实现了预写日志文件和内存表的解耦,进而使预写日志写入吞吐能力的调优容易实现,还降低了预写日志的资源占用。
77.具体的,所述s12,包括:
78.在内存中不存在所述内存表的情况下,告知所述数据库的写入端创建所述内存表;
79.在所述内存表创建完成后,利用预设动态分配算法为所述内存表分配预写日志队列。
80.在内存中存在所述内存表的情况下,直接查询为所述内存表分配的预写日志队列。
81.这里,预写日志端与写入端进行交互以确定内存表是否创建完成。预设动态分配算法可以根据内存表写入特点或者应用需求来确定,合理的设置动态分配算法,可以调控不同预写日志队列的预写速度。
82.优选地,可以采用轮转法将不同的内存表分配给不同的预写日志队列。
83.或者可以按照内存表的写入速度对内存表进行分类,写入速度类似的内存表向同一个预写日志队列中写入,这样就能避免写入较慢的内存表拖累预写日志删除,出现磁盘占用较大的情况。
84.本发明使用个数可灵活配置的预写日志队列作为基本的预写执行单元,不同内存表会被动态分配给不同的预写日志队列,即一个预写日志队列可以处理任意数量内存表的预写日志,因为每一个预写日志队列只有一个正在写入的预写日志文件,因此预写日志文件和内存表得以解耦。
85.具体的,所述预写日志队列包括:阻塞队列、序列化缓冲区、落盘缓冲区和多个日志数据文件(.wal文件),所述多个日志数据文件中正在写入的日志数据文件为所述预写日志文件;阻塞队列缓存来自不同写入请求的数据项,以增大系统每次调用写入的数据量。序列化缓冲区和落盘缓冲区是大小相等的两个缓冲区,分别用于序列化和落盘。本发明调用两类后台线程,序列化线程负责将阻塞队列中的数据项批量序列化到序列化缓冲区,磁盘同步线程负责将落盘缓冲区同步到磁盘。
86.所述s13,包括:
87.s13.1:将所述二元组送入所述阻塞队列中排队;
88.s13.2:通过序列化线程,将所述二元组缓冲到所述序列化缓冲区中;
89.s13.3在满足第一条件的情况下,互换所述序列化缓冲区和所述落盘缓冲区的名称;
90.优选的,所述第一条件为:所述落盘缓冲区已落盘完成且所述序列化缓冲区达到落盘条件;这里,落盘缓冲区的数据随着落盘完成而清空;
91.所述落盘条件为:所述序列化缓冲区中包含的二元组的数目大于第一阈值;或者所述序列化缓冲区中包含的二元组的数目在设定时间无变化。
92.所述序列化缓冲区达到落盘条件时,序列化线程会阻塞,直至序列化缓冲区和落盘缓冲区互换。
93.s13.4:对所述落盘缓冲区进行落盘,以使所述二元组写入所述预写日志文件中。
94.可以理解的是,预写日志文件是位于硬盘中的,对落盘缓冲区进行落盘,相当于将落盘缓冲区中的二元组写入预写日志文件。
95.本发明预写日志队列的结构设置,增大每次系统调用写入的数据量,同时将磁盘的随机i/o转换为顺序i/o,提升了预写日志的写入吞吐能力。
96.具体的,所述预写日志队列中的多个日志数据文件进行了顺序编号;
97.在所述预写日志文件大小超过第二阈值时,将编号位于所述预写日志文件之后的日志数据文件变更为预写日志文件。
98.本发明每个日志数据文件都有自己的文件号,文件号是一个递增的正整数编号,用于维护日志数据文件间的相对顺序。每个预写日志队列下只有一个正在写入的日志数据文件,当该文件的大小超过指定阈值后,将文件号自增,并滚动至下一个日志数据文件。
99.可以看出,日志数据文件存储一个或多个内存表中的数据项,同一内存表的数据项会存在于多个日志数据文件中,两者形成多对多关系,只有当某个日志数据文件中所有的内存表都成功落盘后,该日志数据文件才可以被删除。
100.本发明滚动文件的大小阈值决定了日志数据文件删除的粒度,阈值越大,删除操作的粒度更粗,更容易造成数据文件的积累。
101.具体的,所述预写日志队列还包括日志控制文件(.ctrl文件);图2示例了预写日志队列结构以及动态分配的内存表的示意图,如图2所示,日志数据文件和日志控制文件分开存储,便于重启时快速恢复控制信息。
102.所述内存表被分配给所述预写日志队列的同时,还包括:将所述内存表的创建标识保存到所述日志控制文件中;
103.所述落盘缓冲区落盘之后还包括:告知所述数据库的写入端,以使所述写入端将所述数据项写入所述内存表,并在所述内存表包含的数据项数目超过第一阈值时使所述内存表落盘;
104.所述内存表落盘之后还包括:
105.将所述内存表的落盘标识和相关信息保存到所述日志控制文件中;
106.其中,所述相关信息包括但不限于:编号、落盘形成的文件对应的文件路径以及初始数据项所在日志数据文件的编号。
107.可以理解的是,告知并不限于消息传送这一种实现方式,事实上,写入请求会在对
应的预写日志执行阶段阻塞挂起,预写完成后解挂并进入内存表写入和落盘阶段。
108.图3示例了日志控制文件和日志数据文件数据写入流程示意图;如图3所示,日志数据文件和日志控制文件必须满足以下条件:
109.条件一:内存表预写必须在内存表的创建标识《creat》落盘之后。
110.条件二:内存表的落盘标识《flush》落盘之后,对应的预写日志可以被安全地删除。
111.条件一保障了内存表的所有数据项都会在其创建后(具有创建标识《creat》后)被保存到预写日志中。条件二保障了内存表在预写日志中的数据备份会一直保留直至其成功落盘。两个条件共同保证了数据的持久性。
112.具体的,对于数据库写入而言,移动终端异常掉电后的数据恢复是至关重要的,本发明通过下述方式对分配到所述预写日志队列的内存表进行数据恢复:
113.基于所述日志控制文件内存表的创建标识和落盘标识,确定待恢复内存表;
114.读取所述多个日志数据文件,依据每一个待恢复内存表的编号过滤每一个待恢复内存表需要回放的数据项;
115.通过所述写入端,对每一个待恢复内存表进行数据项回放。
116.这里,待恢复内存表指的是存在所述日志控制文件中存在创建标识而不存在落盘标识的内存表。
117.本发明通过在日志控制文件中记录内存表的创建标识和落盘标识,实现待恢复内存表的快速定位,然后从日志数据文件中快速过滤待恢复内存表的数据项,以实现快速恢复。可以说,日志控制文件和日志数据文件在重启恢复时共同保障数据的持久性。
118.具体的,由于一个日志数据文件中可能混合存储了多个内存表的数据,因此在非理想情况下,只要有一个内存表未落盘,那么这个数据文件就无法被删除,因此本发明提供定时管理日志数据文件的方法。
119.其中,对所述预写日志队列中的日志数据文件的管理操作如下:
120.步骤1:将所述日志控制文件中具有创建标识且不具有落盘标识的内存表认定为未落盘内存表;
121.步骤2:比较所有未落盘内存表的初始数据项所在日志数据文件的编号,得到最小值;
122.步骤3:删除所述预写日志队列中编号小于所述最小值的日志数据文件;可以理解,编号小于所述最小值的日志数据文件,均是无效日志数据文件,可以删除。
123.步骤4:计算所述预写日志队列的预写日志有效信息占比;
124.步骤5:当所述预写日志有效信息占比低于给定占比阈值时,依照预设条件触发所述未落盘内存表快照或刷盘;内存表刷盘指的是强制内存表落到磁盘上,落盘后内存中无该内存表。内存表快照指的是将内存表数据项重新预写入到日志数据文件中,并删除之前的预写记录,快照后该内存表仍在内存中接收写入,快照的目的是更新该内存表初始数据项所在日志数据文件的编号。
125.步骤6:若触发了任一所述未落盘内存表快照或刷盘,则返回步骤1,否则结束。触发任一所述未落盘内存表快照或刷盘,可能就会导致一些日志数据文件失效,因此需重新执行上述流程。快照和刷盘都是耗时的操作,没有必要就不要触发,因此删除步骤先于快照
和刷盘。
126.图4是本发明提供的日志数据文件快照原理示意图,如图4所示,内存表1的初始数据项所在日志数据文件编号为1,若对内存表执行快照(即重新对内存表数据项进行预写),那么最小值从1变为150,则跳回步骤1后可以删除150前的所有日志数据文件。
127.本发明引入内存表快照和预写日志有效信息占比来优化日志数据文件的删除流程,提高了日志数据文件管理的有效性。
128.优选的,所述步骤4包括:对所有未落盘内存表进行内存大小求和,得到第一求和值;
129.将磁盘中与所述预写日志队列对应的所有内存表进行内存大小求和,得到第二求和值;
130.将所述第一求和值与所述第二求和值的求和值,记为第三求和值;
131.所述第一求和值与所述第三求和值的比值作为所述预写日志队列的预写日志有效信息占比。
132.例如:假设所有内存表的大小相同,均为50m,对于所述预写日志队列而言,内存中有2个未落盘的内存表,磁盘上有999个已落盘的内存表,则第一求和值size
memory
=2x50=100m,第二求和值size
disk
=999x50=49950m,则预写日志有效信息占比为2x50
÷
(2x50+999x50)=0.1998%。本发明给定了预写日志有效信息占比的计算方式,为日志数据文件的管理奠定基础。
133.优选的,所述步骤5中的依照预设条件触发所述未落盘内存表快照或刷盘,包括:
134.若所述未落盘内存表满足大小低于给定内存表阈值且快照次数未达上限的条件,则在所述预写日志文件中为所述未落盘内存表做快照;
135.若所述未落盘内存表满足大小不低于给定内存表阈值或快照次数达上限的条件,则触发所述未落盘内存表刷盘。
136.本发明预设上述条件触发快照或刷盘的条件,以实现资源的合理利用。
137.预写日志端的资源占用更易控制,当计算环境和应用负载发生变化时,本发明能够在不重启的情况下通过简单地调整预写日志队列的配置来快速实现动态性能调优。此外本发明方法能在几乎不影响写入效率的同时更好地保障低频数据的查询效率。
138.下面对本发明提供的基于多队列的数据库预写日志装置进行描述,下文描述的基于多队列的数据库预写日志装置与上文描述的基于多队列的数据库预写日志可相互对应参照。图5提供了一种基于多队列的数据库预写日志装置的结构示意图,如图5所示,所述装置用于基于lsm树存储引擎的数据库的预写日志端,所述预写日志端包含多个预写日志队列,每一个预写日志队列只有一个正在写入的预写日志文件,所述装置包括:
139.获取模块21,用于获取写入请求中的数据项及其对应的内存表;
140.确定模块22,用于确定为所述内存表分配的预写日志队列;
141.表示模块23,用于采用二元组表示所述数据项和所述内存表的编号;
142.预写模块24,用于控制所述预写日志队列将所述二元组写入自身的预写日志文件中。
143.本发明提供一种基于多队列的数据库预写日志装置,获取写入请求中的数据项及其对应的内存表;确定为所述内存表分配的预写日志队列;采用二元组表示所述数据项和
所述内存表的编号;控制所述预写日志队列将所述二元组写入自身的预写日志文件中。使用预写日志队列作为基本的预写任务执行单元,每一个预写日志队列只有一个正在写入的预写日志文件,不同内存表会被动态分配给不同的预写日志队列,因此一个预写日志文件可以针对不同内存表预写日志,实现了预写日志文件和内存表的解耦,进而使预写日志写入吞吐能力的调优容易实现,还降低了预写日志的资源占用。
144.在上述各实施例的基础上,作为一种可选的实施例,所述确定模块,包括:
145.第一告知单元,用于在内存中不存在所述内存表的情况下,告知所述数据库的写入端创建所述内存表;
146.动态分配单元,用于在所述内存表创建完成后,利用预设动态分配算法为所述内存表分配预写日志队列。
147.在上述各实施例的基础上,作为一种可选的实施例,所述预写日志队列包括:阻塞队列、序列化缓冲区、落盘缓冲区和多个日志数据文件,所述多个日志数据文件中正在写入的日志数据文件为所述预写日志文件;所述预写模块,包括:
148.排队单元,用于将所述二元组送入所述阻塞队列中排队;
149.缓冲单元,用于通过序列化线程,将所述二元组缓冲到所述序列化缓冲区中;
150.交换单元,用于在满足第一条件的情况下,互换所述序列化缓冲区和所述落盘缓冲区的名称;
151.落盘单元,用于对所述落盘缓冲区进行落盘,以使所述二元组写入所述预写日志文件中。
152.在上述各实施例的基础上,作为一种可选的实施例,所述预写模块还包括:第二告知单元,用于:
153.在所述二元组写入所述预写日志文件之后,告知所述数据库的写入端,以使所述写入端将所述数据项写入所述内存表。
154.在上述各实施例的基础上,作为一种可选的实施例,所述第一条件为:所述落盘缓冲区已落盘完成且所述序列化缓冲区达到落盘条件;
155.所述落盘条件为:所述序列化缓冲区中包含的二元组的数目大于第一阈值;或者所述序列化缓冲区中包含的二元组的数目在设定时间无变化。
156.在上述各实施例的基础上,作为一种可选的实施例,所述预写日志队列中的多个日志数据文件进行了顺序编号;
157.在所述预写日志文件大小超过第二阈值时,将编号位于所述预写日志文件之后的日志数据文件变更为预写日志文件。
158.在上述各实施例的基础上,作为一种可选的实施例,所述预写日志队列还包括日志控制文件;
159.所述预写模块还包括:第一告知单元,所述第一告知单元用于在所述落盘缓冲区落盘之后,告知所述数据库的写入端,以使所述写入端将所述数据项写入所述内存表,并在所述内存表包含的数据项数目超过第一阈值时使所述内存表落盘;
160.所述内存表被分配给所述预写日志队列的同时,还包括:将所述内存表的创建标识保存到所述日志控制文件中;
161.所述内存表落盘之后还包括:
162.将所述内存表的落盘标识和相关信息保存到所述日志控制文件中;
163.其中,所述相关信息包括但不限于:编号、落盘形成的文件对应的文件路径以及初始数据项所在日志数据文件的编号。
164.在上述各实施例的基础上,作为一种可选的实施例,所述装置还包括:在移动终端异常掉电后,对分配到所述预写日志队列的内存表进行数据恢复的数据恢复模块,所述数据恢复模块包括:
165.待恢复内存表确定单元,用于基于所述日志控制文件内存表的创建标识和落盘标识,确定待恢复内存表;
166.需要回放的数据项确定单元,用于读取所述多个日志数据文件,依据每一个待恢复内存表的编号过滤每一个待恢复内存表需要回放的数据项;
167.回放单元,用于通过所述写入端,对每一个待恢复内存表进行数据项回放。
168.在上述各实施例的基础上,作为一种可选的实施例,所述装置还包括:定时管理所述预写日志队列中的日志数据文件的管理模块,所述管理模块,包括:
169.未落盘内存表确定单元,用于:将所述日志控制文件中具有创建标识且不具有落盘标识的内存表认定为未落盘内存表;
170.最小值确定单元,用于比较所有未落盘内存表的初始数据项所在日志数据文件的编号,得到最小值;
171.删除单元,用于删除所述预写日志队列中编号小于所述最小值的日志数据文件;
172.预写日志有效信息占比计算单元,用于计算所述预写日志队列的预写日志有效信息占比;
173.快照或刷盘触发单元,用于:当所述预写日志有效信息占比低于给定占比阈值时,依照预设条件触发所述未落盘内存表快照或刷盘;
174.判断单元,用于若触发了任一所述未落盘内存表快照或刷盘,则返回未落盘内存表确定单元,否则结束。
175.在上述各实施例的基础上,作为一种可选的实施例,所述预写日志有效信息占比计算单元,包括:
176.第一求和子单元,用于对所有未落盘内存表进行内存大小求和,得到第一求和值;
177.第二求和子单元,用于将磁盘中与所述预写日志队列对应的所有内存表进行内存大小求和,得到第二求和值;
178.第三求和子单元,用于将所述第一求和值与所述第二求和值的求和值,记为第三求和值;
179.比值计算子单元,用于所述第一求和值与所述第三求和值的比值作为所述预写日志队列的预写日志有效信息占比。
180.在上述各实施例的基础上,作为一种可选的实施例,所述快照或刷盘触发单元,用于:若所述未落盘内存表满足大小低于给定内存表阈值且快照次数未达上限的条件,则在所述预写日志文件中为所述未落盘内存表做快照;
181.若所述未落盘内存表满足大小不低于给定内存表阈值或快照次数达上限的条件,则触发所述未落盘内存表刷盘。
182.图6示例了一种电子设备的实体结构示意图,如图6所示,该电子设备可以包括:处
理器(processor)610、通信接口(communications interface)620、存储器(memory)630和通信总线640,其中,处理器610,通信接口620,存储器630通过通信总线640完成相互间的通信。处理器610可以调用存储器630中的逻辑指令,以执行基于多队列的数据库预写日志方法,该方法包括:该方法用于基于lsm树存储引擎的数据库的预写日志端,所述预写日志端包含多个预写日志队列,每一个预写日志队列只有一个正在写入的预写日志文件,该方法包括:获取写入请求中的数据项及其对应的内存表;确定为所述内存表分配的预写日志队列;采用二元组表示所述数据项和所述内存表的编号;控制所述预写日志队列将所述二元组写入自身的预写日志文件中。
183.此外,上述的存储器630中的逻辑指令可以通过软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(rom,read-only memory)、随机存取存储器(ram,random access memory)、磁碟或者光盘等各种可以存储程序代码的介质。
184.另一方面,本发明还提供一种计算机程序产品,所述计算机程序产品包括计算机程序,计算机程序可存储在非暂态计算机可读存储介质上,所述计算机程序被处理器执行时,计算机能够执行上述各方法所提供的基于多队列的数据库预写日志方法,该方法包括:该方法用于基于lsm树存储引擎的数据库的预写日志端,所述预写日志端包含多个预写日志队列,每一个预写日志队列只有一个正在写入的预写日志文件,该方法包括:获取写入请求中的数据项及其对应的内存表;确定为所述内存表分配的预写日志队列;采用二元组表示所述数据项和所述内存表的编号;控制所述预写日志队列将所述二元组写入自身的预写日志文件中。
185.又一方面,本发明还提供一种非暂态计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现以执行上述各方法提供的基于多队列的数据库预写日志方法,该方法包括:该方法用于基于lsm树存储引擎的数据库的预写日志端,所述预写日志端包含多个预写日志队列,每一个预写日志队列只有一个正在写入的预写日志文件,该方法包括:获取写入请求中的数据项及其对应的内存表;确定为所述内存表分配的预写日志队列;采用二元组表示所述数据项和所述内存表的编号;控制所述预写日志队列将所述二元组写入自身的预写日志文件中。
186.以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性的劳动的情况下,即可以理解并实施。
187.通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到各实施方式可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件。基于这样的理解,上述技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该
计算机软件产品可以存储在计算机可读存储介质中,如rom/ram、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行各个实施例或者实施例的某些部分所述的方法。
188.最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

技术特征:
1.一种基于多队列的数据库预写日志方法,用于基于lsm树存储引擎的数据库的预写日志端,其特征在于,所述预写日志端包含多个预写日志队列,每一个预写日志队列只有一个正在写入的预写日志文件,所述方法包括:获取写入请求中的数据项及其对应的内存表;确定为所述内存表分配的预写日志队列;采用二元组表示所述数据项和所述内存表的编号;控制所述预写日志队列将所述二元组写入自身的预写日志文件中。2.根据权利要求1所述的基于多队列的数据库预写日志方法,其特征在于,在内存中不存在所述内存表的情况下,所述确定为所述内存表分配的预写日志队列,包括:告知所述数据库的写入端创建所述内存表;在所述内存表创建完成后,利用预设动态分配算法为所述内存表分配预写日志队列。3.根据权利要求1所述的基于多队列的数据库预写日志方法,其特征在于,所述预写日志队列包括:阻塞队列、序列化缓冲区、落盘缓冲区和多个日志数据文件,所述多个日志数据文件中正在写入的日志数据文件为所述预写日志文件;所述控制所述预写日志队列将所述二元组写入自身的预写日志文件中,包括:将所述二元组送入所述阻塞队列中排队;通过序列化线程,将所述二元组缓冲到所述序列化缓冲区中;在满足第一条件的情况下,互换所述序列化缓冲区和所述落盘缓冲区的名称;对所述落盘缓冲区进行落盘,以使所述二元组写入所述预写日志文件中。4.根据权利要求3所述的基于多队列的数据库预写日志方法,其特征在于,所述第一条件为:所述落盘缓冲区已落盘完成且所述序列化缓冲区达到落盘条件;所述落盘条件为:所述序列化缓冲区中包含的二元组的数目大于第一阈值;或者所述序列化缓冲区中包含的二元组的数目在设定时间无变化。5.根据权利要求3所述的基于多队列的数据库预写日志方法,其特征在于,所述预写日志队列中的多个日志数据文件进行了顺序编号;在所述预写日志文件大小超过第二阈值时,将编号位于所述预写日志文件之后的日志数据文件变更为预写日志文件。6.根据权利要求5所述的基于多队列的数据库预写日志方法,其特征在于,所述预写日志队列还包括日志控制文件;所述内存表被分配给所述预写日志队列的同时,还包括:将所述内存表的创建标识保存到所述日志控制文件中;所述落盘缓冲区落盘之后还包括:告知所述数据库的写入端,以使所述写入端将所述数据项写入所述内存表,并在所述内存表包含的数据项数目超过第一阈值时使所述内存表落盘;所述内存表落盘之后还包括:将所述内存表的落盘标识和相关信息保存到所述日志控制文件中;其中,所述相关信息包括但不限于:编号、落盘形成的文件对应的文件路径以及初始数据项所在日志数据文件的编号。7.根据权利要求6所述的基于多队列的数据库预写日志方法,其特征在于,在移动终端
异常掉电后,分配到所述预写日志队列的内存表的数据恢复过程,包括:基于所述日志控制文件内存表的创建标识和落盘标识,确定待恢复内存表;读取所述多个日志数据文件,依据每一个待恢复内存表的编号过滤每一个待恢复内存表需要回放的数据项;通过所述写入端,对每一个待恢复内存表进行数据项回放。8.根据权利要求6所述的基于多队列的数据库预写日志方法,其特征在于,定时管理所述预写日志队列中的日志数据文件;其中,管理所述预写日志队列中的日志数据文件,包括:步骤1:将所述日志控制文件中具有创建标识且不具有落盘标识的内存表认定为未落盘内存表;步骤2:比较所有未落盘内存表的初始数据项所在日志数据文件的编号,得到最小值;步骤3:删除所述预写日志队列中编号小于所述最小值的日志数据文件;步骤4:计算所述预写日志队列的预写日志有效信息占比;步骤5:当所述预写日志有效信息占比低于给定占比阈值时,依照预设条件触发所述未落盘内存表快照或刷盘;步骤6:若触发了任一所述未落盘内存表快照或刷盘,则返回步骤1,否则结束。9.根据权利要求8所述的基于多队列的数据库预写日志方法,其特征在于,所述计算所述预写日志队列的预写日志有效信息占比,包括:对所有未落盘内存表进行内存大小求和,得到第一求和值;将磁盘中与所述预写日志队列对应的所有内存表进行内存大小求和,得到第二求和值;将所述第一求和值与所述第二求和值的求和值,记为第三求和值;所述第一求和值与所述第三求和值的比值作为所述预写日志队列的预写日志有效信息占比。10.根据权利要求8所述的基于多队列的数据库预写日志方法,其特征在于,所述依照预设条件触发所述未落盘内存表快照或刷盘,包括:若所述未落盘内存表满足大小低于给定内存表阈值且快照次数未达上限的条件,则在所述预写日志文件中为所述未落盘内存表做快照;若所述未落盘内存表满足大小不低于给定内存表阈值或快照次数达上限的条件,则触发所述未落盘内存表刷盘。11.一种基于多队列的数据库预写日志装置,用于基于lsm树存储引擎的数据库的预写日志端,其特征在于,所述预写日志端包含多个预写日志队列,每一个预写日志队列只有一个正在写入的预写日志文件,所述装置包括:获取模块,用于获取写入请求中的数据项及其对应的内存表;确定模块,用于确定为所述内存表分配的预写日志队列;表示模块,用于采用二元组表示所述数据项和所述内存表的编号;预写模块,用于控制所述预写日志队列将所述二元组写入自身的预写日志文件中。

技术总结
本发明提供一种基于多队列的数据库预写日志方法和装置,获取写入请求中的数据项及其对应的内存表;确定为内存表分配的预写日志队列;采用二元组表示数据项和内存表编号;令预写日志队列将二元组写入自身的预写日志文件中。本发明使用预写日志队列作为基本的预写任务执行单元,每一个预写日志队列只有一个正在写入的预写日志文件,不同内存表会被动态分配给不同的预写日志队列,因此一个预写日志文件可以对不同内存表预写日志,实现了预写日志文件和内存表的解耦,进而使预写日志写入吞吐能力的调优容易实现。力的调优容易实现。力的调优容易实现。


技术研发人员:王建民 黄向东 乔嘉林 曹高飞 田原 朱海铭
受保护的技术使用者:天谋科技(北京)有限公司
技术研发日:2023.04.21
技术公布日:2023/8/9
版权声明

本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)

飞行汽车 https://www.autovtol.com/

分享:

扫一扫在手机阅读、分享本文

相关推荐