????????????????????????
作者: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经典的6种方法。
1.连接池自身VIP
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'
2.高可用回调VIP
通过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
haproxy 使用C语言开发的一个开源软件,是一款具备高并发(一万以上)、高性能的TCP和HTTP负载均衡器,通过配置HAProxy,实现端口上有负载均衡的功能。
最后在配置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
我们看到vip-master和vip-slave都是Started状态时,集群节点状态正常。
5.手动挂载/卸载 VIP
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地址和故障切换机制,实现了数据库服务的高可用性和自动恢复能力,是构建可靠数据库系统的重要组成部分。