一种WAL日志的拆分和重组的方法和装置
文献发布时间:2024-04-18 20:02:18
技术领域
本发明属于日志的拆分和重组技术领域,尤其涉及一种WAL日志的拆分和重组的方法、装置、电子设备和存储介质。
背景技术
PostgreSQL等传统的关系型数据库受限于单台物理服务器的性能极限,需要通过主备WAL日志复制的方式添加备机以支持读性能的扩展。同时高可用架构通常也基于备机实现。但传统主备复制模式具有以下难以解决的缺点:添加备机时需要拷贝全量数据,时效性较差;备机的数据和主机完全一样,存储上造成浪费;这些缺点难以解决的根源在于传统关系型数据库存算一体的架构。近年头部互联网厂商纷纷推出各自的基于存算分离架构的云原生数据库实现,其实现思路都可以总结为:分离计算和存储,将存储放到分布式系统中;实现主备实例共享一份存储;通过这样的设计,在完美解决传统主备架构缺点的同时,也获得了极致的弹性能力。该思路的核心技术点是如何实现主备实例共享同一份存储。传统主备架构下,主备实例维护各自的数据,更新操作由主实例通过WAL日志同步到备实例,备实例接收到WAL日志后再重做更新本地数据。因此从某个时间点看,主备实例的数据是不同的。对于这个问题,业界主流的解决思路是使用WAL日志在基线数据的基础上实现数据多版本读,以支持备机对老版本数据的访问。这里的关键都是控制WAL日志的重做进度,使得数据版本保持在较老的状态。但具体到实现上,不同厂商分成了2个不同的技术路线:将WAL日志的重做逻辑下沉到存储层,由存储层控制重做进度;WAL日志回放还是由主实例完成,由主实例控制重做进度;对比方案2,方案1的WAL日志重做在存储层内部完成,整体代价更小。同时主实例也不再需要写脏页到存储,极大的减少了网络IO,在性能上具有明显优势。但其需要将重做逻辑下沉到存储层,这就需要对存储层进行针对性的改造。同时因为存储层是分布式系统,数据会分发到不同存储节点,那么我们也需要将WAL日志分发到对应节点以实现高效的本地重做。这里就涉及到WAL日志的拆分。最后PostgreSQL的一些生态工具,例如pg_waldump、walminer等都基于对WAL日志的解析,因此我们还需要在计算节点将WAL日志按顺序重新组合起来。
发明内容
鉴于以上现有技术的不足,发明的目的在于提供一种WAL日志的拆分和重组的方法、装置、电子设备和存储介质,解决现有方法中WAL日志的拆分和重组平衡运行效率、工程难度和对PG原生代码的侵入性等方面的问题。
本发明的第一方面,提出了一种WAL日志的拆分和重组的方法,包括:
通过资源管理器管理PostgreSQL中不同类型的XLog;
梳理资源管理器中所有类型的XLog,实现XLog的拆分和重组接口;
修改XLogRecordAssemble函数,根据资源管理器中XLog的类型调用对应的拆分接口,实现XLog插入LOG_BUFFER前拆分为SLog;
修改LogFlush函数,根据SLog头部信息,将所述SLog转发到对应Segment所在存储节点;
新增从存储节点根据指定LSN范围拉取SLog的接口,并通过XLogReaderAllocate注册以替换原有读取本地XLog文件的逻辑;
修改XLogDecodeNextRecord函数,根据所述SLog头部信息和资源管理器中XLog类型调用对应的重组接口,将所述SLog重新组合为XLog。
进一步地,上述一种WAL日志的拆分和重组的方法中,XLog中字段的定义如下:
XLogRecord:固定长度的头部信息;
Block Header数组:1条XLog可能包含多个Block的修改操作,每个Block包含一个头部信息;
Block data数组:对应多个Block的数据;
Main Header:XLog除了包含多个Block,还可能包含一些其它数据,称为maintrunk,该字段是main trunk的头部信息;
main data:main trunk的数据。
进一步地,上述一种WAL日志的拆分和重组的方法中,XLog插入LOG_BUFFER前拆分为SLog,包括:
将其包含的多个Block data数组按所属Segment进行分组,针对每个Segment重新生成一个XLog;
在重新生成XLog的头部vc c增加SLog Header打包成SLog。
进一步地,上述一种WAL日志的拆分和重组的方法中,SLog Header中包含了Segment处理SLog时需要的信息,
所述信息包括:
XLog LSN:当前SLog对应原XLog的LSN,同一个XLog拆分的多个SLog的XLog LSN值相同;
Segment ID:标识SLog的目标Segment;
SLog ID:同一个XLog拆分的多条SLog的ID从0开始单条递增。
进一步地,上述一种WAL日志的拆分和重组的方法,还包括:根据XLog中main data和block data修改的关系对main data进一步拆分。
进一步地,上述一种WAL日志的拆分和重组的方法,还包括:修改后的数据并没有放置到XLog的block data中,而是放置在XLog的main data中;
将main data转为block data进行处理。
进一步地,上述一种WAL日志的拆分和重组的方法,还包括:
在资源管理器中增加XLog类型,所述增加的XLog类型用于在重组XLog时,对于与事务一致性无关的文件对应的日志,不进行重组。
本发明的第二方面,提出了一种WAL日志的拆分和重组的装置,包括:
管理模块:用于通过资源管理器管理PostgreSQL中不同类型的XLog;
梳理模块:用于梳理资源管理器中所有类型的XLog,实现XLog的拆分和重组接口;
拆分模块:用于修改XLogRecordAssemble函数,根据资源管理器中XLog的类型调用对应的拆分接口,实现XLog插入LOG_BUFFER前拆分为SLog;
转发模块:用于修改LogFlush函数,根据SLog头部信息,将所述SLog转发到对应Segment所在存储节点;
注册模块:用于新增从存储节点根据指定LSN范围拉取SLog的接口,并通过XLogReaderAllocate注册以替换原有读取本地XLog文件的逻辑;
重新组合模块:用于修改XLogDecodeNextRecord函数,根据SLog头部信息和资源管理器中XLog类型调用对应的重组接口,将所述SLog重新组合为XLog。
本发明的第三方面,还提出了一种电子设备,包括:处理器和存储器;
所述处理器通过调用所述存储器存储的程序或指令,用于执行如上所述任一项所述一种WAL日志的拆分和重组的方法。
本发明的第四方面,还提出了一种计算机可读存储介质,所述计算机可读存储介质存储程序或指令,所述程序或指令使计算机执行如上所述任一项所述一种WAL日志的拆分和重组的方法。
本发明的有益效果如下:本发明基于PostgreSQL原有XLog拆分为SLog的设计,最大程度的保留了XLog的原始格式,使得对原有的生成日志和重做日志相关逻辑的改动较小,基于SLog完全重组还原XLog的设计,可实现对社区相关生态工具的100%兼容,基于不同资源管理器RMGR下不同XLog类型单独实现不同拆分方案的设计,使得日志拆分和重组的修改点集中在XLog相关的有限几个函数的设计,可最大程度减少对周边代码的侵入性。
附图说明
附图仅用于示出具体实施例的目的,而并不认为是对本发明的限制,在整个附图中,相同的参考符号表示相同的部件。显而易见地,下面描述中的附图仅仅是本发明实施例中记载的一些实施例,对于本领域普通技术人员来讲,还可以根据这些附图获得其他的附图。
图1为本发明实施例提供的一种WAL日志的拆分和重组方法图;
图2为本发明实施例提供的PostgreSQL的XLog格式;
图3为本发明实施例提供的PostgreSQL的XLog拆分方案图一;
图4为本发明实施例提供的PostgreSQL的XLog拆分方案图二;
图5为本发明实施例提供的PostgreSQL的XLog拆分方案图三;
图6为本发明实施例提供的一种WAL日志的拆分和重组装置图;
图7为本发明实施例提供的一种电子设备的示意性框图。
具体实施方式
为了使本领域的人员更好地理解本发明实施例中的技术方案,下面将结合附图对本发明的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。应该理解,这些描述只是示例性的,并非用于限定本发明的范围。基于本发明的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
此外,在以下说明中,省略了对公知结构和技术的描述,以避免不必要地混淆本发明公开的概念。
在本发明的描述中,术语“第一”、“第二”、“第三”仅用于描述目的,而不能理解为指示或暗示相对重要性。术语“安装”、“相连”、“连接”应做广义理解,例如,可以是固定连接,也可以是可拆卸连接,或一体地连接;可以是机械连接,也可以是电连接;可以是直接相连,也可以通过中间媒介间接相连,可以是两个元件内部的连通。对于本领域的普通技术人员而言,可以具体情况理解上述术语在本发明中的具体含义。
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本发明相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本发明的一些方面相一致的方法和系统的例子。
本发明提出了一种WAL日志的拆分和重组、装置、电子设备和存储介质,基于PostgreSQL原有XLog拆分为SLog的设计,最大程度的保留了XLog的原始格式,使得对原有的生成日志和重做日志相关逻辑的改动较小,基于SLog完全重组还原XLog的设计,可实现对社区相关生态工具的100%兼容,基于不同资源管理器RMGR下不同XLog类型单独实现不同拆分方案的设计,使得日志拆分和重组的修改点集中在XLog相关的有限几个函数的设计,可最大程度减少对周边代码的侵入性。
介绍本发明实施例之前,先介绍一下本发明涉及的专业术语:
PostgreSQL:一种开源关系型数据库。
存算分离:将计算逻辑和数据存储分离的数据库架构。
日志即数据库:在存算分离架构中,一种将数据库WAL日志的重做逻辑下沉到存储层的设计。
WAL日志(Write Ahead Log):关系型数据库中为了保证事务的完整性和原子性而是使用的一种追加写日志,通常还用于主备增量数据同步。
主备架构:传统数据库架构中,主实例利用WAL日志复制,将数据的增量修改同步到备实例,从而实现高可用和只读实例等功能。
方法实施例
图1为本发明实施例提供的一种WAL日志的拆分和重组方法图一。
本发明的第一方面,提出了一种WAL日志的拆分和重组的方法,结合图1,包括S1至S6六个步骤:
S1:通过资源管理器管理PostgreSQL中不同类型的XLog。
具体的,本发明实施例中,通过资源管理器RMGR管理PostgreSQL中不同类型的XLog。
S2:梳理资源管理器中所有类型的XLog,实现XLog的拆分和重组接口。
具体的,本发明实施例中,对每个资源管理器RMGR的每种XLog逐一梳理,根据XLog具体数据选择不同的拆分和重组方案,实现XLog的拆分和重组接口,通过XLog的拆分和重组接口实现不同的拆分和重组方案。
S3:修改XLogRecordAssemble函数,根据资源管理器中XLog的类型调用对应的拆分接口,实现XLog插入LOG_BUFFER前拆分为SLog。
具体的,本发明实施例中,修改XLogRecordAssemble函数,根据资源管理器中XLog的类型调用对应的拆分接口,实现XLog插入LOG_BUFFER前拆分为SLog,具体XLog拆分为SLog的方法下文详细介绍。
S4:修改LogFlush函数,根据SLog头部信息,将SLog转发到对应Segment所在存储节点。
具体的,本发明实施例中,SLog头部信息包括:XLog LSN:当前SLog对应原XLog的LSN,同一个XLog拆分的多个SLog的XLog LSN值相同;Segment ID:标识SLog的目标Segment;SLog ID:同一个XLog拆分的多条SLog的ID从0开始单条递增,将SLog转发到存储层中对应Segment所在存储节点。
S5:新增从存储节点根据指定LSN范围拉取SLog的接口,并通过XLogReaderAllocate注册以替换原有读取本地XLog文件的逻辑。
具体的,本发明实施例中,新增从存储节点根据指定LSN范围拉取SLog的接口,并通过XLogReaderAllocate注册以替换原有读取本地XLog文件的逻辑,存储层中对应Segment所在存储节点在收到SLog后,去掉SLog头部,剩下的数据和XLog的格式保持兼容,所以只需要将PostgreSQL中处理XLog的相关逻辑移植到存储层并做少量适配工作即可。
另外,一些实施例中,在SLog ID还原为XLog时,可以通过XLog LSN识别属于同一个XLog的多条SLog,再通过SLog ID完成1个XLog内多个SLog的排序。最后还原的XLog可以沿用PostgreSQL中原有处理逻辑,实现对开源工具的兼容。
应理解,基于PostgreSQL原有XLog拆分为SLog的,最大程度的保留了XLog的原始格式,使得对原有的生成日志和重做日志相关逻辑的改动较小。
S6:修改XLogDecodeNextRecord函数,根据SLog头部信息和资源管理器中XLog类型调用对应的重组接口,将SLog重新组合为XLog。
具体的,本发明实施例中,基于SLog完全重组还原XLog的设计,可实现对社区相关生态工具的100%兼容。
应理解,本发明中日志拆分和重组的修改点集中在XLog相关的有限几个函数的设计,可最大程度减少对周边代码的侵入性。
图2为本发明实施例提供的PostgreSQL的XLog格式。
进一步地,上述一种WAL日志的拆分和重组的方法中,XLog中字段的定义如下:
XLogRecord:固定长度的头部信息;
Block Header数组:1条XLog可能包含多个Block的修改操作,每个Block包含一个头部信息;
Block data数组:对应多个Block的数据;
Main Header:XLog除了包含多个Block,还可能包含一些其它数据,称为maintrunk,该字段是main trunk的头部信息;
main data:main trunk的数据。
进一步地,上述一种WAL日志的拆分和重组的方法中,XLog插入LOG_BUFFER前拆分为SLog,包括:
将其包含的多个Block data数组按所属Segment进行分组,针对每个Segment重新生成一个XLog;
在重新生成XLog的头部vc c增加SLog Header打包成SLog。
进一步地,上述一种WAL日志的拆分和重组的方法中,SLog Header中包含了Segment处理SLog时需要的信息,所述信息包括:
XLog LSN:当前SLog对应原XLog的LSN,同一个XLog拆分的多个SLog的XLog LSN值相同;
Segment ID:标识SLog的目标Segment;
SLog ID:同一个XLog拆分的多条SLog的ID从0开始单条递增。
进一步地,上述一种WAL日志的拆分和重组的方法,还包括:根据XLog中main data和block data修改的关系对main data进一步拆分。
下面结合附图介绍根据XLog中main data和block data修改的关系对main data进一步拆分的方法。
图3为本发明实施例提供的PostgreSQL的XLog拆分方案图一;
具体的,本发明实施例中,结合图3,main data只和第一个block的修改有关,maindata只包含在第一个SLog中,第二个SLog中的Main Header只是为了保持XLog格式的兼容,没有main data,后续同样情况不再赘述。
图4为本发明实施例提供的PostgreSQL的XLog拆分方案图二;
具体的,本发明实施例中,结合图4,main data和block1、block3的修改都有关,main data被拆分为2个部分,分别添加到2个SLog中,对应Main Header数据也要做修改。
进一步地,上述一种WAL日志的拆分和重组的方法,还包括:修改后的数据并没有放置到XLog的block data中,而是放置在XLog的main data中,将main data转为blockdata进行处理。
图5为本发明实施例提供的PostgreSQL的XLog拆分方案图三;
具体的,本发明实施例中,结合图5,在PostgreSQL中,一些数据的修改并没有放到block data,而是在main data中,例如一些事务相关日志,其隐含了对XLog文件的修改,而在分布式存储中都是按照block data来管理数据的,因此需要将这类main data转为blockdata进行处理。
进一步地,上述一种WAL日志的拆分和重组的方法,还包括:
在资源管理器中增加XLog类型,增加的XLog类型用于在重组XLog时,对于与事务一致性无关的文件对应的日志,不进行重组。
具体的,本发明实施例中,对于部分与事务一致性无关的文件如:postgresql.conf,其修改原本不会写入XLog中,但是现在这些文件也需要放到存储层以实现真正无状态的计算节点,所以需要增加一些日志类型,为了保持接口的统一,本发明选择在资源管理器中新增XLog类型而不是直接增加SLog类型,在重组XLog时,这部分日志需要被忽略。
装置实施例
图6为本发明实施例提供的一种WAL日志的拆分和重组装置图。
本发明的第二方面,提出了一种WAL日志的拆分和重组的装置,结合图6,包括:
管理模块61:用于通过资源管理器管理PostgreSQL中不同类型的XLog。
具体的,本发明实施例中,通过资源管理器RMGR中的管理模块61管理PostgreSQL中不同类型的XLog。
梳理模块62:用于梳理资源管理器中所有类型的XLog,实现XLog的拆分和重组接口。
具体的,本发明实施例中,梳理模块62对每个资源管理器RMGR的每种XLog逐一梳理,根据XLog具体数据选择不同的拆分和重组方案,实现XLog的拆分和重组接口,通过XLog的拆分和重组接口实现不同的拆分和重组方案。
拆分模块63:用于修改XLogRecordAssemble函数,根据资源管理器中XLog的类型调用对应的拆分接口,实现XLog插入LOG_BUFFER前拆分为SLog。
具体的,本发明实施例中,修改XLogRecordAssemble函数,根据资源管理器中XLog的类型调用对应的拆分接口,拆分模块63实现XLog插入LOG_BUFFER前拆分为SLog,具体XLog拆分为SLog的方法下文详细介绍。
转发模块64:用于修改LogFlush函数,根据SLog头部信息,将所述SLog转发到对应Segment所在存储节点。
具体的,本发明实施例中,SLog头部信息包括:XLog LSN:当前SLog对应原XLog的LSN,同一个XLog拆分的多个SLog的XLog LSN值相同;Segment ID:标识SLog的目标Segment;SLog ID:同一个XLog拆分的多条SLog的ID从0开始单条递增,转发模块64将SLog转发到存储层中对应Segment所在存储节点。
注册模块65:用于新增从存储节点根据指定LSN范围拉取SLog的接口,并通过XLogReaderAllocate注册以替换原有读取本地XLog文件的逻辑。
具体的,本发明实施例中,注册模块65用于新增从存储节点根据指定LSN范围拉取SLog的接口,并通过XLogReaderAllocate注册以替换原有读取本地XLog文件的逻辑,存储层中对应Segment所在存储节点在收到SLog后,去掉SLog头部,剩下的数据和XLog的格式保持兼容,所以只需要将PostgreSQL中处理XLog的相关逻辑移植到存储层并做少量适配工作即可。
另外,一些实施例中,在SLog ID还原为XLog时,可以通过XLog LSN识别属于同一个XLog的多条SLog,再通过SLog ID完成1个XLog内多个SLog的排序。最后还原的XLog可以沿用PostgreSQL中原有处理逻辑,实现对开源工具的兼容。
应理解,基于PostgreSQL原有XLog拆分为SLog的,最大程度的保留了XLog的原始格式,使得对原有的生成日志和重做日志相关逻辑的改动较小。
重新组合模块66:用于修改XLogDecodeNextRecord函数,根据SLog头部信息和资源管理器中XLog类型调用对应的重组接口,将SLog重新组合为XLog。
具体的,本发明实施例中,重新组合模块66基于SLog完全重组还原XLog的设计,可实现对社区相关生态工具的100%兼容。
应理解,本装置中日志拆分和重组的修改点集中在XLog相关的有限几个函数的设计,可最大程度减少对周边代码的侵入性。
本发明的第三方面,还提出了一种电子设备,包括:处理器和存储器;
所述处理器通过调用所述存储器存储的程序或指令,用于执行如上所述任一项所述一种WAL日志的拆分和重组的方法。
本发明的第四方面,还提出了一种计算机可读存储介质,所述计算机可读存储介质存储程序或指令,所述程序或指令使计算机执行如上所述任一项所述一种WAL日志的拆分和重组的方法。
图7是本发明实施例提供的一种电子设备的示意性框图。
如图7所示,电子设备包括:至少一个处理器701、至少一个存储器702和至少一个通信接口703。电子设备中的各个组件通过总线系统704耦合在一起。通信接口703,用于与外部设备之间的信息传输。可理解,总线系统704用于实现这些组件之间的连接通信。总线系统704除包括数据总线之外,还包括电源总线、控制总线和状态信号总线。但为了清楚说明起见,在图6中将各种总线都标为总线系统704。
可以理解,本实施例中的存储器702可以是易失性存储器或非易失性存储器,或可包括易失性和非易失性存储器两者。
在一些实施方式中,存储器702存储了如下的元素,可执行单元或者数据结构,或者他们的子集,或者他们的扩展集:操作系统和应用程序。
其中,操作系统,包含各种系统程序,例如框架层、核心库层、驱动层等,用于实现各种基础业务以及处理基于硬件的任务。应用程序,包含各种应用程序,例如媒体播放器(Media Player)、浏览器(Browser)等,用于实现各种应用业务。实现本发明实施例提供的一种WAL日志的拆分和重组的方法中任一方法的程序可以包含在应用程序中。
在本发明实施例中,处理器701通过调用存储器702存储的程序或指令,具体的,可以是应用程序中存储的程序或指令,处理器701用于执行本发明实施例提供的一种WAL日志的拆分和重组的方法各实施例的步骤。
通过资源管理器管理PostgreSQL中不同类型的XLog;
梳理资源管理器中所有类型的XLog,实现XLog的拆分和重组接口;
修改XLogRecordAssemble函数,根据资源管理器中XLog的类型调用对应的拆分接口,实现XLog插入LOG_BUFFER前拆分为SLog;
修改LogFlush函数,根据SLog头部信息,将所述SLog转发到对应Segment所在存储节点;
新增从存储节点根据指定LSN范围拉取SLog的接口,并通过XLogReaderAllocate注册以替换原有读取本地XLog文件的逻辑;
修改XLogDecodeNextRecord函数,根据所述SLog头部信息和根据资源管理器中XLog类型调用对应的重组接口,将所述SLog重新组合为XLog。
本发明实施例提供的一种WAL日志的拆分和重组的方法中任一方法可以应用于处理器701中,或者由处理器701实现。处理器701可以是一种集成电路芯片,具有信号的处理能力。在实现过程中,上述方法的各步骤可以通过处理器701中的硬件的集成逻辑电路或者软件形式的指令完成。上述的处理器701可以是通用处理器、数字信号处理器(DigitalSignal Processor,DSP)、专用集成电路(Application Specific Integrated Circuit,ASIC)、现成可编程门阵列(Field Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
本发明实施例提供的一种WAL日志的拆分和重组的方法中任一方法的步骤可以直接体现为硬件译码处理器执行完成,或者用译码处理器中的硬件及软件单元组合执行完成。软件单元可以位于随机存储器,闪存、只读存储器,可编程只读存储器或者电可擦写可编程存储器、寄存器等本领域成熟的存储介质中。该存储介质位于存储器702,处理器701读取存储器602中的信息,结合其硬件完成方法的步骤。
本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。
本领域的技术人员能够理解,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其他实施例的相关描述。
虽然结合附图描述了本发明的实施方式,但是本领域技术人员可以在不脱离本发明的精神和范围的情况下做出各种修改和变型,这样的修改和变型均落入由所附权利要求所限定的范围之内以上,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到各种等效的修改或替换,这些修改或替换都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。
以上,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到各种等效的修改或替换,这些修改或替换都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。