PostgreSQL VIP故障切换的大全,非常的实用

时间:2025-01-17 19:30:18


????????????????????????
作者:IT邦德
中国DBA联盟(ACDU)成员,10余年DBA工作经验,
Oracle、PostgreSQL ACE
博客专家及B站知名UP主,全网粉丝10万+
擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复,
安装迁移,性能优化、故障应急处理


文章目录

  • 1.连接池自身VIP
  • 2.高可用回调VIP
  • 3.keepalived实现VIP
  • 4.主备VIP双保险
  • 5.手动挂载/卸载 VIP
  • 总结


PostgreSQL中的VIP功能主要用于实现高可用性和故障切换,当主节点出现故障时,备节点可以接管VIP,继续对外提供服务,从而避免服务中断,故障切换过程通常涉及VIP的卸载和挂载

PostgreSQL VIP故障切换的大全,非常的实用_postgresql

接下来,这里汇总PostgreSQL使用VIP经典的6种方法。

1.连接池自身VIP

PostgreSQL VIP故障切换的大全,非常的实用_IP_02

Pgpool-II参数配置的配置文件中,通过以下方式绑定VIP,这个连接池自身的HA方案Watch dog起到了很关键的作用。

#当监视器进程异常终止时,设置在新pgpool节点上启动VIP
wd_escalation_command='/etc/pgpool-II/escalation.sh'

vim /etc/pgpool-II/escalation.sh
PGPOOLS=(192.168.3.10 192.168.3.11 192.168.3.12)
VIP=192.168.3.20
DEVICE=ens33

pgpool.conf配置文件如下: 
#- Watchdog Configuration
use_watchdog=on
delegate_IP='192.168.3.20'
 
if_up_cmd='/usr/bin/sudo /sbin/ip addr add $_IP_$/24 dev ens33 label ens33:1'
if_down_cmd='/usr/bin/sudo /sbin/ip addr del $_IP_$/24 dev ens33'
arping_cmd='/usr/bin/sudo /usr/sbin/arping -U $_IP_$ -w 1 -I ens33'

PostgreSQL VIP故障切换的大全,非常的实用_postgresql_03

2.高可用回调VIP

PostgreSQL VIP故障切换的大全,非常的实用_数据库_04

通过Patroni回调脚本实现VIP漂移,Patroni支持用户配置在特定事件发生时触发回调脚本。因此我们可以配置一个回调脚本,在主备切换后动态加载VIP。PATRONI可以将VIP绑定在MASTER节点,当主备切换时,VIP漂移到新主节点。

patroni.yml配置文件中加入以下:

vi /etc/patroni/patroni.yml
postgresql:
  callbacks:
	on_start: /bin/bash /etc/patroni/loadvip.sh
	on_restart: /bin/bash /etc/patroni/loadvip.sh
	on_role_change: /bin/bash /etc/patroni/loadvip.sh

3.keepalived实现VIP

PostgreSQL VIP故障切换的大全,非常的实用_PostgreSQL_05

haproxy 使用C语言开发的一个开源软件,是一款具备高并发(一万以上)、高性能的TCP和HTTP负载均衡器,通过配置HAProxy,实现端口上有负载均衡的功能。

PostgreSQL VIP故障切换的大全,非常的实用_postgresql_06

最后在配置keepalived实现VIP漂移,Keepalived就是巧用VRRP协议来实现高可用性(HA)的

4.主备VIP双保险

Pacemaker用于资源的转移,corosync用于心跳的检测。结合起来使用,实现对PostgreSQL高可用架构的自动管理。在这套架构中,主库和备库vip-master和备库vip-slave。

cat >> /etc/hosts <<"EOF"
192.168.3.10 pg01
192.168.3.11 pg02
192.168.3.12 pg03
192.168.3.13 vip-master
192.168.3.14 vip-slave
EOF

PostgreSQL VIP故障切换的大全,非常的实用_数据库_07

我们看到vip-master和vip-slave都是Started状态时,集群节点状态正常。

PostgreSQL VIP故障切换的大全,非常的实用_配置文件_08

5.手动挂载/卸载 VIP

PostgreSQL VIP故障切换的大全,非常的实用_配置文件_09


