【问题标题】:Manage conflicts and lag on Postgres Replication in Hot Standby with read heavy Slave使用读取繁重的 Slave 管理 Hot Standby 中 Postgres 复制的冲突和滞后
【发布时间】:2019-12-27 00:24:37
【问题描述】:

要求:

避免terminating connection due to conflict with recovery 错误,也有可接受的replication lag

Google Cloud PostgreSQL 9.6,复制已开启(使用流式复制),PGPool-II 设置为仅进行负载平衡并在从属设备上具有以下属性:

work_mem    3276800
commit_delay    100
max_wal_size    940
max_standby_archive_delay   -1
max_standby_streaming_delay -1
hot_standby_feedback    on

机器配置

vCPU:8,内存:30 GB,SSD 存储:76 GB

工作量:

主控满载writesreads,从属也满载大量reads。 查询的最大长度可能在8-10 秒左右。

我们之前尝试过的:

  • max_standby_archive_delaymax_standby_streaming_delay 设置为900000(900 秒),但是我们看到很多conflict 错误。

  • max_standby_archive_delaymax_standby_streaming_delay 设置为-1,这使得冲突错误消失了,但是延迟增加了很多(在23mins 附近)

  • max_standby_archive_delaymax_standby_streaming_delay 设置为-1,将hot_standby_feedback 设置为on。这也使冲突错误消失了,但是我们仍然看到复制滞后(大约500 secs

用于延迟的查询:

SELECT
  pg_last_xlog_receive_location() receive,
  pg_last_xlog_replay_location() replay,
  (
   extract(epoch FROM now()) -
   extract(epoch FROM pg_last_xact_replay_timestamp())
  )::int lag;

9 hours 期间每 1 秒测量一次的延迟图表:

问题:

  1. 鉴于我们的用例(从站被积极用于读取查询,我们如何确保没有冲突错误合理的延迟(大约几秒)
  2. 滞后是什么意思?这是否意味着只有一张桌子在Master后面?或者这是否意味着所有其他 WAL 也正在等待在 Slave 上应用。
  3. 如果 1. 使用配置属性无法实现,我们如何在代码中解决它(这是最不可取的,因为代码库很大,需要进行大量更改)

谢谢!

【问题讨论】:

    标签: postgresql replication database-replication pgpool


    【解决方案1】:

    您无法完全避免冲突——像 TRUNCATEALTER TABLE 这样需要 ACCESS EXCLUSIVE 锁的每个语句都会导致复制冲突。

    但是可以避免VACUUM引起的复制冲突:

    • 设置 hot_standby_feedback = on 以防止 PostgreSQL 删除备用数据库上仍需要的元组。

    • old_snapshot_threshold 设置为非默认值(可能很高)以避免真空截断

      这种截断需要ACCESS EXCLUSIVE 锁,这也会导致冲突。

    对于剩余的冲突,您可以选择延迟申请和取消查询。或者您更改工作负载以避免ACCESS EXCLUSIVE 锁定。

    要找出阻止您的原因,您必须在 WAL 文件上使用 pg_xlogdump 并搜索 ACCESS EXCLUSIVE 锁。这将允许您确定哪个对象被锁定。要了解执行了哪种操作,请检查紧邻之前 (VACUUM?) 或紧随其后 (DDL?) 的 WAL 条目。

    【讨论】:

    • 谢谢@laurenz-albe!我们遇到的冲突主要是因为对 Replica 上的行的大量读取,这些行在 Master 上更新,而不是因为 VACUUM。当然不是因为TRUNCATE 和其他可能导致ACCESS EXCLUSIVE 的操作,因为我们根本没有更改表。此外,自动真空已打开,我们没有在工作负载中触发VACUUM。那么,我们如何避免非ACCESS EXCLUSIVE事务引起的冲突呢?
    • 没有这样的冲突。繁重的读取工作负载不会延迟复制更改的应用。也许您的延迟是由网络带宽问题引起的。
    • 网络带宽不是问题,因为延迟并不高。 Heavy read workloads won't delay the application of replication changes. 但是,当 Master 上的表发生大量写入并且在 Replica 上被大量读取时,不会引入延迟吗?为了更清楚地解释,我们有一个使用大量线程并行读取/写入的表。我们还有 PgPool,它将把所有的 writes 发送给 Master 和 reads 发送给 Master/Slave。
    • 如果机器本身完全过载,应用更改可能需要一些时间。但我不相信这一点,因为滞后峰值呈线性增长并突然下降。这表明某些东西正在阻止重播。再次检查。
    • 我在答案中添加了一些调试技巧。
    猜你喜欢
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 2019-07-21
    • 1970-01-01
    相关资源
    最近更新 更多