PostgreSQL(三)pgpool-II双节点集群下的故障切换与高可用实践

张开发
2026/4/28 14:02:34 15 分钟阅读

分享文章

PostgreSQL(三)pgpool-II双节点集群下的故障切换与高可用实践
1. pgpool-II双节点集群架构解析先说说为什么要在PostgreSQL一主二从架构上再加pgpool-II。我见过不少团队直接让应用连接主库和从库结果遇到故障切换时手忙脚乱。pgpool-II就像个智能路由器对外提供统一入口对内自动管理数据库集群。典型的双节点pgpool部署是这样的两个pgpool实例分别部署在不同服务器上通过watchdog互相监控。后端连接三台PostgreSQL节点一主二从当主库宕机时pgpool能自动将流量切换到新主库。这个过程中有个关键角色叫虚拟IPVIP应用始终连接这个VIP完全感知不到后端的切换。我去年给某电商做架构升级时就用了这个方案。他们的DBA之前需要半夜爬起来手动改应用配置现在故障切换完全自动化最夸张的一次主库硬盘故障业务部门根本没察觉到异常。2. 关键配置实战指南2.1 安装与基础配置建议直接用yum安装省去编译的麻烦。如果内网源没有可以用pgpool官方源# CentOS 7示例 yum install -y https://www.pgpool.net/yum/rpms/4.3/redhat/rhel-7-x86_64/pgpool-II-pg12-4.3.0-1pgdg.rhel7.x86_64.rpm配置文件/etc/pgpool-II/pgpool.conf需要重点关注这些参数listen_addresses * # 监听所有IP backend_hostname0 主库IP backend_hostname1 从库1IP backend_hostname2 从库2IP load_balance_mode on # 开启读负载均衡 master_slave_mode on # 主从模式 sr_check_period 5 # 流复制检查间隔2.2 看门狗与VIP配置看门狗是pgpool高可用的核心建议这样配置use_watchdog on wd_hostname 当前节点IP # 另一台配对方IP delegate_IP VIP地址 # 应用连接的虚拟IP if_up_cmd ifconfig eth0:0 $_IP_$ netmask 255.255.255.0 heartbeat_destination0 对端pgpoolIP遇到过的一个坑如果网卡名不是eth0一定要改成实际网卡名。有次实施时因为服务器用的是ens33接口配置没改导致VIP漂移失败。3. 故障切换全流程拆解3.1 健康检查机制pgpool默认每10秒执行一次健康检查可调整health_check_period。检查超时时间health_check_timeout建议设为20秒太短会导致误判。检查SQL很简单SELECT 1; -- 通过这个判断数据库是否存活在日志中看到这样的记录就要警惕了2023-08-01 14:00:05: pid 1234: WARNING: health check failed. 0 th host is down3.2 自动切换触发条件当出现以下情况时会触发切换主库连续health_check_max_retries次检查失败默认0表示立即切换流复制延迟超过delay_threshold默认1GB手动执行failover命令重要提醒从库提升为主库需要确保没有激活的写事务否则可能丢数据。建议设置failover_on_backend_error off # 避免网络抖动误切换3.3 切换脚本开发实例这是我的生产环境用的failover_stream.sh脚本精简化版#!/bin/bash FAILED_NODE$1 NEW_MASTER$2 TRIGGER_FILE$3 # 只处理主库故障 if [ $FAILED_NODE -eq 0 ]; then ssh postgres$NEW_MASTER touch $TRIGGER_FILE # 也可以调用pg_ctl promote fi exit 0记得给脚本加执行权限并测试chmod x /etc/pgpool-II/failover_stream.sh sudo -u postgres bash -c echo Test /tmp/trigger_file # 测试从库能否正常提升4. 常见问题排查手册4.1 切换失败排查步骤检查日志优先级先看pgpool日志默认/var/log/pgpool再看PostgreSQL日志验证SSH免密pgpool节点间要配置postgres用户免密登录测试VIP切换手动执行ifconfig eth0:0 VIP down看VIP是否漂移检查trigger文件权限确保postgres用户有权限创建触发文件4.2 性能调优参数这些参数根据业务特点调整num_init_children 50 # 连接池大小 max_pool 4 # 每个子进程最大连接 connection_life_time 300 # 连接回收时间(秒) client_idle_limit 0 # 客户端空闲超时(0表示不限制)5. 生产环境注意事项监控指标建议监控这些关键指标pgpool节点状态show pool_nodes主从延迟SELECT pg_xlog_location_diff()连接数show pool_processes定期演练每月至少做一次手动故障切换测试我见过太多配置久了失效的案例版本升级pgpool-II 4.x版本对watchdog有重大改进建议至少使用3.7以上版本最后分享一个真实教训有次升级后忘记同步pool_passwd文件到备节点导致切换后应用认证失败。现在我的检查清单里一定会包含配置同步项。

更多文章