实现OpenGauss数据库主从复制模式下从机快速保持与主机数据一致性的方法与流程

文档序号:29493166发布日期:2022-04-06 14:05阅读:378来源:国知局
实现opengauss数据库主从复制模式下从机快速保持与主机数据一致性的方法
技术领域
:1.本发明属于关系型数据库管理及操作系统
技术领域
:,尤其涉及一种实现opengauss数据库主从复制模式下从机快速保持与主机数据一致性的方法及其用途。
背景技术
::2.opengauss是一款开源关系型数据库管理系统,其内核源自postgresql,作为一个开源、免费的数据库平台,旨在鼓励社区贡献、合作。目前,opengauss数据库已支持对预写式日志(wal)进行流式物理复制(流复制),数据库用户可以通过流复制,实现备库过程中一边从主库接收wal,一边回放接收到的wal,备库持续从主库接收和回放wal完成备库的构建和数据同步。然而,随着主库压力的增大会产生大量的wal,备库wal回放速度减慢导致wal累积,主库和备库wal差值达到设定阈值后数据库性能将明显下降。因此,如果有一种技术方案能够使备库快速完成wal回放,减少wal累积,保持主库和备库wal差值始终在设定的阈值范围之内,则可以显著提高主从复制模式下opengauss数据库的对外服务能力,为数据库性能的正常发挥提供有力的技术保障。技术实现要素:3.为了克服opengauss数据库主从复制模式下备库wal回放速度减慢导致的从机与主机数据不一致,进而降低数据库性能的缺陷,本发明提供了一种解决方案。本发明的目的是为opengauss数据库设计一种主从复制模式下从机快速保持与主机数据一致性方法,本方法是通过设计一套wal并行回放方案来实现的。4.具体而言,本发明提供了一种实现opengauss数据库主从复制模式下从机快速保持与主机数据一致性的方法,本方法通过改造现有的wal回放线程,将备库回放线程工作由单独线程回放拆分为多线程并行回放,并将wal类型区分为事务日志和非事务日志,所述事务日志包括事务操作相关日志,所述非事务日志包括数据操作相关日志;针对事务日志,本方法仍采用单独线程回放,以避免乱序事件的发生,针对非事务日志,本方法采用多线程并行回放,以加快wal回放速度。5.进一步地,本发明方法中所述事务日志包括csn(commitsequencenum)日志和事务提交日志;所述非事务日志包括insert操作日志和update操作日志。6.进一步地,本发明方法在实施过程中,当对非事务日志采用多线程并行回放处理时,如果非事务日志之间存在依赖关系,则将依赖关系区分为事务内依赖关系和事务间依赖关系,针对不同类型的依赖关系,采用下述不同的处理方法:7.(1)针对事务内依赖关系,当一个事务内存在对同一操作对象多次操作的wal时,并行回放时根据从wal信息中获取到的标识该操作对象物理位置的数字标号计算回放此日志的工作线程编号,由于标识操作对象物理位置的数字标号具有唯一性,从而保证了包含同一操作对象的所有非事务日志都由同一个工作线程回放;8.(2)针对事务间依赖关系,对并行回放的wal进行封装,并在封装结构中保存相关的标记信息,同时在数据库内核中设置wal类型和分派函数映射关系,针对不同类型的wal调用与之相匹配的分派函数,由分派函数处理事务间的依赖关系。9.进一步地,上述处理方法(2)针对事务间依赖关系中所述针对不同类型的wal调用与之相匹配的分派函数,由分派函数处理事务间的依赖关系,具体包括以下处理方式:10.(1)当wal的类型为rm_heap_id时,对应的分派函数为dispatchheaprecord,dispatchheaprecord根据wal是否涉及数据块改动来决定该wal由哪个redo_batch线程回放:11.(a)若max_bloc_id》=0,表明涉及数据块改动,遍历每个数据块,依据数据块的物理文件oid来选择分组,保证物理文件oid相同的wal由同一个工作线程回放;12.(b)若max_block_id《0,表明不涉及数据块改动,则将wal分派给多个工作线程并行回放;13.(2)当wal的类型为rm_standby_id时,对应的分派函数为dispatchstandbyrecord,dispatchstandbyrecord将此wal分派给redo_trxn_mng线程回放;14.(3)当wal的类型为rm_xact_id时,对应的分派函数为dispatchxactrecord,dispatchxactrecord首先判断此wal是否会删除文件:15.(a)如果会删除文件,则将此wal分派给所有的redo_batch线程回放;16.(b)如果不删除文件,则将此wal分派给redo_trxn_mng线程回放。17.优选地,本发明实现opengauss数据库主从复制模式下从机快速保持与主机数据一致性的方法,包括以下步骤:18.(1)日志接收线程将主库发送过来的wal写入磁盘;19.(2)由startup线程从磁盘读取wal,并将wal区分为事务日志和非事务日志,其中:20.(a)事务日志由redo_trxn_worker线程单独回放,21.(b)非事务日志由多线程并行回放;22.(3)针对非事务日志,根据非事务日志的类型调用不同的分派函数,分派函数对非事务日志进行分派,将其放入对应的redo_page_worker线程的spsc队列中,如果队列已满,则startup线程会循环等待;23.(4)由redo_page_worker线程从spsc队列中读取非事务日志后进行回放,并更新本线程已经回放的非事务日志的位置;24.(5)由startup线程获取redo_page_worker线程已经回放的非事务日志的最小值,判断事务日志能否回放,如果可以则调用对应的回放函数。25.此外,本发明还涉及上述实现opengauss数据库主从复制模式下从机快速保持与主机数据一致性的方法在关系型数据库管理或操作系统中的用途。26.综上,本发明首次提出了一种实现opengauss数据库主从复制模式下从机快速保持与主机数据一致性的方法,本方法通过设计一套wal并行回放方案,很好地克服了opengauss数据库主从复制模式下备库wal回放速度减慢导致的从机与主机数据不一致,进而降低数据库性能的缺陷。利用本方法能够使备库快速完成wal回放,减少wal累积,保持主库和备库wal差值始终在设定的阈值范围之内,通过主从模式下进行的压测,结果显示开启wal并行回放后数据库性能明显优于未开启状态,本方法wal并行回放策略可显著提高主从复制模式下opengauss数据库的对外服务能力,为数据库性能的正常发挥提供有力的技术保障。附图说明27.为了更清楚地说明本发明实施例的技术方案,下面对本发明实施例中需要使用的附图作简要介绍,显而易见地,下述附图仅是本发明中记载的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。28.图1为本发明方法的实施流程示意图。29.图注:startup线程:wal处理线程;30.spsc:用于保存wal队列;31.redo_batch线程:从startup线程的spsc队列中读取wal并解析,然后放入redo_page_mng线程的spsc队列中;32.redo_page_mng线程:从自身的spsc队列中读取解析过的wal,然后分派给redo_page_worker线程;33.redo_page_worker线程:负责进行实际的非事务日志回放;34.redo_trxn_mng线程:每次从自身的spsc队列中读取一条wal,然后分派给redo_trxn_worker线程处理;35.redo_trxn_worker线程:负责进行实际的事务日志回放。具体实施方式36.为使本发明的目的、技术方案和优点更加清楚,下面将结合具体实施例及相应的附图对本发明的技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本发明一部分实施例,而不是全部的实施例,本发明还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。37.同时,应理解,本发明的保护范围并不局限于下述特定的具体实施方案;还应当理解,本发明实施例中使用的术语是为了描述特定的具体实施方案,而不是为了限制本发明的保护范围。38.实施例1:一种实现opengauss数据库主从复制模式下从机快速保持与主机数据一致性的方法(参见图1),本方法通过改造现有的wal回放线程,将备库回放线程工作由单独线程回放拆分为多线程并行回放,并将wal类型区分为事务日志和非事务日志;事务日志包括事务操作相关日志,例如csn(commitsequencenum)日志和事务提交日志;非事务日志包括数据操作相关日志,例如insert操作日志和update操作日志;针对事务日志,本方法仍采用单独线程回放,以避免乱序事件的发生,针对非事务日志,本方法采用多线程并行回放,以加快wal回放速度。39.具体来说,本方法包括以下步骤:40.步骤一:日志接收线程将主库发送过来的wal写入磁盘;41.步骤二:由startup线程从磁盘读取wal,并将wal区分为事务日志和非事务日志,其中:42.(a)事务日志由redo_trxn_worker线程单独回放,43.(b)非事务日志由多线程并行回放;44.步骤三:针对非事务日志,根据非事务日志的类型调用不同的分派函数,分派函数对非事务日志进行分派,将其放入对应的redo_page_worker线程的spsc队列中,如果队列已满,则startup线程会循环等待;45.步骤四:由redo_page_worker线程从spsc队列中读取非事务日志后进行回放,并更新本线程已经回放的非事务日志的位置;46.步骤五:由startup线程获取redo_page_worker线程已经回放的非事务日志的最小值,判断事务日志能否回放,如果可以则调用对应的回放函数。47.实施例2:本方法中针对非事务日志采用多线程并行回放处理时,如果非事务日志之间存在依赖关系,则将依赖关系区分为事务内依赖关系和事务间依赖关系,针对不同类型的依赖关系,采用下述不同的处理方法:48.(1)针对事务内依赖关系,当一个事务内存在对同一操作对象(例如同一张表)多次操作的wal时(例如先做insert,再做delete),并行回放时根据从wal信息中获取到的标识该操作对象物理位置的数字标号(该表的relfilenode,根据wal信息可以获取到)计算回放此日志的工作线程编号,由于标识操作对象物理位置的数字标号具有唯一性,从而保证了包含同一操作对象(同一个表)的所有非事务日志都由同一个工作线程回放。49.(2)针对事务间依赖关系,对并行回放的wal进行封装,并在封装结构中保存相关的标记信息(例如日志是否需要同步到其他分组),同时在数据库内核中设置wal类型和分派函数映射关系,针对不同类型的wal调用与之相匹配的分派函数,分派函数对非事务日志进行分派处理。50.为了更清晰地说明此技术方案,列举如下示例进行示范:51.数据库主库操作如下:52.createtabletest(aint);53.insertintotestvalues(1);54.数据库插入数据日志:[0055][0056]总共产生了3条wal:[0057]a.xlog_heap_insert:执行插入操作;[0058]b.xlog_standby_csn_commiting:该wal用来表示事务正在提交;[0059]c.xlog_xact_commit_compact:事务提交日志。[0060]备库回放:[0061](a)第一条wal的类型为rm_heap_id(可根据wal中desc信息得到,heap映射类型为rm_heap_id),对应的分派函数为dispatchheaprecord(通过wal类型和分派函数映射关系获取),dispatchheaprecord根据wal是否涉及数据块改动来决定该wal由哪个redo_batch线程回放:[0062](1)若max_bloc_id》=0,表明涉及数据块改动,遍历每个数据块,依据数据块的物理文件oid(relfilenode)来选择分组,保证物理文件oid相同的wal由同一个工作线程回放;[0063](2)若max_block_id《0,表明不涉及数据块改动,则将wal分派给多个工作线程并行回放;[0064](b)第二条wal的类型为rm_standby_id,当wal_level》=hot_standby时,主库在事务提交阶段会记录一条此类型的wal,对应的分派函数为dispatchstandbyrecord,dispatchstandbyrecord将此wal分派给redo_trxn_mng线程回放;[0065](c)第三条wal的类型为rm_xact_id,对应的分派函数为dispatchxactrecord,dispatchxactrecord首先判断此wal是否会删除文件:[0066](1)如果会删除文件,则将此wal分派给所有的redo_batch线程回放;[0067](2)如果不删除文件,则将此wal分派给redo_trxn_mng线程回放。[0068]以上所述仅为本发明的实施例而已,并不用于限制本发明。对于本领域技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原理之内所作的任何修改、替换等,均应包含在本发明的权利要求保护范围之内。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1