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太高
调高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_timeout和max_wal_size的配置值, 提高checkpoint触发的次数。
同时设置wal_writer_delay和wal_writer_flush_after, 调整为一个合理值。