PG WAL 日志乱序出现 .ready问题

背景

PG 实例主备切换后,归档的时候,都是按照 0009、0010、…、0070(WAL 文件的尾号)顺序归档日志,但是归档完 0070 后,突然开始归档 0008 (正好是主备切换的 WAL),然后继续顺着 0071、0072 归档。

  • 版本:PG 12

原理介绍

PG 归档的大致原理分为以下几步:

  1. 生成 0001 WAL 文件;
  2. WAL 满/WAL 切换/CHECKPOINT 判定 0001 对应的 WAL 文件需要被归档;
  3. 生成 0001.ready 文件,并通知 archiver 进程,可以归档此 WAL;
  4. archiver 归档该 WAL,将 0001.ready 改名为 0001.done;
  5. checkpointer 进程发现 0001.done 文件已存在,判定 0001 WAL 已经归档完成,可以删除;

问题分析

实例的新主在 promote 完成时对应的 WAL 为 0008,而下一个日志是从 0009 开始写,所以后续的归档先从 0009 开始。

等到了某一个 checkpoint 时(取决于 wal_keep_segment/max_wal_size/slot 等信息),通过 KeepLogSeg 函数计算,所有早于 某个 segno 的WAL 都需要被移除掉。而 0008 此时也小于该 segno,可以被移除掉。
在这里插入图片描述
Checkpointer 进程会通过 XLogArchiveCheckDone 函数检查该 WAL 是否可以被移除:由于并没有检查到 0008.done 文件(之前没有生成过 0008.ready,自然也没有 done 文件),所以此时 checkpointer 进程会生成一个 0008.ready 文件。

这时候,archiver 进程发现 0008.ready 文件生成,就会去将其归档。因此就出现了再按照顺序归档到 0070 后,中间插了一个 0008,接着继续顺着 0071 归档。

等 0008.done 生成后,到了再下一次 checkpoint,checkpointer 进程发现此时已经有了 0008.done 文件,可以该 WAL 文件删除。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

总想玩世不恭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值