pgpool 4.1.0 healthcheck getsockopt()检测到错误“连接被拒绝”

时间:2020-01-13 15:21:56

标签: postgresql high-availability pgpool

我正在尝试为Postgresql流复制群集设置pgpool负载均衡器。

我正在Debian 10.2(最新的稳定版)上使用来自Postgresql存储库https://apt.postgresql.org/pub/repos/apt/的postgresql-12和pgpool2-4.1.0。

我已经设置了Postgresql集群,并使用物理插槽(而不是WAL装运)进行了流复制,并且一切似乎都正常运行。辅助数据库连接复制数据没有任何问题。

然后我在同一台服务器上安装了pgpool2-4.1.0。我已经根据pgpool Wiki对pgpool.conf进行了适当的修改,并且启用了看门狗进程。

当我在所有三个节点上启动pgpool时,都可以看到看门狗工作正常,仲裁存在,并且pgpool选出了一个主节点(pgpool节点),该主节点也从配置中启用了虚拟IP。

我可以通过pgpool连接到postgres后端,并成功发出读写命令。

问题出现在pgpool日志中,从syslog中我得到:

Jan 13 15:10:30 debian10 pgpool[9826]: 2020-01-13 15:10:30: pid 9870: LOG:  failed to connect to PostgreSQL server on "pg1:5433", getsockopt() detected error "Connection refused"

Jan 13 15:10:30 debian10 pgpool[9826]: 2020-01-13 15:10:30: pid 9870: LOCATION:  pool_connection_pool.c:680

在检查上述PID时,我得到了pgpool运行状况检查过程。一世 pg1,pg2,pg3是侦听端口5433上所有地址的数据库服务器,pg1是主要的。 pgpool收听5432。

用于运行状况检查的数据库用户是“ pgpool”,我已经验证可以使用该用户从特定子网上的所有主机连接到数据库。

当我禁用健康检查时,问题就消失了,但失败了。 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

原来是/ etc / hosts文件和postgresql.conf中的名称解析。

具体地说,/ etc / hosts是这样的:

vagrant@pg1:~$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 pg1
....
10.10.20.11 pg1
....

像这样的postgresql.conf:

....
listen_addresses = 'localhost,10.10.20.11' # what IP address(es) to listen on;
....

因此,当healthcheck尝试到达每台计算机上的本地节点时,它将通过主机名(pg1,pg2等)进行检查。使用上面的hosts文件导致127.0.1.1,postgresql无法监听,因此它将失败,从而导致错误,然后尝试10.10.20.11将会成功。这也解释了为什么远程主机的运行状况检查没有错误。

我将主机文件更改为以下文件:

vagrant@pg1:~$ cat /etc/hosts
127.0.0.1 localhost
127.0.1.1 pg1-local
....
10.10.20.11 pg1
....

日志已清除。

这是Debian特有的,因为基于Red Hat的发行版没有a

127.0.1.1 hostname

在其/ etc / hosts中记录