PostgreSQL配合Keepalived通过VIP实现高可用,主库故障时备库自动接管。基于流复制同步数据,Keepalived用VRRP管理虚拟IP,结合健康检查脚本检测数据库状态,主节点异常时优先级降低,备节点升主并绑定VIP,应用通过VIP无缝连接新主库。需配置SSH免密、规划VIP、设置监控脚本,并注意脑裂防范与网络通信。方案简单高效,适用于中小规模系统。
PostgreSQL 配合 Keepalived 实现漂移 IP(VIP)是一种常见高可用方案,主要用于主备架构下避免单点故障。当主库宕机时,虚拟 IP 自动漂移到备库,应用无需修改连接地址即可继续访问数据库。
基本原理该方案依赖于以下组件协同工作:PostgreSQL 流复制:主库将 WAL 日志实时传输给备库,实现数据同步。
Keepalived:通过 VRRP 协议管理虚拟 IP,在主节点故障时自动将其转移到备节点。
脚本监控:Keepalived 调用自定义脚本检测 PostgreSQL 状态,决定是否触发 VIP 漂移。
正常情况下,VIP 绑定在主库所在主机上。一旦主库或数据库进程异常,Keepalived 检测失败,优先级降低,备库提升为 MASTER 并接管 VIP。
部署前提条件实施前需确保以下配置已完成:两台及以上服务器部署 PostgreSQL,并配置好流复制(主从模式)。
网络互通,能支持组播通信(VRRP 使用)。
设置无密码 SSH 登录(便于执行切换脚本)。
规划一个未被使用的虚拟 IP(如 192.168.1.100),作为对外服务地址。
Keepalived 配置示例以两节点为例,主节点(priority 100),备节点(priority 90)。
主节点 /etc/keepalived/keepalived.conf:Midjourney AI 提示词工具PHP中文网提供Midjourney AI 提示词在线生成工具,专为解决 AI 绘画“词穷”痛点而生,用户只需输入“一只猫”等简单想法,工具便能利用 AI 智能扩展出包含艺术风格、光影构图、镜头参数及负面提示词的专业级英文 Prompt。它完美兼容 Midjourney V8.1 及 Niji 模型,支持一键复制与参数自动优化,大幅降低创作门槛,是提升出图质量与效率的必备辅助神器。
下载vrrp_script chk_pg {script "/usr/local/bin/check_postgres.sh"interval 2 weight 2}vrrp_instance VI_1 {state MASTER interface eth0 virtual_router_id 51 priority 100 advert_int 1 authentication {auth_type PASS auth_pass yourpass}virtual_ipaddress {
192.168.1.100/24
}track_script {chk_pg}}
备节点配置:
vrrp_script chk_pg {script "/usr/local/bin/check_postgres.sh"interval 2 weight 2}vrrp_instance VI_1 {state BACKUP interface eth0 virtual_router_id 51 priority 90 advert_int 1 authentication {auth_type PASS auth_pass yourpass}virtual_ipaddress {
192.168.1.100/24
}track_script {chk_pg}}健康检查脚本 check_postgres.sh该脚本用于判断本地 PostgreSQL 是否正常运行,是否为主库角色。
#!/bin/bash# 检查 PostgreSQL 是否运行且为 primaryPGDATA=/data/postgresql/data LOGFILE=/var/log/keepalived/pg_check.logif pg_ctl -D "$PGDATA" status > /dev/null 2>&1; then ROLE=$(psql -U postgres -Atc "SELECT pg_is_in_recovery();" 2>/dev/null) if [ "$ROLE" = "f" ]; then exit 0 # 是主库,健康else exit 1 # 是备库,不参与主角色竞争fi else exit 1 # PG 未运行fi
赋予执行权限:
chmod +x /usr/local/bin/check_postgres.sh注意:实际环境中建议加入更严格的判断,例如端口监听、复制延迟等。
故障切换流程主库 PostgreSQL 崩溃或服务器宕机。
Keepalived 执行 check_postgres.sh 脚本返回失败。
主节点权重下降,VRRP 优先级低于备库。
备库升级为 MASTER,绑定虚拟 IP。
客户端通过 VIP 连接新主库(需配合触发器或手动 promote)。
建议在备库的 keepalived 脚本中集成自动 promote 操作,或使用 repmgr 等工具辅助。
注意事项与优化建议脑裂风险:网络分区可能导致双主,建议结合仲裁机制或使用 Corosync+Pacemaker 更复杂场景。
IP 漂移生效时间:一般在 3~5 秒内完成,受 interval 和 advert_int 影响。
DNS 缓存问题:应用应直连 VIP,避免 DNS 缓存导致连接旧地址。
防火墙设置:确保允许 VRRP 协议(协议号 112)通信。
日志监控:定期查看 keepalived 和 PostgreSQL 日志,及时发现异常。
基本上就这些。这套方案简单有效,适合中小规模系统快速实现 PostgreSQL 高可用。关键是脚本要写稳,检测准确,避免误切。
