postgresql:在某些备用服务器上重放流式 WAL 文件很慢

rsm*_*thy 5 postgresql replication

环境:Postgresql 9.6.21。由patoni管理的多台备用服务器

+ Cluster: db11     (12345678901234567) ------+---------+-----+-----------+
| Member        | Host         | Role         | State   |  TL | Lag in MB |
+---------------+--------------+--------------+---------+-----+-----------+
| db11-01       | db11-01      | Leader       | running | 113 |           |
| db11-02       | db11-02      | Sync Standby | running | 113 |         0 |
| db11-03       | db11-03      | Sync Standby | running | 113 |         0 |
| db11-04       | db11-04      | Sync Standby | running | 113 |         8 |
+---------------+--------------+--------------+---------+-----+-----------+
Run Code Online (Sandbox Code Playgroud)

一些 pg_settings 值:

          name               |              setting                                   
-----------------------------+-------------------------------------------------
 synchronous_commit          | on
 synchronous_standby_names   | 3 ("db11-02","db11-04","db11-03")
 max_standby_streaming_delay | 100
 hot_standby_feedback        | on
Run Code Online (Sandbox Code Playgroud)

我们尝试将同步待机的数量从 1 更改hot_standby_feedback为3。尝试更改为off

问题:重播延迟(正是这个 - pg_xlog_location_diff(pg_last_xlog_receive_location(), pg_last_xlog_replay_location()))在不同的备用服务器上有所不同。在上述设置中,db11-04具有最低的重播延迟,其次是db11-02并且db11-03具有最高的重播延迟。在备用服务器的任何不同组合中。

在任何备用服务器上都没有发出任何查询(除了在所有服务器上db11-04进行监控的查询和对小型测试表的连续选择查询以再次进行监控)。

在任何不同的服务器组合中,db11-04 始终具有最低的复制延迟,然后是 db11-02,而 db11-03 具有最高的复制延迟。这是一个测试环境,我们可以处理这些服务器,但想了解导致某些服务器行为不同的原因。

重播延迟(接收到重播

关于问题的补充说明:

  1. 我们尝试synchronous_standby_names使用不同的服务器顺序和不同数量的服务器进行修改。包括价值"db11-04"
  2. 这些服务器db11-02db11-03已擦拭干净,重新FS和从头副本-假设有一个与FS碎片整理问题
  3. 操作系统是 Centos 7,FS 大小 (ext4) 是 10TB,所有服务器都在 AWS 上使用 r5d.4xlarge(16 个 CPU,128GB RAM)
  4. 所有服务器上的时间漂移​​都在毫秒之内。
  5. 测试设置涉及创建中等写入负载,每分钟生成 200 多个 WAL 文件。
  6. CPU 负载非常低,所有备用服务器上的负载平均徘徊在 2 左右。磁盘 IO 完全在限制范围内。

这两个系统上的大量复制滞后导致使用synchronous_commitas 的事务出现问题remote_apply

题:

  1. 什么会导致不同服务器上的不同重播时间?这是一个受控的测试环境,正如我所说,备用服务器上没有真正的查询。
  2. 我们应该查看 postgres 级别的哪些参数?

更新 1:

  1. pg_stat_database_conflicts所有数据库显示0

Lau*_*lbe 0

我不会将每分钟 200 个 WAL 段(超过 3 GB,如果默认段大小为 16MB)称为“中等”。重放 WAL 信息的单个线程很可能是瓶颈 \xe2\x80\x93,但这并不能解释备用服务器之间的差异。

\n

要调试该问题,请设置max_standby_streaming_delay为 0 或 1 等较低值,然后查看是否出现复制冲突。如果是,则表明最有可能的延迟原因,并且您必须调查备用服务器工作负载的差异。

\n