问题描述

PG10.3 配置主从同步流复制:1主+1从,主从节点的的参数wal_keep_segments = 10 。
主节点频频插入数据,在从节点的pg_wal目录下有时候会有40多个WAL文件。

背景

主节点做checkpoint时,会把checkpoint的信息也写到WAL日志中。其中的checkpoint.redo记录了当时的LSN,执行checkpoint操作的目的就是保证checkpoint.redo之前的数据改动都落盘。

从节点端读取WAL,做数据恢复时,会记录从WAL中读到的最近两次checkpoint:
– checkpoint_new表示最近的一次
– checkpoint_old表示比checkpoint_new更早的一次

从节点端在做恢复时,也会做checkpoint,内部叫做restartpoint, 即把数据落盘,但是不会在WAL中产生新的checkpoint记录。

从节点只有做checkpoint时才会删掉/重用已有的WAL文件,如果不做checkpoint,则WAL文件持续增加。

从节点做checkpoint时,保留多少个WAL文件呢?

包含很多情况,每一种情况下有不同的计算公式。 这里举例一种情况,该情况会保留很多的WAL文件。

处理逻辑举例:
wal_keep_segments = 10 #默认保留10个WAL文件。
max_wal_size = 1GB #转换到WAL文件数:1G/16M=64个WAL文件

checkpoint_old.redo表示主节点上次checkpoint时候,已经落盘的数据对应的LSN+1,
checkpoint_old.redo对应的WAL文件保留,更早的WAL文件称作“可删除WAL文件”,被删除或重用。

每一个WAL文件都有一个唯一的序号,PG内部使用这个序号。给定的LSN,计算LSN/16M(取模),得到WAL文件序号。序号最终会对应到WAL文件名。

如果从节点当前最新的WAL文件序号是cur_no, checkpoint_old.redo对应的WAL文件序号是old_no,那么old_no-1以及之前的WAL文件统统删掉/重用。保留的文件数量是keep_num=cur_no - old_no + 1,这个数可能会很大。如果keep_num < wal_keep_segments,例如:keep_num=5, wal_keep_segments=10,则old_no-6以及之前的WAL文件被删掉或重用。

重用多少个文件呢?

也是有几种不同的情况,每一种情况下,其计算方式不同。

简单的一种情况: 比old_no-1老的10个“可删除WAL文件”被重命名成10个未来的WAL文件,剩余的“可删除WAL文件”删掉。

一种复杂的计算方式是:
max_wal_size=1G, 转换成WAL文件数量: max_num = max_wal_size/16M = =64
如果 reuse_num =(old_no + max_num ) - cur_no, 如果reuse_num>0,
则要把reuse_num个“可删除WAL文件”重命名为未来的WAL文件,其它的“可删除WAL文件”删掉。

主节点WAL文件数量

在主节点,pg_wal目录下的WAL文件数量遵循类似的规律,也会有多于wal_keep_segments个文件。