背景:收到告警,磁盘空间90%多
登录主机发现,生成了大量的wal归档日志
通过 pg_waldump -z 查看wal日志信息
发现FPI占比达到97%多(也就是说WAL至少被放大了30多倍)
在应用的写负载不变的情况下,减少WAL生成量主要有下面几种办法。
延长checkpoint时间间隔
FPI产生于checkpoint之后第一次变脏的page,在下次checkpoint到了之前,已经输出过PFI的page是不需要再次输出FPI。因此checkpoint时间间隔越长,FPI产生的频度会越低。增大checkpoint_timeout和max_wal_size可以延长checkpoint时间间隔。
增加HOT_UPDATE比例
普通的UPDATE经常需要更新2个数据块,并且可能还要更新索引page,这些又都有可能产生FPI。而HOT_UPDATE只修改1个数据块,需要写的WAL量也大大减少。
压缩
PostgreSQL9.5新增加了一个wal_compression参数,设为on可以对FPI进行压缩,削减WAL的大小。另外还可以在外部通过SSL/SSH的压缩功能减少主备间的通信流量,已经自定义归档脚本对归档的WAL进行压缩
这里通过增大archive_timeout来延长checkpoint时间
patronictl -c /iddbs/patroni/postgres6.yml edit-config archive_timeout 由300改成1800 问题解决