3

我尝试在 ubuntu 服务器上设置一个 pgpool 服务器,并遵循这个链接:pgpool-II 教程 [Watchdog]

但是当我启动一个 pgpool 服务时,委托的 IP 没有启动。

我在 syslog 上的日志文件中看到了类似这样的错误。

    Oct 25 08:46:25 pgpool-1 pgpool[1647]: [8-2] 2017-10-25 08:46:25: pid 1647: DETAIL:  Host:"172.16.0.42" WD Port:9000 pgpool-II port:5432 
    Oct 25 08:46:25 pgpool-1 pgpool: SIOCSIFADDR: Operation not permitted
    Oct 25 08:46:25 pgpool-1 pgpool: SIOCSIFFLAGS: Operation not permitted
    Oct 25 08:46:25 pgpool-1 pgpool: SIOCSIFNETMASK: Operation not permitted
    Oct 25 08:46:25 pgpool-1 pgpool[1648]: [18-1] 2017-10-25 08:46:25: pid 1648: LOG:  failed to acquire the delegate IP address
    Oct 25 08:46:25 pgpool-1 pgpool[1648]: [18-2] 2017-10-25 08:46:25: pid 1648: DETAIL:  'if_up_cmd' failed
    Oct 25 08:46:25 pgpool-1 pgpool[1648]: [19-1] 2017-10-25 08:46:25: pid 1648: WARNING:  watchdog escalation failed to acquire delegate IP

我将 ubuntu 14.04 与 pgpool2 版本 3.6.6-1 和看门狗版本 5.31-1 一起使用。

我已经在 pgpool.conf 上配置了这样的虚拟 IP 设置。

# - Virtual IP control Setting -
delegate_IP = '172.16.0.201'
if_cmd_path = '/sbin'
if_up_cmd = 'ifconfig eth0:0 inet $_IP_$ netmask 255.255.0.0'
if_down_cmd = 'ifconfig eth0:0 down'
arping_path = '/usr/sbin'
arping_cmd = 'arping -U $_IP_$ -w 1'

对此有何建议?感谢您的任何帮助。

4

3 回答 3

0

我的问题通过以下方法解决。

创建一个包含 ipconfig 和 arping 的目录。然后只给非root用户执行权限。

$mkdir /var/lib/pgsql/sbin
$chown postgres:postgres /var/lib/pgsql/sbin
$cp /sbin/ip /var/lib/pgsql/sbin
$cp /sbin/arping /var/lib/pgsql/sbin

运行 visudo,它会安全地编辑 sudoers 文件:

$visudo

然后在 sudoers 文件中添加这样的条目:

postgres ALL = NOPASSWD: /var/lib/pgsql/sbin/ip *, /var/lib/pgsql/sbin/arping *

接下来,创建 bash 文件(ipadd.sh、ipdel.sh、arping.sh)以使用 sudo 运行 ip 和 arping 命令。

$cat /var/lib/pgsql/sbin/ipadd.sh
#!/bin/bash
sudo /var/lib/pgsql/sbin/ip addr add $1/24 dev eth1 label eth1:0

$cat /var/lib/pgsql/sbin/ipdel.sh
#!/bin/bash
sudo /var/lib/pgsql/sbin/ip addr del $1/24 dev eth1

$cat /var/lib/pgsql/sbin/arping.sh
#!/bin/bash
sudo /var/lib/pgsql/sbin/arping -U $1 -w 1 -I eth1

$chmod 755 /var/lib/pgsql/sbin/*
$chown postgres:postgres /var/lib/pgsql/sbin/*    

在 pgpool.conf 中添加这样的条目:

delegate_IP = '10.10.10.62'
if_up_cmd = 'ipadd.sh $_IP_$'
if_down_cmd = 'ipdel.sh $_IP_$'
arping_cmd = 'arping.sh $_IP_$'
if_cmd_path = '/var/lib/pgsql/sbin'
arping_path = '/var/lib/pgsql/sbin'

然后重启 pgpool 服务。忽略你可以看到的警告如下。

警告:检查 if_up_cmd 的 setuid 位
详细信息:ifup[/var/lib/pgsql/sbin/ipadd.sh] 没有 setuid 位
警告:检查 if_down_cmd 的 setuid 位
详细信息:ifdown[/var/lib/pgsql/sbin/ ipdel.sh] 没有 setuid 位
警告:检查 arping 命令的 setuid 位
详细信息:arping[/var/lib/pgsql/sbin/arping.sh] 没有 setuid 位

停止并检查您的两个 pgpool 服务之一。

于 2019-06-11T07:04:19.257 回答
0

(注意:如果您在 Docker 容器中使用 Watchdog 运行 Pgpool-II 服务器,此答案可能会有所帮助)

我今天尝试在 Docker 容器中使用 Watchdog 设置 Pgpool-II 服务器,但遇到了几乎相同的错误(尽管我确实设置了 SUID 位,甚至尝试以 root 用户身份运行 Pgpool-II):

SIOCSIFADDR: Operation not permitted
SIOCSIFFLAGS: Operation not permitted
SIOCSIFNETMASK: Operation not permitted
pid 88: LOG:  failed to acquire the delegate IP address
pid 88: DETAIL:  'if_up_cmd' failed
pid 88: WARNING:  watchdog escalation failed to acquire delegate IP

后来我发现这是因为容器没有权限更改其网络配置,默认情况下是设计的。

然后我以特权模式运行我的 Pgpool-II Docker 容器,如下所示:

pgpool1:
    privileged: true
    image: postdock/pgpool:latest-pgpool36
    ...

错误消失了,虚拟 IP 设置正确。

于 2017-12-19T16:32:49.400 回答
0

看起来运行它的用户没有使用 ifconfig 的权限。您是否按照教程中的这些步骤进行操作?

setuid 配置

在看门狗进程中,控制虚拟IP需要root权限。您可以以 root 用户身份启动 pgpool-II。但是在本教程中,Apache 需要以 apache 用户身份启动 pgpool 并控制虚拟 IP,因为我们使用的是 pgpoolAdmin。为此,我们设置了 if_config 和 arping。此外,出于安全原因,我们不希望 apache 以外的任何用户访问命令。在 osspc19 和 osspc20 上分别执行以下命令(需要 root 权限)。

首先,创建一个包含 ipconfig 和 arping 的目录,该目录设置为 setuid。路径在 ifconif_path 和 arping_path 中指定;在本教程中,这是 /home/apache/sbin。然后只给apache用户执行权限。

$ su -
# mkdir -p /home/apache/sbin
# chown apache:apache /home/apache/sbin
# chmod 700 /home/apache/sbin

接下来,将原始 ifconfig 和 arping 复制到该目录,然后将 setuid 设置为这些。

# cp /sbin/ifconfig /home/apache/sbin
# cp /use/sbin/arping /home/apache/sbin
# chmod 4755 /home/apache/sbin/ifconfig
# chmod 4755 /home/apache/sbin/arping

请注意,上述说明仅用于教程目的。在现实世界中,您最好创建 setuid 包装程序来执行 ifconfig 和 arping。这是留给你锻炼的。

于 2017-10-25T09:43:49.297 回答