我正在通过 JDBC 驱动程序创建从 AWS Postgres RDS 到 java 进程的复制槽和流式更改。
我的复制槽创建代码如下所示。
final ReplicationSlotInfo replicationSlotInfo = pgConnection.getReplicationAPI()
.createReplicationSlot()
.logical()
.withSlotName(replicationSlotName)
.withOutputPlugin("wal2json")
.make();
我使用以下代码获得复制流。
pgConnection.getReplicationAPI()
.replicationStream()
.logical()
.withSlotName(replicationSlotName)
.withSlotOption("include-xids", true)
.withSlotOption("include-timestamp", true)
.withSlotOption("pretty-print", false)
.withSlotOption("add-tables", "public.users")
.withStatusInterval(10, TimeUnit.SECONDS)
.start()
当复制器 java 进程未运行时,WAL 大小会增加。这是我用来查找复制滞后的查询。
SELECT
slot_name,
pg_size_pretty(pg_xlog_location_diff(pg_current_xlog_location(), restart_lsn)) AS replicationSlotLag,
active
FROM
pg_replication_slots;
输出:
slot_name replicationslotlag active
data_stream_slot 100 GB f
这种复制延迟会超过 RDS 磁盘,这会关闭 RDS。
我以为wal_keep_segments会解决这个问题,它设置为 32。但它没有用。是否有任何其他属性我必须设置以避免这种情况,即使 Java 复制进程没有运行。