PostgreSQL逻辑复制取决于WAL段吗?

时间:2019-01-21 15:12:51

标签: postgresql-11 logical-replication

我成功地在2个PG 11云VM之间使用逻辑复制来获取最新数据。但是我也尝试发布一些旧表来在数据库之间传输数据,但是由于缺少WAL段而产生了奇怪的错误。

这些较旧的分区包含5-6天的数据。我在主服务器上成功发布了它们,并在逻辑副本上刷新了订阅。但是现在我在逻辑副本上收到了这些奇怪的错误消息:

2019-01-21 15:03:14.713 UTC [17203] LOG:  logical replication table synchronization worker for subscription "mysubscription", table "mytable_20190115" has finished
2019-01-21 15:03:19.768 UTC [18877] LOG:  logical replication apply worker for subscription "mysubscription" has started
2019-01-21 15:03:19.797 UTC [18877] ERROR:  could not receive data from WAL stream: ERROR:  requested WAL segment 000000010000098E000000CB has already been removed
2019-01-21 15:03:19.799 UTC [29534] LOG:  background worker "logical replication worker" (PID 18877) exited with exit code 1
2019-01-21 15:03:24.806 UTC [18910] LOG:  logical replication apply worker for subscription "mysubscription" has started
2019-01-21 15:03:24.824 UTC [18911] LOG:  logical replication table synchronization worker for subscription "mysubscription", table "mytable_20190116" has started
2019-01-21 15:03:24.831 UTC [18910] ERROR:  could not receive data from WAL stream: ERROR:  requested WAL segment 000000010000098E000000CB has already been removed
2019-01-21 15:03:24.834 UTC [29534] LOG:  background worker "logical replication worker" (PID 18910) exited with exit code 1

哪个让我感到困惑。我试图找到一些信息,但根据WAL段,没有找到有关逻辑复制的任何信息。

在该特定主服务器上没有运行流复制,并且我在仅通过逻辑复制连接的主服务器和副本服务器上都看到了这些错误消息。

我做错什么了吗?有什么特殊的方法可以发布较旧的数据吗?对于更新的数据和最新的数据,所有工作均无问题。

当然,由于我发布了约20张表,因此副本需要花费一些时间来处理所有表-目前,该表始终只能处理2张。但是我仍然不明白为什么它应该取决于WAL细分市场……非常感谢。

更新:我试图取消发布和取消订阅这些旧表,然后再次发布和订阅它们,但是对于完全相同的WAL段号仍然收到相同的错误消息。

更新2:我取消发布和取消订阅那些有问题的表,并且错误消息停止了,因此它们肯定与逻辑复制有关。难道是快照造成的?

更新3:我刚刚对WAL段错误做了一些额外的奇怪的体验-我的逻辑副本只有很小的磁盘,并且在所有这些摆弄期间我忘记了检查磁盘的使用情况。因此,逻辑副本上的postgresql由于磁盘已满而崩溃。由于我使用GCE,因此我只是调整了根磁盘的大小,并且在实例重新启动后获得了更多空间。但是我也找回了逻辑复制连接中缺少的WAL段错误。现在,我在副本上的postgresql登录充满了以下3行的顺序:

2019-01-22 09:47:14.408 UTC [1946] LOG:  logical replication apply worker for subscription "mysubscription" has started
2019-01-22 09:47:14.429 UTC [1946] ERROR:  could not receive data from WAL stream: ERROR:  requested WAL segment 000000010000099D0000007A has already been removed
2019-01-22 09:47:14.431 UTC [737] LOG:  background worker "logical replication worker" (PID 1946) exited with exit code 1

为什么逻辑复制依赖于WAL段?

1 个答案:

答案 0 :(得分:0)

所以我发现了问题所在,这要归功于pgsql常规邮件列表上的聪明人。

  1. 逻辑复制实际上取决于WAL段-https://www.postgresql.org/docs/11/logical-replication-architecture.html-使用WAL段分发更改-这就是为什么必须在主服务器上将参数“ wal_level”设置为“逻辑”的原因。

  2. 我与WAL段有关的问题是以下情况的组合:

    • 我试图一起发布和订阅我们所有的大表-作为解释,我们每天有5亿条记录,最大的表每天有约30 GB的分区,其他分区有1-5 GB
    • 在这种情况下,
    • PostgreSQL创建快照,并在激活订阅后开始将数据从快照传输到副本。只有在传输了整个快照之后,walsender才会开始发送WAL日志以获取最新更改
    • 自从我一次连续几天发布200 GB的数据以来,您可以想象传输要花很长时间-传输时会创建2个新的逻辑复制插槽,并使用2个walsender将数据传输到副本。
    • 通常可以正常工作,但是我们有紧急cronjob,它会删除太过时的WAL日志,因为过去我们遇到了磁盘已满的问题。这就是我遇到的问题-紧急cronjob删除了尚未传输到副本的WAL段。因此,通常需要有足够的磁盘空间来存储,以便能够存储比正常情况更多的WAL日志。我们以前没有的-但是我更改了它。
  3. 来自pgsql-general的
  4. Jeremy Finzel建议我实际上应该使用不同的方法从master复制数据-一次只发布和订阅一个表,并给复制时间同步数据。我做了,现在逻辑复制就像一个咒语一样……