无法使用 pgpool II 自动恢复失败的 postgresql 主节点

Posted

技术标签:

【中文标题】无法使用 pgpool II 自动恢复失败的 postgresql 主节点【英文标题】:Automatic recovery of the failed postgresql master node is not working with pgpool II 【发布时间】:2016-09-07 17:00:45 【问题描述】:

我是 Postgresql 和 Pgpool II 设置的新手。我已经使用 Pgpool 和 Repmgr 配置了 Postgresql HA/负载平衡。

The setup consist of 3 nodes and verison of Application and OS is as mentioned below:  
**Pgpool node** => 192.168.0.4, **Postgresql Nodes** => 192.168.0.6, 192.168.0.7   
**OS version** => CentOS 6.8 (On all the 3 nodes)  
**Pgpool II version** =>  pgpool-II version 3.5.0 (ekieboshi).  
**Postgresql Version** => PostgreSQL 9.4.8  
**Repmgr Version** => repmgr 3.1.3 (PostgreSQL 9.4.8)  

我已按照link 进行设置。

当我关闭主节点时,故障转移成功发生,从节点接管为新的主节点。 故障转移后,我必须手动恢复故障节点并将其与新的主节点同步。

我想自动化恢复过程。

pgpool 节点上的 pgpool.conf 文件包含参数 recovery_1st_stage_command。 我在网上查了源码,发现参数"recovery_1st_stage_command"应该是在Pgpool节点的配置文件pgpool.conf中设置的。

我设置了参数recovery_1st_stage_command = 'basebackup.sh'。 我已将脚本 'basebackup.sh' 文件放在数据目录 '/var/lib/pgsql/9.4/data' 下的两个 Postgresql 节点上/强>。

我还把脚本“pgpool_remote_start”放在数据库节点上的目录“/var/lib/pgsql/9.4/data”下。

还在两个数据库节点上创建了 pgpool 扩展 pgpool_recovery 和 pgpool_adm。

当主节点停止时,会发生故障转移,但不会执行恢复脚本“basebackup.sh”。 我检查了 pgpool 日志并启用了调试级别。仍然无法找到脚本是否被执行。

请帮我解决故障节点的自动在线恢复。找到我使用的脚本。

basebackup.sh

#!/bin/bash
# first stage recovery
# $1 datadir
# $2 desthost
# $3 destdir

#as I'm using repmgr it's not necessary for me to know datadir(master) $1
RECOVERY_NODE=$2
CLUSTER_PATH=$3
#repmgr needs to know the master's ip
MASTERNODE=`/sbin/ifconfig eth0 | grep inet | awk 'print $2' | sed 's/addr://'`

cmd1=`ssh postgres@$RECOVERY_NODE "repmgr -D $CLUSTER_PATH --force standby clone $MASTERNODE"`
echo $cmd1

pgpool_remote_start 脚本。

#! /bin/sh

if [ $# -ne 2 ]
then
    echo "pgpool_remote_start remote_host remote_datadir"
    exit 1
fi

DEST=$1
DESTDIR=$2
PGCTL=/usr/pgsql-9.4/bin/pg_ctl

ssh -T $DEST $PGCTL -w -D $DESTDIR start 2>/dev/null 1>/dev/null < /dev/null &

谢谢。

【问题讨论】:

我发现故障转移后,Standby节点成功提升为新的Master服务器。现在,我必须在 Pgpool 节点上手动运行 pcp_recovery_node 命令。此命令在新的 Master 服务器上执行 basebackup.sh 脚本并成功恢复故障节点并将该节点加入集群。 我想自动执行这个 pcp_recovery_node 命令 【参考方案1】:

我认为这是设计的。当主服务器发生故障时,会发生故障转移,因此从服务器会被提升。但是老主人不会自动恢复为奴隶。相反,通常故障转移脚本会尝试永久关闭失败的主节点并禁止它重新启动(如果可能,可能节点已关闭并且无法连接),这是为了避免脑裂。

如果您真的想要,那么您可以修改故障转移脚本,使其在升级从属服务器后对旧主服务器执行 pcp_recovery 操作。但是你实际上正在做的是一个切换......这应该被编写为一系列步骤。故障转移适用于主服务器出现真正问题(例如机器没有响应)

【讨论】:

以上是关于无法使用 pgpool II 自动恢复失败的 postgresql 主节点的主要内容,如果未能解决你的问题,请参考以下文章

pgpool-ii4.1.2 高可用集群[主备切换]配置部分

PGPool-II+PG流复制实现HA主备切换

pgpool-ii 安装手册 基于Centos7.3

安装部署postgresql-15 高可用(pgpool)

postgresql + pgpool 构建容灾高可用集群(数据同步流复制/主备自动切换)

Postgresql流复制+pgpool实现高可用