gpt4 book ai didi

postgresql - 使用 Postgres 逻辑复制槽时如何限制 WAL 大小?

转载 作者:行者123 更新时间:2023-12-03 21:59:32 24 4
gpt4 key购买 nike

我正在通过 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 复制进程未运行,我是否还必须设置任何其他属性来避免这种情况。

最佳答案

a proposal允许限制逻辑复制插槽 WAL 保留。我认为这正是您所需要的,但尚不清楚何时/是否可用。

与此同时,你所能做的就是监控情况,然后如果它开始落后太多就放弃插槽。当然,这确实意味着您以后重新建立同步会遇到问题,但没有办法解决这个问题(除了修复导致复制过程消失和/或落后的任何东西)。

既然你说 java 进程没有运行,那么删除插槽很容易。如果它正在运行,但只是没有跟上,那么你将不得不在杀死wal发送者的地方跳一段悲伤的小舞,然后尝试在它重新启动之前放下插槽(我不知道你是怎么做到的) RDS)
wal_keep_segments仅适用于物理复制,不适用于逻辑复制。它是用来代替插槽的,而不是用来补充插槽的。如果两者都有,则 WAL 将保留到 两者 符合标准。这确实是您面临的问题;逻辑复制不能像物理复制那样在不使用插槽的情况下完成。

关于postgresql - 使用 Postgres 逻辑复制槽时如何限制 WAL 大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60527214/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com