【问题标题】:Pgpool executes queries on standby nodes instead of master when replication is behind in standby当复制落后于备用时,Pgpool 在备用节点而不是主节点上执行查询
【发布时间】:2019-04-03 21:24:41
【问题描述】:

我有一个带有 2 个带流复制的热备用服务器的 postgresql 10 主数据库,并且复制工作正常。 synchronous_commit 设置为 remote_write

我还有一个配置了参数的 pgpool 3.7.5:

delay_threshold = 1
sr_check_period = 1

还有以下权重:

  • 主人:1
  • 节点1:3
  • 节点2:3

在日志中我可以看到 node1 和 node2 滞后:

Replication of node:1 is behind 75016 bytes from the primary server (node:0)

pgpool docs 说:

delay_threshold(整数)

指定备用服务器上对主服务器的复制延迟的最大容忍级别(以 WAL 字节为单位)。如果延迟超过这个配置的级别,Pgpool-II 会停止向备用服务器发送 SELECT 查询,并开始将所有内容路由到主服务器,即使启用了 load_balance_mode,直到备用服务器赶上主服务器。将此参数设置为 0 将禁用延迟检查。此延迟阈值检查每 sr_check_period 执行一次。默认为 0。

问题在于 pgpool 在通过流式复制从 master 获取新数据之前向热备用发送查询。

我暂时启用了log_per_node_statement = on,以便能够查看查询执行的节点,并且我可以看到查询被发送到节点,即使delay_threshold 应该避免这种情况时没有同步。

我错过了什么吗?当节点落后于主节点时,查询不应该成为主节点吗?

提前致谢。

pgpool 的其他配置值为:

num_init_children = 120
max_pool = 3
connection_cache = off
load_balance_mode = on
master_slave_sub_mode = 'stream'
replication_mode = off
sr_check_period = 1

【问题讨论】:

    标签: postgresql pgpool


    【解决方案1】:

    首先,我认为您应该检查“show pool_nodes”的结果,并检查三个节点是否正确设置了正确的角色(主、备用、备用)。

    第二,你设置了“app_name_redirect_preference_list”还是“database_redirect_preference_list”?如果是这样,那可能会影响为 SELECT 查询选择节点。

    在我看来,我认为 delay_threshold = 1 是严格的,单位是字节,就我而言,我在 PROD 上使用“10000000”。你为什么不直接放“/NO LOAD BALANCE/”注释来将特定的查询发送给只有master?

    我只是建议您将 pgpool 的版本升级到 4.0.0(2018-10-19 发布)。 3.7.x 在负载平衡上有神秘的错误。

    我也遇到了类似的问题,即使我们的配置没有问题,负载平衡在版本 (3.7.5) 上也无法正常工作。 pgpool 随机我们甚至联系了 pgpool 开发团队来解决这个问题,但他们找不到根本原因。 您可以在下面的链接中查看详细信息。

    https://www.pgpool.net/mantisbt/view.php?id=435.

    升级到 4.0.0 版后,这个问题得到了解决。

    【讨论】:

      猜你喜欢
      • 2020-08-27
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 2021-07-27
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      相关资源
      最近更新 更多