pgpool 4.1.0 healthcheck getsockopt() 检测到错误 "Connection refused"

pgpool 4.1.0 healthcheck getsockopt() detected error "Connection refused"

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

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

我已经使用物理插槽(不是 WAL 运输)设置了带有流复制的 Postgresql 集群,一切似乎都在正常工作。辅助节点连接复制数据没有任何问题。

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

当我启动 pgpool 时,在所有三个节点上,我可以看到 watchdog 正常工作,quorum 存在并且 pgpool 选择一个 master(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 healthcheck进程。我 pg1、pg2、pg3 是侦听端口 5433 上所有地址的数据库服务器,pg1 是主服务器。 pgpool 监听 5432.

用于健康检查的数据库用户是 "pgpool",我已验证我可以使用该用户从特定子网上的所有主机连接到数据库。

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

结果是 /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 等)进行检查。使用上面的主机文件导致 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 的发行版没有

127.0.1.1 hostname

记录在他们的 /etc/hosts