【发布时间】:2023-03-27 15:09:01
【问题描述】:
我正在创建复制槽并通过 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 复制进程没有运行。
【问题讨论】:
-
在 Postgres 13 中,您现在可以limit 为复制槽保留 WAL 的大小
标签: postgresql jdbc replication logical-replication