RDS PostgreSQL WAL 日志堆积可能是因为如下几个原因导致的:
一、Replication Slot
1. 存在 INACTIVE 状态的 Replication Slot时,可能会导致 WAL 日志不断堆积,从而打满磁盘。您可以在 WAL 日志管理页签看到所有 Replication Slot 相关信息,您也可以通过执行 SQL 命令:select * from pg_replication_slots where active='f'; 查看 INACTIVE 状态的 Slot。
如果您还需要这个逻辑订阅,可以找到对应的逻辑订阅消费 WAL 的客户端,并重启客户端。之后再次通过 WAL 日志管理页签查看或者 SQL 查看 Replication Slot 的逻辑订阅状态会变为 't'。
如果
不需要这个逻辑订阅,您可以在 PGSever 上删除该 Slot: select pg_drop_replication_slot(''); ,您也可以在
WAL 日志管理页签删除 INACTIVE 状态的 Replication Slot。
更多详情请参见
WAL 日志管理。
2. ACTIVE Replication Slot 如果消费 WAL 日志的客户端上传消费位点信息延迟,有可能导致 WAL 堆积。您可以通过如下方式进行排查:
a. select coalesce(max(pg_wal_lsn_diff(pg_current_wal_flush_lsn(), restart_lsn)),0) as max_slot_wal_delay from pg_replication_slots where restart_lsn is not null;
您可以通过该 SQL 查询 WAL 的最大延迟,如果结果较大,则有可能是因为客户端上传消费位点信息延迟。
b. restart_lsn 是 消费 WAL 日志的客户端上报的。如果 restart_lsn 不向前推进,就会wal堆积。 在 restart_lsn 之后的 WAL PGServer 要保留,来确保PGServer 不会提前删除订阅客户端还没有消费的 WAL。
如果是因为消费 WAL 日志的客户端上传消费位点信息延迟导致的 WAL 的堆积,可以通过加消费位点信息上传的频率以及优化消费客户端的性能等方式进行优化。
二、参数设置不合理
wal_keep_segments (版本12.0之前):控制了在主数据库上保留 WAL 文件的数量。如果设置得过高,则可能会导致磁盘空间被用尽,因为过多的 WAL 文件被保留,因此需要合理配置此参数。wal_keep_segments 推荐值为 128。 更多信息可以参见
Postgresql 官方文档。如何修改参数,可以查看官方文档
设置实例参数。
wal_keep_size (版本12.0之后):控制在主服务器上保留 WAL 文件的总大小。如果设置得过高,则可能会导致存储过多的 WAL 文件,从而导致磁盘空间不足或性能下降,因此需要合理配置此参数。wal_keep_size 推荐值为 2048。 更多信息可以参见
Postgresql 官方文档。如何修改参数,可以查看官方文档
设置实例参数。
max_wal_size:WAL日志的最大大小,如果设置过大,则可能会导致WAL日志堆积。max_wal_size 推荐值为
{LEAST(GREATEST(DBInstanceClassMemory/2097152, 2048), 16384)}。 更多信息可以参见
Postgresql 官方文档 。如何修改参数,可以查看官方文档
设置实例参数。
min_wal_size:用于控制保留 WAL日志文件的最小大小,如果设置过大,可能会导致WAL日志的堆积。min_wal_size 推荐值为
{LEAST(GREATEST(DBInstanceClassMemory/8388608, 256), 8192)}。更多信息可以参见
Postgresql 官方文档 。如何修改参数,可以查看官方文档
设置实例参数。