GaussDB(DWS)高可用之备机重建

举报
K______ 发表于 2020/06/20 15:26:36 2020/06/20
【摘要】 DWS的多实例在主机故障时,会发生failover,但对于主备机这种分布式架构,必然会有数据同步的时延,这种时延就会产生如下主备机日志分叉的问题(可以参考该贴日志分叉部分https://bbs.huaweicloud.com/forum/thread-60315-1-1.html):对于支持UNDO的数据库来说,可以通过UNDO日志将原主机分叉的部分回退到分叉前的一条wal日志,然后接上新主...

DWS的多实例在主机故障时,会发生failover,但对于主备机这种分布式架构,必然会有数据同步的时延,这种时延就会产生如下主备机日志分叉的问题

(可以参考该贴日志分叉部分https://bbs.huaweicloud.com/forum/thread-60315-1-1.html):

对于支持UNDO的数据库来说,可以通过UNDO日志将原主机分叉的部分回退到分叉前的一条wal日志,然后接上新主继续从不分叉的地方开始做wal日志同步,但是对于PG这类不支持UNDO的系统来说,这部分数据需要通过特殊的方式来处理,这种操作叫做增量重建(思路类似于社区的pg_rewind,但略有不同)。

image.png

增量重建的基本的原理如下:

分为以下几类数据:

part1、从分叉点开始,原主机自己生成的wal日志对应的数据,这部分通过反解wal日志,记录下wal对应的数据页,并从新主机同步

part2、原主机的数据文件和新主机的数据文件的列表做差异化比较 ,“拉齐”和新主机的数据

image.png

以上数据部分同步后,相当于将原主对齐到新主机的一个时间点,并将原主机wal日志重新拉回到同一条wal日志线上。

最后关键的一步,就是原主机作为备角色启动后,需要继续追赶在重建过程中的delta数据(整个重建过程中,新主机仍然在做业务),确保最终的一致性。


再来解答一下之前有个同学咨询的关于拉齐的原则,这里实际是按照物理文件来处理的,处理的方式是基于size,对于size不一样的文件,会做不同的处理,一般原则如下:

(以local作为本地要做build的节点,而remote代表要从远端同步数据的节点为例)

1)对于local_file_size < remote_file_size时,说明对应的表有新增的数据,此时需要将local_file做copy_tail的动作

2)对于local_file_size > remote_file_size时,由于有mvcc的机制,说明远端的表可能做过vacuum,因此对于tuple的位置均发生的变化,此时,需要先将本地的文件全部truncate掉,然后从远端copy完整文件到本地

3)对于从分叉点解析的本地做过modify的页,则单独标记出来,按照页copy的方式,从remote侧进行页copy。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。