当复制处于备用状态时,Pgpool在备用节点而不是主节点上执行查询

时间:2018-10-30 18:49:50

标签: postgresql pgpool

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

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

delay_threshold = 1
sr_check_period = 1

以及以下权重:

  • 主人:1
  • node1:3
  • node2:3

在日志中,我可以看到node1和node2处于滞后状态:

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

pgpool docs说:

  

delay_threshold(整数)

     

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

问题在于pgpool在热备份通过流复制从主数据库获取新数据之前将查询发送到热备份。

我暂时启用了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

1 个答案:

答案 0 :(得分:0)

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

第二秒,您是否设置了“ app_name_redirect_preference_list”或“ database_redirect_preference_list”?如果是这样,那可能会影响选择用于SELECT查询的节点。

在我看来,我认为delay_threshold = 1是严格的,单位是字节,在我的情况下,我在PROD上使用“ 10000000”。为什么不只添加“ / 无负载平衡 /”注释以将特定查询发送给仅主服务器?

我只是建议您将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版,可以像魅力一样解决此问题。