repmgr是一个开源工具套件(类似于MySQL的MHA),用于管理PostgreSQL服务器集群中的复制和故障转移。

亲身经历就是, 数据库本身好好的,但是由于keepalived 不稳定,经常发生vip 的漂移和相应的数据库的promote 的 fail over 的切换。

从运维的可维护性来说, 我们摒弃了keepalived 作为HA 的vip 方案。我们这里采用repmgr + 最原始的手动挂载/卸载 VIP 的方式 实现 应用自动故障转移。

核心命令就是:
卸载VIP: /usr/bin/sudo /sbin/ip addr del $VIP/24 dev $DEVICE
挂载VIP: /usr/bin/sudo /sbin/ip addr add $VIP/24 dev $DEVICE
清除 arp cache 缓存: /usr/bin/sudo /sbin/arping -I $DEVICE -s $VIP -b -c 
3 $GW

我们需要把repmgrd 的配置文件中的 promote_command 改为我们自定义的shell 文件

promote_command='/opt/postgreSQL/repmgr_promote_command.sh >> /opt/postgreSQL/repmgrd.log'

repmgr_promote_command.sh脚本

#!/bin/bash


set -o xtrace
PGCANDIDATES=(10.67.38.50 10.67.39.149 10.67.39.49)
HOSTNAME=`hostname -i`
VIP=10.67.39.200
GW=10.67.39.254
DEVICE=eth0
PG_HOME=/opt/postgreSQL/pg12
PORT=1998
REPMGR_USER=repmgr
REPMGR_PASSWD=repmgr
STEP1="Remove the VIP on all nodes"
STEP2="Check if vip still online"
STEP3="Promte primary DB"
STEP4="Add vip on new primary DB"
STEP5="Clear ARP Cache"


###step1. Remove the VIP on all nodes
for candidate in "${PGCANDIDATES[@]}"; do
    [ "$HOSTNAME" = "$candidate" ] && continue


    ssh -T -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null postgres@$candidate  "
        /usr/bin/sudo /sbin/ip addr del $VIP/24 dev $DEVICE
    "
done
####clear arp cache
/usr/bin/sudo /sbin/arping -I $DEVICE -s $VIP -b -c 5 $GW




###step2.Check if vip still online
/usr/bin/sudo  /usr/bin/ping -c1 -w1 -t5 ${VIP}
if [ $? -eq 0 ]; then
    echo repmgr_promote_command.sh: ${STEP2} : ${VIP} failed !!!  
    exit 1
fi




###step3.Promte primary DB
/opt/postgreSQL/pg12/bin/repmgr standby promote -f /opt/postgreSQL/repmgr.conf --log-to-file
#echo "/opt/postgreSQL/pg12/bin/repmgr standby promote -f /opt/postgreSQL/repmgr.conf --log-to-file"
if [ $? -ne 0 ]; then
    echo repmgr_promote_command.sh: ${STEP3} on ${HOSTNAME} failed !!!  
    exit 1
fi
standby_flg=`${PG_HOME}/bin/psql -p ${PORT} -U ${REPMGR_USER} -w ${REPMGR_PASSWD} -h localhost -At -c "SELECT pg_is_in_recovery();"`
if [ ${standby_flg} == 'f' ]; then
   echo repmgr_promote_command.sh: ${STEP3} on ${HOSTNAME} successfully !!!
elif [ ${standby_flg} == 't' ]; then
   echo repmgr_promote_command.sh: ${STEP3} on ${HOSTNAME} failed !!!
   exit 1
fi
###step4.Add vip on new primary DB
/usr/bin/sudo /sbin/ip addr add $VIP/24 dev $DEVICE
if [ $? -ne 0 ]; then
    echo repmgr_promote_command.sh: ${STEP4} on ${HOSTNAME} failed !!!  
    exit 1
fi
####step5.Clear arp cache
/usr/bin/sudo /sbin/arping -I $DEVICE -s $VIP -b -c 3 $GW
if [ $? -ne 0 ]; then
    echo repmgr_promote_command.sh: ${STEP5} on ${HOSTNAME} failed !!!  
    exit 1
fi

总结

PostgreSQL中的VIP功能通过提供虚拟IP地址和故障切换机制,实现了数据库服务的高可用性和自动恢复能力,是构建可靠数据库系统的重要组成部分。