控制WAL日志的数量由这三个参数控制:

  • max_wal_size
  • min_wal_size
  • wal_keep_segments

而到PG13版本wal_keep_segments改为了wal_keep_size来控制。

假设pg_wal下的文件为:

  1. 000000A7000000040000005A
  2. 000000A7000000040000005B
  3. 000000A7000000040000005C
  4. 000000A7000000040000005D
  5. 000000A7000000040000005E
  6. 000000A7000000040000005F
  7. 000000A70000000400000060
  8. 000000A70000000400000061
  9. 000000A70000000400000062
  10. 000000A70000000400000063
  11. 000000A70000000400000064

假设当前正在写的WAL文件为000000A70000000400000060,则wal_keep_segments控制000000A7000000040000005A到000000A70000000400000060的个数,
而min_wal_size控制000000A70000000400000060到000000A70000000400000064,即这一段至少要保留min_wal_size的WAL日志。
如果min_wal_size + wal_keep_segments 大于了max_wal_size,那么WAL日志空间至少也会占用:min_wal_size + wal_keep_segments。

如果min_wal_size + wal_keep_segments小于max_wal_size,那么WAL日志空间尽量保持在max_wal_size。

所以从这个原理来说:min_wal_size不需要设置太大,生产库只需要为1G左右大小时就够用了,不需要太大。

而为了防止备库同步失败,应该设置一个较大的wal_keep_segments,WAL文件为16M大小,可把wal_keep_segments设置为500或更大。

然后把max_wal_size比 min_wal_size + wal_keep_segments略大一点就可以了。

而参数max_wal_size也会控制checkpoint发生的频繁程度:

  1. target = (double) ConvertToXSegs(max_wal_size_mb) / (2.0 + CheckPointCompletionTarget);

如果checkpoint_completion_target设置为0.5时,则每写了 max_wal_size/2.5 的WAL日志时,就会发送一次checkpoint。

checkpoint_completion_target的范围为0~1,那么结果就是写的WAL的日志量超过: max_wal_size的1/3~1/2时,就会发生一次checkpoint。

0 评论  
添加一条新评论