基于OpenGauss平台的XLOG日志压缩方法与流程

文档序号:34010032发布日期:2023-04-29 22:05阅读:118来源:国知局
基于OpenGauss平台的XLOG日志压缩方法与流程

本发明属于xlog日志压缩,尤其涉及一种基于opengauss平台的xlog日志压缩方法及系统。


背景技术:

1、write-ahead logging是一种保证数据完整性的标准方法。简单地说,wal的概念就是对数据文件的改变(包括表和索引)必须先写入日志,即日志记录刷新到永久储存之后,才能被改写。遵循这个过程,就不需要在每个事务提交时都刷新数据页到磁盘,因为在宕机时可以用日志来恢复数据库:任何没有应用到数据页上的改动都可以根据日志记录重做(即回滚恢复redo)。

2、由此可以看出,使用wal可以显著减少写磁盘的次数,因为只需要把日志文件刷新到磁盘就可以保证事务被提交,而不需要把事务改动过的每一个数据文件都刷新到磁盘。由于日志文件是连续写的,所以同步log的花销远小于刷新数据页的花销,特别是服务器要处理涉及数据存储不同部分的大量小事务时更是如此。另外,当服务器在处理大量并行小事务时,log文件一次fsync就可以提交多个事务。

3、技术人员发现,当xlog记录写入数据量过大或者过于频繁时,磁盘写入io数据量过大,在发送xlog日志时网络io负担较大,而在xlog数据落盘前对记录进行压缩可以很好地避免的这个问题。

4、opengauss作为一款开源关系型数据库管理系统,其内核源自postgresql,在opengauss中,可以通过设置wal_compression=enable启用wal压缩:使用lz压缩方法对带有整页镜像的xlog记录进行压缩。在这种情况下,会添加xlogrecordblockcompressheader结构。该功能有两个优点与一个缺点,优点是降低写入记录的i/o开销,并减小wal段文件的消耗量;缺点是会消耗更多的cpu资源来执行压缩操作,而且对于整页镜像以外的其他类型xlog记录无法进行压缩。

5、针对上述问题,目前尚未提出理想的解决方案。


技术实现思路

1、为了克服opengauss平台中xlog日志压缩方法存在的cpu资源消耗过大、且对于整页镜像以外的其他类型xlog记录无法进行压缩的不足,我们提出了一种解决方案。

2、本发明提出了一种新的基于opengauss平台的xlog日志压缩方法,我们在原有xlog的基础上,通过xlog压缩,使得在xlog落盘时降低磁盘io,同时减少对磁盘空间的占用,在发送xlog日志时还可减少网络io。

3、opengauss已经提供使用lz压缩方法对带有整页镜像的xlog记录(xlog日志数据)进行压缩的方法,本发明方法针对的压缩单位为单条xlog记录。在每条xlog记录中,将结构体xlogrecord中的xl_tot_len的最高位作为标记位,如果标记位为1,则表示这是一个压缩的xlog记录;如果标记位为0,则表示这是一个未被压缩的xlog记录。在代码中所有使用到xl_tot_len的地方都需要使用掩码,排除最高位造成的影响。

4、压缩时,只对xlog记录头部后的数据(实际数据节点的数据)进行压缩,在xlogrecordassemble函数将所有注册的需要落盘的xlog信息连接到链表中后,把所有数据拷贝到一块内存中,对数据进行压缩并生成一个新的节点替换掉原有的所有节点,然后在xlog record header中设置标记位,将xl_tot_len的最高位标记为1。

5、解压时,只对xlog记录头部后的数据进行解压,在xlogreadrecord函数读完单条xlog记录后,会把数据保存在一块内存中,先判断这条xlog记录的xl_tot_len的最高位是否为1,如果为1,说明这是条被压缩过的xlog记录,需要进行解压,并将解压后的数据拷贝回之前的内存中;如果为0,则不需要进行任何操作。

6、具体而言,第一方面,本发明提供了一种基于opengauss平台的xlog日志压缩方法,包括:

