PostgreSQL - 无法在pgpool 2上启动委托IP地址

时间:2017-10-25 09:23:23

标签: postgresql high-availability watchdog pgpool virtual-ip-address

我尝试在ubuntu服务器上设置一个pgpool服务器并关注此链接:pgpool-II Tutorial [ 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。

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

# - 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'

对此有何建议?谢谢你的帮助。

3 个答案:

答案 0 :(得分:0)

看起来运行它的用户没有权限使用ifconfig。 您是否关注了教程中的those steps

  

setuid配置

     

在监视程序进程中,需要root权限来控制虚拟IP。   你可以以root用户身份启动pgpool-II。但是在本教程中,   Apache需要以apache用户身份启动pgpool并控制虚拟IP   因为我们正在使用pgpoolAdmin。为此,我们setuid   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。这留给你锻炼。

答案 1 :(得分:0)

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

我今天尝试在Docker容器中使用Watchdog设置Pgpool-II服务器,我得到了几乎相同的错误(虽然我做set the SUID bit甚至尝试以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设置正确。

答案 2 :(得分: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服务之一。