我正在创建复制插槽,并通过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磁盘将关闭RDS。
我以为wal_keep_segments会处理这个设置为32的问题。但是它没有用。即使没有运行Java复制过程,我是否还需要设置其他属性来避免这种情况。
[wal_keep_segments
与逻辑解码无关。
使用逻辑解码,您始终必须使用逻辑复制插槽,这是一种标记事务日志(WAL)中位置的数据结构,因此服务器永远不会丢弃逻辑解码可能会破坏的旧WAL段。仍然需要。
这就是为什么如果不使用更改,您的WAL目录就会增加的原因。
wal_keep_segments
指定要保留的旧WAL段的数量minimum。它用于流复制,pg_receivewal
或pg_rewind
等目的。
wal_keep_segments指定PostgreSQL应在pg_xlog
目录中保留的段的[[minimum)数。 PostgreSQL不删除段的原因可能有几个:在WAL位置比WAL文件更早的位置有一个复制插槽,您可以使用以下查询检查它:
SELECT slot_name,
lpad((pg_control_checkpoint()).timeline_id::text, 8, '0') ||
lpad(split_part(restart_lsn::text, '/', 1), 8, '0') ||
lpad(substr(split_part(restart_lsn::text, '/', 2), 1, 2), 8, '0')
AS wal_file
FROM pg_replication_slots;
- WAL存档已启用,并且
archive_command
失败。请检查这种情况下的PostgreSQL日志。