当前位置: 首页 > news >正文

repmgr+vip实现对业务透明的高可用切换

本方案说明

  • PostgreSQL + repmgr:实现主从自动故障检测与切换(Failover)。
  • vip:作为应用连接地址,屏蔽后端数据库变动,提供透明连接。
  • vip漂移:通过repmgr组件的promote_command阶段触发脚本,将vip漂移到新主库。

节点规划

主机hostname角色组件
10.0.0.41repmgr01LeaderPostgreSQL 15.5、repmgr 5.5.0
10.0.0.42repmgr02standby1PostgreSQL 15.5、repmgr 5.5.0
10.0.0.43repmgr03standby2PostgreSQL 15.5、repmgr 5.5.0

目录文件说明

/data/pgsql/data后端postgresql的数据目录
/data/pgsql/log后端postgresql的日志目录
/data/pgsql/data/postgres.conf后端postgresql的配置文件
/data/pgsql/data/pg_hba.conf后端postgresql的访问控制文件
/data/repmgr高可用组件repmgr的家目录
/data/repmgr/repmgr.conf高可用组件repmgr的配置文件
/data/repmgr/promte_standby_vip.shrepmgr监测到后端主节点故障后触发的脚本

1.集群准备

准备一套1主2从的repmgr集群,部署过程参考我的另一篇文章PostgreSQL高可用架构Repmgr部署流程

# 配置集群所有节点postgres用户的sudo权限
[root@repmgr01 ~]# visudo
postgres ALL=(ALL) NOPASSWD: ALL

2.编辑repmgr触发脚本

#所有节点
vim /data/repmgr/promte_standby_vip.sh
#!/bin/bash
set -o xtrace
PGCANDIDATES=(10.0.0.41 10.0.0.42 10.0.0.43)
HOSTNAME=`hostname -i`
VIP=10.0.0.44
GW=10.0.0.254
DEVICE=ens33
PG_HOME=/usr/local/pgsql
PG_PORT=5432
REPMGR_USER=repmgr
REPMGR_PASSWD=repmgr
REPMGR_CONF=/data/repmgr/repmgr.confSTEP1="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" ] && continuessh -T -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null postgres@$candidate  "/usr/bin/sudo /sbin/ip addr del $VIP/24 dev $DEVICE"
done###step2.Check if vip still online
/usr/bin/sudo  /usr/bin/ping -c1 -w1 -t5 ${VIP}
if [ $? -eq 0 ]; thenecho repmgr_promote_command.sh: ${STEP2} : ${VIP} failed !!!  exit 1
fi###step3.Promte primary DB
${PG_HOME}/bin/repmgr standby promote -f ${REPMGR_CONF} --log-to-fileif [ $? -ne 0 ]; thenecho repmgr_promote_command.sh: ${STEP3} on ${HOSTNAME} failed !!!  exit 1
fistandby_flg=`${PG_HOME}/bin/psql -p ${PG_PORT} -U ${REPMGR_USER} -w ${REPMGR_PASSWD} -h localhost -At -c "SELECT pg_is_in_recovery();"`if [ ${standby_flg} == 'f' ]; thenecho repmgr_promote_command.sh: ${STEP3} on ${HOSTNAME} successfully !!!
elif [ ${standby_flg} == 't' ]; thenecho 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 ]; thenecho 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 ]; thenecho repmgr_promote_command.sh: ${STEP5} on ${HOSTNAME} failed !!!  exit 1
fi
# 授予脚本可执行权限
chmod +x /data/repmgr/promte_standby_vip.sh

3.修改repmgr配置文件

# 修改promote_command参数,执行我们新建的脚本
vim /data/repmgr/repmgr.conf
promote_command='/data/repmgr/promte_standby_vip.sh >> /data/repmgr/repmgrd.log'

4.将vip挂载到主节点

[postgres@repmgr01 ~]$ /usr/bin/sudo /sbin/ip addr add 10.0.0.44/24 dev ens33

5.重新启动repmgrd守护进程

kill $(pgrep -f repmgrd)
repmgrd -f /data/repmgr/repmgr.conf --daemonize

6.验证failover

查看当前集群状态

[postgres@repmgr01 ~]$ repmgr -f  /data/repmgr/repmgr.conf cluster show

在这里插入图片描述

使用vip连接查看从库信息

[postgres@repmgr01 ~]$ PGPASSWORD="repmgr" psql -p 5432 -U repmgr -h 10.0.0.44 -d repmgr
repmgr=# select * from pg_stat_replication;

在这里插入图片描述

手动关闭主节点

[postgres@postgres-01 data]$ pg_ctl stop -D $PGDATA
waiting for server to shut down.... done
server stopped

查看日志

[postgres@repmgr02 ~]$ vim /data/repmgr/repmgrd.log 

经过三次重试无法连接node-01

在这里插入图片描述

node-02作为主节点,在该节点上执行了触发脚本,成功被提升为主库,并且node-03节点作为从节点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查看vip

vip漂移到了node-02节点

[postgres@repmgr02 ~]$ ip a| grep 10.0.0.44inet 10.0.0.44/24 scope global secondary ens33

通过vip连接主节点,查看从库信息

[postgres@repmgr02 ~]$ PGPASSWORD="repmgr" psql -p 5432 -U repmgr -h 10.0.0.44 -d repmgr
psql (15.5)
Type "help" for help.repmgr=# select * from pg_stat_replication\gx

在这里插入图片描述

http://www.dtcms.com/a/292291.html

相关文章:

  • 数据库—修改某字段默认值
  • Oracle RAC+ADG switchover 切换演练流程
  • TDSQL
  • [08006][1033] ORA-01033: ORACLE 正在初始化或关闭--问题修复
  • 达梦数据库表字段增加时报错[-2106]:无效的表或视图名,[-2116]:列[IS_REPEAT]已存在
  • Python趣味算法:折半查找(二分查找)算法终极指南——原理、实现与优化
  • 人工智能——OpenCv基础
  • python如何生成 requirements.txt文件
  • Elasticsearch是什么?
  • 【论文阅读】Fast-BEV: A Fast and Strong Bird’s-Eye View Perception Baseline
  • 【AI学习从零至壹】Transformer
  • AI入门学习-特征工程
  • 钢铁之躯的智慧觉醒:Deepoc具身智能如何重塑工业机械臂的“工艺直觉”
  • 虚幻 5 与 3D 软件的协作:实时渲染,所见所得
  • ClearML库详解:从实验跟踪到模型部署的全流程管理
  • FPGA自学——存储器模型
  • 立式数控深孔钻的工艺及光学检测方法 —— 激光频率梳 3D 轮廓检测
  • C语言---VSCODE的C语言环境搭建
  • 腾讯研究院 | AI 浪潮中的中国品牌优势解码:华为、小米、大疆、科大讯飞等品牌从技术破壁到生态领跑的全维突围
  • 宽带丢包重传高优化
  • 论文笔记 | Beyond Pick-and-Place: Tackling Robotic Stacking of Diverse Shapes
  • 2025.7.25论文阅读
  • 基于AutoJawSegment项目的CBCT图像分割实践指南
  • ES--为什么没有完全删除?
  • 机器人氩弧焊保护气降成本的方法
  • KGF60N65KDF-U/H KEC:650V超级硅MOSFET,超低导通电阻+超快开关速 电源设计专用!
  • 基于Spark图计算的社会网络分析系统
  • 一款基于 WPF 开源、功能全面的串口调试工具
  • 刘强东突然重仓机器人赛道,京东连投3家机器人公司
  • n8n - 为技术团队提供安全的自动化工作流