PostgreSQL逻辑复制--常见坑点

PostgreSQL逻辑复制中几个常见的坑点,比如磁盘空间用光,CPU被打满。

坑点1: 磁盘空间耗尽

刚使用逻辑复制时,常见到的错误和异常,一般来说导致该异常的原因是subscriber异常退出,但建立的logical slot一直还在,没有删除,导致**$PGDATA/pg_wal**目录占用的磁盘空间不断增长。

方法一

要临时性解决,那就删除对应的slot, 以debezium为例

select pg_drop_replication_slot('debezium');

方法二

设置slot wal允许占用的最大磁盘空间

max_wal_slot_keep_size = 133143986176 #124GB

在启动逻辑复制之后,需要对slot的状态以及pg_wal占用的磁盘空间进行监控,设置好相应的告警以及时排障。

坑点2: CPU Usage太高

testing

调高logical_decoding_work_mem值,减少解码后的内容写入到磁盘的次数,默认值是64MB, 可以设置成远高于work_mem的值,注意每个slot会使用一个独立的buffer。

logical_decoding_work_memo=1024MB

如果要同步的内容很多,尽量用多个slot来进行逻辑同步,每个slot同步一部分表的变更。 max_wal_sender控制可以并发同步的数量。

调整同步的变更类型,默认会同步insert, update, delete, 下述sql语句只同步insert带来的变更,忽略update和delete.

alter publication pg_pub_demo set(publish='insert');

坑点3: 同步延迟较大

减少checkpoint_timeoutmax_wal_size的配置值, 提高checkpoint触发的次数。

同时设置wal_writer_delaywal_writer_flush_after, 调整为一个合理值。