【问题标题】:PostgreSQL - Fail to start delegate ip address on pgpool 2PostgreSQL - 无法在 pgpool 2 上启动委托 IP 地址
【发布时间】:2018-04-06 07:40:36
【问题描述】:

我尝试在 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。

我已经在 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'

对此有什么建议吗?感谢您的帮助。

【问题讨论】:

  • 有什么解决办法吗?

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


【解决方案1】:

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

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。这是留给你练习的。

【讨论】:

  • 我尝试再次执行此步骤,但得到相同的结果。
【解决方案2】:

(注意:如果您在 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设置正确。

【讨论】:

    【解决方案3】:

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

    创建一个包含 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 服务之一。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      • 1970-01-01
      • 2015-01-04
      • 2020-06-09
      • 1970-01-01
      • 2020-03-01
      • 2011-11-21
      相关资源
      最近更新 更多