CN112612855A - 高可用数据库日志接收队列、同步方法及装置 - Google Patents
高可用数据库日志接收队列、同步方法及装置 Download PDFInfo
- Publication number
- CN112612855A CN112612855A CN202011607632.6A CN202011607632A CN112612855A CN 112612855 A CN112612855 A CN 112612855A CN 202011607632 A CN202011607632 A CN 202011607632A CN 112612855 A CN112612855 A CN 112612855A
- Authority
- CN
- China
- Prior art keywords
- log
- block data
- log block
- linked list
- data
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/27—Replication, distribution or synchronisation of data between databases or within a distributed database system; Distributed database system architectures therefor
- G06F16/275—Synchronous replication
Landscapes
- Engineering & Computer Science (AREA)
- Databases & Information Systems (AREA)
- Theoretical Computer Science (AREA)
- Computing Systems (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供了一种高可用数据库日志同步方法,包括:从节点创建至少一个recv_thread线程进行日志块数据的处理和接收,所述日志块数据是由主节点将日志流数据切分而成的日志块数据,每个日志块数据包括日志首部信息和日志数据;每当recv_thread线程接收到一个日志块数据时,先从日志块数据中提取首部信息,根据首部信息将该日志块数据放置接收队列中;所述日志接收队列为一个指针数组,数组中的每个成员为一个结构指针,每个结构指针指向一个结构head,结构head中有两个链表,分别为顺序链表和失序链表,链表中的每个节点是一个日志块数据。本发明能够有效提高集群中从节点对日志的接收和处理速度,降低主从节点日志同步延迟,提高数据库集群高可用性。
Description
技术领域
本发明属于数据库技术领域,尤其是涉及一种高可用数据库日志接收队列、同步方法及装置。
背景技术
在高可用数据库集群中,主从节点通过日志传输保持同步。在高并发场景下,主节点需要处理大量的写请求,因此会产生较多的日志数据。大量日志数据需要发送给从节点,从节点收到日志数据并对其进行处理,进行日志回放和存储,保持与主节点的数据和状态的同步。
然而,受到从节点接收并处理日志数据的速度限制,日志发送速度的单方面提高并不能降低传输延迟,从节点对日志的接收及处理速度会对数据库的高可用性产生较大影响。为了降低日志同步延迟,本发明提出一种对于日志流数据接收方式,能够提高从节点日志接收和处理速度,进而提高数据库性能。
发明内容
有鉴于此,本发明旨在提出一种高可用数据库日志接收队列、同步方法及装置,能够有效提高集群中从节点对日志的接收和处理速度,降低主从节点日志同步延迟,提高数据库集群高可用性。
为达到上述目的,本发明的技术方案是这样实现的:
第一方面,本发明提供了一种高可用数据库日志接收队列,所述日志接收队列为一个指针数组,数组中的每个成员为一个结构指针,每个结构指针指向一个结构head,结构head中有两个链表,分别为顺序链表和失序链表,链表中的每个节点是一个日志块数据。
第二方面,本发明提供了一种高可用数据库日志同步方法,包括:
从节点创建至少一个recv_thread线程进行日志块数据的处理和接收,所述日志块数据是由主节点将日志流数据切分而成的日志块数据,每个日志块数据包括首部信息和日志数据;
每当一个recv_thread线程接收到一个日志块数据时,先从日志块数据中提取首部信息,根据首部信息将该日志块数据放置到上述的接收队列中。
进一步的,每当一个recv_thread线程接收到一个日志块数据后的处理过程,包括如下步骤:
(1)将该序号对指针数组长度取模,确定该日志块数据应该放置到该数组中的对应链表中,然后仅对该链表上锁;
(2)将该日志块数据的序号与对应链表中期待收到的序号对比,如果不相等,则将日志块数据放入失序日志块链表中;
如果相等,则将日志块数据放入到顺序日志链表的末尾,并更新下一个期待接收的序号,再遍历失序链表,检查是否有与期待接收的序号相等的序号,若有则将符合条件的日志块放入顺序链表的末尾,并更新下一个期待接收的序号,直到没有符合条件的序号;
(3)对该链表进行解锁处理。
第三方面,本发明提供了一种从节点,包括:上述接收队列以及接收单元,接收单元用于创建至少一个recv_thread线程进行日志块数据的处理和接收,所述日志块数据是由主节点将日志流数据切分而成的日志块数据,每个日志块数据包括日志首部信息和日志数据;每当一个recv_thread线程接收到一个日志块数据时,先从日志块数据中提取首部信息,根据首部信息将该日志块数据放置到所述的接收队列中。
第四方面,本发明提供了一种电子设备,包括至少一个处理器和存储器,所述存储器存储计算机执行指令;所述至少一个处理器执行所述计算机执行指令,使得所述处理器执行上述的日志同步方法。
第五方面,本发明提供了一种计算机可读存储介质,所述计算机可读存储介质中存储计算机执行指令,当处理器执行所述计算机执行指令时,实现上述的日志同步方法。
相对于现有技术,本发明所述的从节点以及日志同步方法具有以下优势:
本发明采用接收队列能够将日志块分散到多个链表中,对不同链表的操作互不影响,能够提高接收端的并行度,在保证以正确顺序接收日志块的同时,也能够提高日志块的接收速度,能够有效提高集群中从节点对日志的接收和处理速度,降低主从节点日志同步延迟,提高数据库集群高可用性。
附图说明
构成本发明的一部分的附图用来提供对本发明的进一步理解,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1为本发明实施例所述的日志块数据的组成图;
图2为本发明实施例所述的接收队列数据结构图;
图3为本发明实施例所述的接收队列排序方法示例图;
图4为本发明实施例所述线程接收日志块的整体流程图。
具体实施方式
需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。
下面将参考附图并结合实施例来详细说明本发明。
高可用数据库日志同步的参与者为主节点(日志的发送端)和从节点(日志的接收端),当数据库主节点处理的事务中有写操作时,主节点开始记录日志,并发送给从节点。
发送端:主节点将日志流数据进行处理,将其切分成一个个小的日志块数据(logfragment,下文简称log_frag),为了保证日志数据的顺序性和正确性,将每个日志块数据加上日志首部数据(包括发送序号等)作为控制信息,对其进行加密处理,发送给从节点。
在日志同步过程中,由于网络的不稳定,先发送的日志块可能后到达,因此接收的日志数据可能乱序到达。接收端收到乱序到达的日志数据,将日志数据按照首部序号放入接收队列中(保证其顺序的正确性),然后交给其他线程对日志块数据进行日志回放和存储等操作。
每个日志块由首部和数据组成,具体组成如图1所示,seq为该块日志的序号,len为log_data的长度,beg标识该日志块数据是否为本次传送的第一块日志数据,end标识该日志块数据是否为本次传送的最后一块日志数据,lsid标识进行日志传输的本地会话(接收端)id,rsid标识进行日志传输的远程会话(发送端)id,cry标识log_data是否被加密,cry_alg标识使用哪一种加密算法;log_data为实际的日志数据。
在日志接收端(从节点),数据库创建一个recv_thread线程进行日志块数据的处理和接收,每当recv_thread线程接收到一个log_frag时,先从log_frag中提取首部信息,然后根据首部信息将该log_frag放置到接收队列中。
日志队列中按照日志块数据的序号进行排序,每当接收线程收到一个日志块,就会将该日志块放入该队列中的合适位置。
本发明提出了采用优化的数据结构设计日志接收队列,该日志接收队列数据结构如图2所示。左端为一个指针数组,其中的成员是一个结构指针,该结构中的一个成员是日志块链表,链表中的每个节点是一个日志块,包括日志首部信息和日志数据。
使用该日志接收队列数据结构作为接收端缓冲区时,可以创建多个recv_thread线程同时进行日志块的处理和接收。
具体的,recv_thread线程接收日志块的整体流程如图4所示,当一个recv_thread收到一个log_frag时,从log_frag的首部信息中获得该log_frag的序号,将该序号对指针数组长度取模,确定该log_frag应该放置到该指针数组中的哪一个链表中,然后仅对该链表上锁,将该log_frag链接到该链表的末尾,操作完成后解锁。例如,当指针数组的长度为16时(size=16),此时当一个序号为19的log_frag到达时,将该log_frag放入左侧指针数组下标为3(seq%size=19%16=3)的元素所指向的链表中(下称3号链表),然后仅对3号链表上锁。
在日志块接收过程保证日志块顺序的方式如图3所示,在指针数组中,每个指针所指向的是一个结构head,在该结构中维护两个链表:顺序日志块链表(简称顺序链表)和失序日志块链表(简称失序链表)。
顺序链表中存放着按照正确顺序存放的日志块数据,失序链表中暂存由于网络延迟等原因乱序到达的日志块,每当向顺序链表尾部链接日志块时,都会检查是否能够将失序链表中的日志块恢复到顺序链表中,通过这种方式保证日志块的正确顺序。
具体的,由于网络是不稳定的,每次recv_thread线程接收到一个日志块之后,如图4所述,会将该日志块的序号与对应链表中期待收到的序号对比。
如果序号不相等,即出现后发送的日志块先到达时,并不会直接把该块日志放入顺序链表中,而是会先将其放入失序链表中;
如果序号相等,则放入到顺序链表的末尾,并更新下一个期待接收的序号;每当有新的日志块被放入顺序链表后,都会遍历失序链表,将符合条件的日志块放入顺序链表中;即遍历失序链表,检查是否有与期待接收的序号相等的序号,若有则将符合条件的日志块放入顺序链表的末尾,并更新下一个期待接收的序号,直到没有符合条件的序号;
之后对该链表进行解锁处理。尽管日志块可能到达的顺序不同,但是使用该队列能够保证其接收的顺序正确。
采用这种方式能够将乱序到达的日志块数据进行排序,保证日志数据接收的正确性。例如,如图3所示,当第2size号和3size号日志块先于size号日志块到达时,则会将它们放入失序链表中,当经过一段时间后,晚到的size号日志块被放入顺序链表的尾端,此时遍历失序链表,将其中的两个日志块连接到顺序链表的末尾,保证了日志块接收的顺序。
在接收结束后,将该数组交给后续日志处理线程,后续线程按照顺序取出日志数据即可。日志块数据结构的首部信息中其他信息是后续线程处理所需要的信息,即len、beg、end、lsid、rsid、cry、cry_alg是后续线程处理所需要的信息,与本方案无关,再此不再详述。
使用该数据结构作为接收端队列时,可以创建多线程并行进行日志块接收和处理,仅需要对特定线程正在处理的链表进行上锁,不影响其他线程对数组中的其他链表进行操作。由于从节点数据接收和处理的速度会直接影响日志的发送速度,此种接收队列能够将日志块分散到多个链表中,对不同链表的操作互不影响,因此采用这种方式能够提高接收端的并行度,在保证以正确顺序接收日志块的同时,也能够提高日志块的接收速度,从而提高日志同步的性能,最终提高数据库集群的整体性能。
另一实施例公开了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述日志同步方法。
另一实施例公开了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述日志同步方法。
通过以上关于实施方式的描述,所属领域的技术人员可以清楚地了解到,本发明可借助软件及必需的通用硬件来实现,当然也可以通过硬件实现,但很多情况下前者是更佳的实施方式。这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在计算机可读存储介质中,如计算机的软盘、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random AccessMemory,RAM)、闪存(FLASH)、硬盘或光盘等,包括若干指令用以使得一台电子设备(可以是手机,个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述的方法。
值得注意的是,上述从节点的实施例中,所包括的各个单元和模块只是按照功能逻辑进行划分的,但并不局限于上述的划分,只要能够实现相应的功能即可;另外,各功能单元的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (6)
1.一种高可用数据库日志接收队列,其特征在于:所述日志接收队列为一个指针数组,数组中的每个成员为一个结构指针,每个结构指针指向一个结构head,结构head中有两个链表,分别为顺序链表和失序链表,链表中的每个节点是一个日志块数据。
2.一种高可用数据库日志同步方法,其特征在于,包括:
从节点创建至少一个recv_thread线程进行日志块数据的处理和接收,所述日志块数据是由主节点将日志流数据切分而成的日志块数据,每个日志块数据包括首部信息和日志数据;
每当一个recv_thread线程接收到一个日志块数据时,先从日志块数据中提取首部信息,根据首部信息将该日志块数据放置到如权利要求1所述的接收队列中。
3.根据权利要求2所述的方法,其特征在于:所述日志块数据的首部信息包括日志块数据的序号,recv_thread线程接收到日志块数据后的处理过程包括如下步骤:
S1,将该序号对指针数组长度取模,确定该日志块数据应该放置到该数组中的对应链表中,然后仅对该链表上锁;
S2,将该日志块数据的序号与对应链表中期待收到的序号对比,如果不相等,则将日志块数据放入失序日志块链表中;
如果相等,则将日志块数据放入到顺序日志链表的末尾,并更新下一个期待接收的序号;则再遍历失序链表,检查是否有与期待接收的序号相等的序号,若有则将符合条件的日志块放入顺序链表的末尾,并更新下一个期待接收的序号,直到没有符合条件的序号;
S3,对该链表进行解锁处理。
4.一种从节点,其特征在于,包括:
如权利要求1所述的接收队列,
接收单元,用于创建至少一个recv_thread线程进行日志块数据的处理和接收,所述日志块数据是由主节点将日志流数据切分而成的日志块数据,每个日志块数据包括首部信息和日志数据;每当一个recv_thread线程接收到一个日志块数据时,先从日志块数据中提取首部信息,根据首部信息将该日志块数据放置到所述的接收队列中。
5.一种电子设备,其特征在于:包括至少一个处理器和存储器,所述存储器存储计算机执行指令;所述至少一个处理器执行所述计算机执行指令,使得所述处理器执行如权2至3任一项所述的日志同步方法。
6.一种计算机可读存储介质,其特征在于:所述计算机可读存储介质中存储计算机执行指令,当处理器执行所述计算机执行指令时,实现如权2至3任一项所述的日志同步方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011607632.6A CN112612855B (zh) | 2020-12-29 | 2020-12-29 | 高可用数据库日志接收队列、同步方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011607632.6A CN112612855B (zh) | 2020-12-29 | 2020-12-29 | 高可用数据库日志接收队列、同步方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112612855A true CN112612855A (zh) | 2021-04-06 |
CN112612855B CN112612855B (zh) | 2023-01-24 |
Family
ID=75249271
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011607632.6A Active CN112612855B (zh) | 2020-12-29 | 2020-12-29 | 高可用数据库日志接收队列、同步方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112612855B (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113694536A (zh) * | 2021-09-07 | 2021-11-26 | 北京蔚领时代科技有限公司 | 一种面向云游戏的场景管理方法、装置、设备及介质 |
CN115905155A (zh) * | 2023-01-05 | 2023-04-04 | 天津南大通用数据技术股份有限公司 | 一种逻辑日志同步的并行传输的方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101237348A (zh) * | 2008-01-24 | 2008-08-06 | 中兴通讯股份有限公司 | 一种简单网络管理协议队列的实现方法 |
CN101572700A (zh) * | 2009-02-10 | 2009-11-04 | 中科正阳信息安全技术有限公司 | 一种HTTP Flood分布式拒绝服务攻击防御方法 |
US20190340134A1 (en) * | 2018-05-03 | 2019-11-07 | SK Hynix Memory Solutions America Inc. | Configurable memory system and method of configuring and using such memory system |
CN110691062A (zh) * | 2018-07-06 | 2020-01-14 | 浙江大学 | 一种数据写入方法、装置及其设备 |
-
2020
- 2020-12-29 CN CN202011607632.6A patent/CN112612855B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101237348A (zh) * | 2008-01-24 | 2008-08-06 | 中兴通讯股份有限公司 | 一种简单网络管理协议队列的实现方法 |
CN101572700A (zh) * | 2009-02-10 | 2009-11-04 | 中科正阳信息安全技术有限公司 | 一种HTTP Flood分布式拒绝服务攻击防御方法 |
US20190340134A1 (en) * | 2018-05-03 | 2019-11-07 | SK Hynix Memory Solutions America Inc. | Configurable memory system and method of configuring and using such memory system |
CN110691062A (zh) * | 2018-07-06 | 2020-01-14 | 浙江大学 | 一种数据写入方法、装置及其设备 |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113694536A (zh) * | 2021-09-07 | 2021-11-26 | 北京蔚领时代科技有限公司 | 一种面向云游戏的场景管理方法、装置、设备及介质 |
CN115905155A (zh) * | 2023-01-05 | 2023-04-04 | 天津南大通用数据技术股份有限公司 | 一种逻辑日志同步的并行传输的方法 |
Also Published As
Publication number | Publication date |
---|---|
CN112612855B (zh) | 2023-01-24 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110691062B (zh) | 一种数据写入方法、装置及其设备 | |
CN112597251B (zh) | 数据库集群日志同步方法、装置、服务器及存储介质 | |
CN112612855B (zh) | 高可用数据库日志接收队列、同步方法及装置 | |
CN109379432A (zh) | 数据处理方法、装置、服务器及计算机可读存储介质 | |
US20150019812A1 (en) | Replication between sites using keys associated with modified data | |
CN113064764B (zh) | 在区块链系统中执行区块的方法及装置 | |
WO2014021978A4 (en) | Aggregating data in a mediation system | |
CN113157450B (zh) | 在区块链系统中执行区块的方法及装置 | |
EP3347815B1 (en) | Action-based routing of a transaction in an online transaction processing system | |
CN113076304A (zh) | 一种分布式版本管理方法、装置和系统 | |
US8954409B1 (en) | Acquisition of multiple synchronization objects within a computing device | |
CN115687402A (zh) | 一种实现缓存数据和数据库数据一致的方法 | |
CN114218135A (zh) | 一种基于Redis缓存的源端流控方法及系统 | |
CN113157465A (zh) | 基于指针链表的消息发送方法及装置 | |
CN110413689B (zh) | 一种内存数据库的多节点数据同步方法与装置 | |
Kishi et al. | SSS: scalable key-value store with external consistent and abort-free read-only transactions | |
WO2023142605A1 (zh) | 一种基于区块链的数据处理方法和相关装置 | |
US12003588B2 (en) | Coalescing packets with multiple writers in a stateless network function | |
CN107832121B (zh) | 一种应用于分布式串行长事务的并发控制方法 | |
CN113064768B (zh) | 在区块链系统中切换分片节点的方法和装置 | |
US9509780B2 (en) | Information processing system and control method of information processing system | |
US9128785B2 (en) | System and method for efficient shared buffer management | |
CN116149573B (zh) | Raid卡集群对队列的处理方法、系统、设备和介质 | |
CN113157494B (zh) | 区块链系统中数据备份的方法及装置 | |
CN114978950B (zh) | 基于fpga、cpu协同的网络算法调用方法及系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |