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

PostgreSQL 高可用集群故障分析实战:主节点宕机后未发生自动切换问题排查与解决

摘要

在 PostgreSQL 高可用架构中,自动故障切换(Failover)是保障数据库业务连续性的核心能力。然而在实际生产环境中,经常出现主节点已经故障,但备节点迟迟未提升(Promote)为新的主节点的情况,导致业务长时间中断。

本文结合实际 PostgreSQL + Keepalived + repmgr 集群案例,从故障现象、架构设计、日志分析、故障定位、原因分析、解决方案、预防措施等多个维度深入分析 PostgreSQL 高可用故障切换失效问题。

本文适用于:

  • PostgreSQL 主从复制架构

  • PostgreSQL + Keepalived

  • PostgreSQL + repmgr

  • PostgreSQL + VIP高可用

  • PostgreSQL HA运维人员

  • 数据库管理员(DBA)

一、故障背景

某生产环境部署 PostgreSQL 高可用集群:

集群架构

VIP: 192.168.18.101 | Keepalived | +--------------+--------------+ | | PostgreSQL 主库 PostgreSQL 备库 10.197.167.123 10.197.167.124

服务器配置:

节点IP角色
node110.197.167.123Primary
node210.197.167.124Standby
VIP192.168.18.101业务访问地址

软件版本:

软件版本
PostgreSQL16
repmgr5.x
Keepalived2.x
Rocky Linux9

业务通过 VIP 访问数据库。

二、故障现象

某日主节点发生异常:

systemctl stop postgresql

或者:

kill -9 postgres

主库已经停止。

理论上应该发生:

主库故障 ↓ Keepalived检测失败 ↓ VIP漂移 ↓ 备库Promote ↓ 业务恢复

但实际情况:

主库停止 ↓ VIP未漂移 ↓ 备库未提升 ↓ 业务中断

故障持续超过30分钟。

三、故障现场分析

3.1 查看VIP

主库:

ip a

发现:

192.168.18.101 依然存在

说明:

Keepalived未降级

VIP没有释放。

3.2 查看Keepalived状态

systemctl status keepalived

结果:

active (running)

Keepalived服务正常。

但VIP未漂移。

说明:

健康检查失效

四、检查健康检测脚本

配置:

vrrp_script chk_pgsql { script "/etc/keepalived/check_pg.sh" interval 2 weight -20 }

查看脚本:

cat check_pg.sh

内容:

ps -ef | grep postgres

存在严重问题。

五、错误脚本分析

假设 PostgreSQL 已停止:

ps -ef | grep postgres

返回:

postgres 12345 grep postgres

脚本判断:

if ps -ef | grep postgres then exit 0 fi

结果:

误判存活

Keepalived认为:

PostgreSQL正常

不会触发切换。

六、正确检测方式

推荐:

pg_isready

示例:

pg_isready -h 127.0.0.1 -p 5432

正常:

accepting connections

异常:

no response

脚本:

#!/bin/bash pg_isready \ -h 127.0.0.1 \ -p 5432 \ -U postgres if [ $? -eq 0 ] then exit 0 else exit 1 fi

七、第二类故障:数据库进程存在但服务不可用

最常见问题:

Postgres进程存在 但无法连接

例如:

ps -ef | grep postgres

显示:

postgres running

但:

psql

连接失败。

原因:

  • WAL阻塞

  • IO故障

  • 死锁

  • 磁盘满

此时:

进程检测失效

必须采用:

psql -c "select 1"

检测。

八、repmgr状态检查

查看:

repmgr cluster show

正常:

ID | Name | Role 1 | node1 | primary 2 | node2 | standby

故障后:

node1 unreachable node2 standby

发现:

node2没有自动提升

九、检查repmgrd服务

查看:

systemctl status repmgrd

结果:

inactive

问题找到。

repmgr虽然安装:

repmgrd未启动

因此:

无法自动故障切换

十、启动自动切换服务

systemctl enable repmgrd systemctl start repmgrd

验证:

repmgr service status

结果:

running

十一、检查自动提升配置

repmgr.conf:

failover=automatic

错误配置:

failover=manual

此时:

只告警 不切换

修改:

failover=automatic

重启:

systemctl restart repmgrd

十二、网络脑裂分析

另一种情况:

主库网络断开。

例如:

主库 ↔ 备库 连接中断

主库实际上仍在运行。

备库认为:

主库故障

发生Promote。

结果:

双主

即脑裂。

十三、脑裂危害

例如:

主库写入:

订单10001

备库写入:

订单10002

网络恢复后:

数据冲突

无法自动合并。

造成:数据丢失

  • 数据不一致

  • 业务故障


十四、VIP为什么没有漂移

分析Keepalived日志:

journalctl -u keepalived

发现:

Script check_pg.sh returned success

说明:

脚本始终返回0

VIP自然不会漂移。

十五、脚本权限问题

常见错误:

-rw-r--r--

没有执行权限。

导致:

Keepalived无法执行脚本

修复

chmod +x check_pg.sh

十六、SELinux影响

Rocky Linux 9:

getenforce

返回:

Enforcing

可能拦截脚本执行。

查看:

ausearch -m avc

临时关闭:测试。


十七、sudo权限问题

很多脚本包含:

sudo systemctl stop keepalived

但:

keepalived用户无sudo权限

导致脚本失败。

配置:

visudo

加入:

postgres ALL=(ALL) NOPASSWD:ALL

十八、WAL配置问题

检查:

show wal_level;

应为:

replica

检查:

show max_wal_senders;

建议:

10

检查:

show wal_log_hints;

应:

on

否则:

十九、复制状态检查

主库:

select * from pg_stat_replication;

正常:

state = streaming

异常:

0 rows

说明:

复制中断

二十、备库状态检查

select pg_is_in_recovery();

结果:

t

表示:

备库

Promote后:

f

表示:

主库

二十一、故障恢复测试

测试流程:

测试一

关闭主库:

systemctl stop postgresql

结果:

VIP漂移成功

测试二

查看备库:

select pg_is_in_recovery();

结果:

false

提升成功。

测试三

业务连接VIP:

psql -h 192.168.18.101

连接正常。

二十二、最终解决方案

经过排查发现:

根本原因:

1. Keepalived检测脚本误判 2. repmgrd未启动 3. failover配置错误

修复:

优化健康检查 启用repmgrd 开启automatic failover 增加VIP检测 增加日志监控

最终实现:

主库故障 ↓ 2秒检测 ↓ VIP漂移 ↓ 备库Promote ↓ 业务恢复

恢复时间:

小于10秒

满足生产要求。

二十三、最佳实践建议

建议一

不要使用:

ps -ef | grep postgres

作为唯一检测依据。

建议二

优先使用:

pg_isready

和:

select 1

组合检测。

建议三

启用:

repmgrd

自动切换。

建议四

定期进行故障演练。

建议:

每月一次

Failover测试。

建议五

监控以下关键指标:

  • PostgreSQL状态

  • VIP归属

  • Replication Lag

  • WAL生成速率

  • Repmgr状态

  • Keepalived状态

总结

PostgreSQL 高可用建设并非仅部署主从复制即可完成。真正决定系统可靠性的,是故障检测、自动切换、VIP漂移、脑裂防护以及运维监控体系。

本次案例中,虽然集群已经部署完成,但由于健康检查脚本设计不合理、repmgrd未启动以及自动切换配置错误,导致主库故障后系统未能完成故障转移,最终造成业务中断。

通过完善健康检测逻辑、启用自动故障切换、优化Keepalived配置以及建立标准化故障演练机制,最终实现了PostgreSQL高可用集群在主节点故障情况下10秒内自动恢复业务访问的目标。

对于生产环境而言,建议将故障切换测试纳入日常运维流程,持续验证高可用机制的有效性,确保真正发生故障时系统能够自动、可靠、快速地完成切换,保障业务连续运行。

postgrqsql高可用管理平台推荐:CLup6.x产品手册:CLup简介

http://www.jsqmd.com/news/1072202/

相关文章:

  • 躺床上刷手机总乱转?一键关掉自动旋转,再也不晃眼!
  • 智能考勤教务系统对比,降低机构运营人力成本
  • 2026年腾讯云 618 活动说明及 Hermes Agent/OpenClaw配置Token Plan新手快速入门
  • 深圳地区等保2.0超融合方案选型指南与行业实践案例
  • 2026年度蓝光光谱照度计产业技术发展报告:从实验室到产线的关键检测节点
  • 终极RE引擎模组框架REFramework:如何为生化危机、鬼泣等游戏构建完整的脚本平台
  • 日本发布比肩Fable5的模型?Fugu Ultra初探!
  • 如何零成本解锁Wand专业版功能?开源增强工具为你提供完美解决方案
  • 用JDBC + AOP 实现的数据库加密切面能不能切西瓜?
  • 建议收藏!Wireshark 流量分析超详细例题精讲,零基础从入门到精通实战教程
  • 分布式时序数据库TimeLyre :原生多模态、高性能计算、快速时序回放分析
  • Meta SilverTorch 解读:为什么推荐系统要把索引也做成模型
  • 云原生可观测性体系构建:Prometheus + Grafana 全栈监控方案设计与落地
  • AI 辅助客服系统:情感分析驱动的智能邮件处理方案
  • 主流 Windows Hello 红外模组选型科普:传感器、IR 灯选购全指南
  • AI 营销自动化:从线索评分到转化优化的全链路实践
  • 小学期第六周学习笔记
  • 2026年京东云 618 活动 Hermes Agent/OpenClaw配置Token Plan搭建详细解读
  • 3D Web 开发实战:Three.js 场景构建与 GPU 渲染性能优化的工程化路径
  • Sexton Signata CT-5细胞治疗灌装系统解析:封闭式无菌灌装、GMP合规与CGT制剂生产选型指南
  • 5个步骤掌握HMCL:跨平台Minecraft启动器终极指南
  • 3分钟搞定Windows键盘重映射:让失灵按键重获新生的终极方案
  • VMware Workstation Pro 17 完整免费激活指南:1000+许可证密钥与简单教程
  • 计算机毕业设计之工厂员工办公用品订购管理系统
  • Python_40题详细解析
  • 2026深度实测|文科转码生vibe coding实战心得:零基础搞定Python课设与项目开发
  • DashScope Embedding工具类详解(向量转换、Milvus知识库项目实战)
  • Ansible:一台机器管所有服务器的自动化利器
  • 不用啃 SPSS 教程!Paperxie 一站式 AI 数据分析,搞定论文实证全流程
  • 异步消息管道:从 Redis Stream 到可靠消费的工程实践