7、s1.将xlog日志数据组装成wal记录并保存在链表中,组装成的wal记录包括头部信息节点和实际数据节点;

8、s2.将链表中wal记录的实际数据节点的数据拷贝到一块内存中;

9、s3.对内存中的实际数据节点数据进行压缩并生成一个新的节点;

10、s4.利用上步获得的新节点替换原有的wal记录的实际数据节点,并在头部信息节点(xlog record header)中设置标记位;

11、s5.在xlog日志数据读取前,先对其wal记录头部信息节点中的标记位进行识别;

12、s6.当头部信息节点中的标记位显示为压缩数据时,对该数据进行解压,并将解压后的数据拷贝到内存中替代原有的压缩数据。

13、进一步地,本发明基于opengauss平台的xlog日志压缩方法步骤s1中所述将xlog日志数据组装成wal记录并保存在链表中,包括:

14、s11.在注册xlog日志数据时,先调用xlogbegininsert函数进入注册状态;

15、s12.调用xlogregister中的注册函数将xlog日志数据注册到缓冲区中;

16、s13.通过函数xlogrecordassemble将所有注册到缓冲区中的数据组装成wal记录;

17、s14.将wal记录保存在链表中。

18、进一步地,本发明基于opengauss平台的xlog日志压缩方法步骤s3中所述对内存中的实际数据节点数据进行压缩并生成一个新的节点,其中使用的压缩方法为opengauss中提供的lz压缩方法。

19、进一步地,本发明基于opengauss平台的xlog日志压缩方法步骤s4中所述在头部信息节点中设置标记位,包括:

20、s41.将xlog日志中结构体xlogrecord中的xl_tot_len的最高位作为标记位;

21、s42.若xlog日志数据未被压缩,将xl_tot_len的最高位标记为0;

22、s43.若xlog日志数据已被压缩,将xl_tot_len的最高位标记为1。

23、进一步地,本发明基于opengauss平台的xlog日志压缩方法步骤s5中所述在xlog日志数据读取前,先对其wal记录头部信息节点中的标记位进行识别,包括:

24、s51.读取xlog日志数据前,xlogreadrecord函数循环调用readpageinternal读取xlog页面信息至一块内存中;

25、s52.在该内存中搜寻到xlog日志数据的位置,并生成xlogrecord;

26、s53.识别并判断xlogrecord中的标记位。

27、进一步地,本发明基于opengauss平台的xlog日志压缩方法步骤s6中所述对该数据进行解压,并将解压后的数据拷贝到内存中替代原有的压缩数据是指调用解压算法对xlog日志数据wal记录中实际数据节点的压缩数据进行解压,再将解压后的数据拷贝到之前的内存中替代原有的实际数据节点的压缩数据。

28、第二方面,本发明提供了一种基于opengauss平台的xlog日志压缩系统,本系统包括:

29、记录组装模块:用于将xlog日志数据组装成wal记录并保存在链表中,组装成的wal记录包括头部信息节点和实际数据节点;

30、函数管理模块:用于管理和调用xlogbegininsert函数、xlogregister函数、xlogrecordassemble函数、xlogreadrecord函数;

31、压缩模块:用于压缩数据并生成新的节点;

32、标记位设置模块:用于在wal记录的头部信息节点中设置标记位;

33、标记位识别模块:用于识别标记位信息;

34、解压模块:用于对数据进行解压。

35、第三方面,本发明还提供了一种计算机可读存储介质,所述存储介质上存储有计算机程序,所述程序被处理器执行时实现上述的基于opengauss平台的xlog日志压缩方法的步骤。

36、综上,本发明提出了一种新的基于opengauss平台的xlog日志压缩方法,我们在原有xlog的基础上,通过xlog压缩,使得在xlog落盘时降低磁盘io,同时减少对磁盘空间的占用,在发送xlog日志时还可减少网络io。经测试,在利用本方法开启xlog压缩的情况下,压缩率能达到21.8%左右,cpu性能会下降0.9%,io性能会提升200%,可见,使用本方法有助于更好地发挥数据库性能,显著提升数据库工作效率。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1