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

PostgreSQL 高可用与负载均衡

一、高可用(High Availability, HA)核心目标**

  1. 最小化停机时间:确保服务在硬件/软件故障时快速恢复。
  2. 数据零丢失:通过同步复制保障数据一致性。
  3. 自动故障转移:无需人工干预切换主节点。

二、主流高可用方案

1. 基于流复制(Streaming Replication)
  • 异步复制

    • 主库写入后无需等待备库确认(可能丢数据)。
    • 适用场景:对数据一致性要求不高的业务。
  • 同步复制

    • 主库提交事务需等待至少一个备库确认(synchronous_commit = on + synchronous_standby_names)。

    • 关键配置

      ALTER SYSTEM SET synchronous_standby_names = 'standby1';
      
2. 自动故障转移工具
工具原理特点
Patroni基于DCS(etcd/ZooKeeper)协调选举支持复杂拓扑,与Kubernetes集成最佳
repmgr轻量级,依赖节点间SSH通信配置简单,适合中小规模集群
Pgpool-II集成连接池+故障检测+读写分离功能全面,但复杂度较高
3. 共享存储方案(如DRBD)
  • 多节点共享同一块磁盘(需分布式文件系统如Ceph)。
  • 风险点:存储单点故障需额外规避。

三、负载均衡实现方式

⚠️ 注意:PostgreSQL 原生不支持负载均衡,需借助中间件。

1. 连接池级负载均衡
  • PgBouncer / pgpool-II

    • 将客户端连接分发到多个后端PostgreSQL实例。

    • 读写分离:将读请求路由到备库(需设置default_routing_mode = read in pgpool)。

    • 配置示例(pgpool):

      backend_hostname0 = 'primary'
      backend_port0 = 5432
      backend_hostname1 = 'replica1'
      backend_port1 = 5432
      
2. 应用层负载均衡
  • 使用 HAProxy / Nginx

    • 通过TCP代理分发连接(仅适用于读操作)。

    • HAProxy 配置片段:

      frontend pg_readbind *:5000default_backend pg_replicasbackend pg_replicasbalance roundrobinserver replica1 192.168.1.2:5432 checkserver replica2 192.168.1.3:5432 check backup
      
3. 服务发现(动态扩容)
  • 结合Consul+HAProxy
    当新备库加入时,Consul自动更新HAProxy后端列表。

四、关键架构图示例

典型高可用+读写分离架构
Client → HAProxy (VIP)├──→ PgBouncer (Primary) → Master DB (RW)└──→ PgBouncer (Replica) → Standby DB (RO)↑Streaming Replication
  • VIP:虚拟IP漂移(Keepalived)
  • 监控:Prometheus + Grafana(监控复制延迟)

五、故障转移(Failover)流程

  1. 检测主库失效(如Patroni通过DCS心跳判断)。

  2. 提升备库为新主库

patronictl failover --candidate replica1 --force
  1. 重配置集群
  • 更新所有备库的复制源指向新主库。
  • 应用层连接池重定向到新VIP。

六、数据一致性保障

  • 同步复制超时处理
    • 若备库无响应,主库自动降级为异步(synchronous_commit = remote_write)。
  • 脑裂(Split-Brain)预防
    • 使用Quorum机制(需多数节点确认写入)。
    • Patroni配置ttl(锁租期)避免双主。

七、云原生方案(Kubernetes)

  • Operator框架
    • Crunchy Data / Zalando Postgres Operator
      • 自动创建StatefulSet + 配置流复制。
      • 内置备份、克隆、监控功能。
  • 服务暴露
    • 读服务:ClusterIP + 多个Endpoint(指向所有副本)。
    • 写服务:固定指向主库的Headless Service

八、灾难恢复(Disaster Recovery)

  1. 物理备份pg_basebackup + WAL归档(到S3/MinIO)。
  2. 逻辑备份pg_dump + 定期验证恢复。
  3. 跨地域复制:使用级联复制或逻辑解码(Debezium)。

九、监控指标清单

类别关键指标工具
复制状态pg_stat_replication lag (bytes)Prometheus + pg_exporter
节点健康连接数/锁等待/长事务PGHero
负载均衡请求分布/错误率HAProxy Stats

十、常见陷阱

  1. 复制延迟导致读旧数据
  • 解决方案:应用层使用hot_standby_feedback或强制读主库。
  1. 连接池耗尽
  • 调整max_connections + 使用PgBouncer复用连接。
  1. 自动故障转移误判
  • 设置合理的健康检查超时(如Patroni的loop_wait)。

附录:命令速查

# 查看复制状态
SELECT client_addr, state, sync_state, write_lag FROM pg_stat_replication;# 手动提升备库(无工具时)
pg_ctl promote -D /var/lib/postgresql/data
http://www.dtcms.com/a/317455.html

相关文章:

  • iOS 文件管理实战指南 查看 App 数据与系统日志的完整方法
  • 26-OS-PV大题
  • 重生之我在暑假学习微服务第十一天《配置篇》+网关篇错误订正
  • 启动VScode调试时报错:go命令的版本是1.23.0,而工具链的版本是1.23.6
  • IDEA 2025下载安装教程【超详细】保姆级图文教程(附安装包)
  • 华硕携多款明星电竞显示器亮相 ChinaJoy2025,联袂 TCL 华星打造沉浸体验
  • [Oracle] SIGN()函数
  • 微信小程序最大层级跳转问题
  • 使用 Maxwell 和 RabbitMQ 监控 Mysql Flowable 表变更
  • Kubernetes(k8s)之容忍与污点
  • Java学习第一百零九部分——Jenkins(一)
  • k8s +cilium+metallb 集群流量走向
  • 嵌入式学习的第四十四天-ARM
  • Gitlab+Jenkins+K8S+Registry 建立 CI/CD 流水线
  • Packets Frames 数据包和帧
  • docker-compose快速部署启动file beat+ELK
  • 企业级Linux服务器安全:防火墙规则配置与Web/SSH服务优化指南
  • 机器学习④【算法详解:从决策树到随机森林】
  • 【Graphiti MCP Server 配置与使用教程 (优化版)】
  • 了解SELinux
  • CGAL中函数squared_distance使用细则
  • 数据安全框架规划图
  • 【LeetCode 热题 100】347. 前 K 个高频元素——(解法三)桶排序
  • 使用R将nc文件转换为asc文件或者tif文件
  • C语言控制语句练习题2
  • KVazaar:开源H.265/HEVC编码器技术深度解析
  • vcpkg: 一款免费开源的C++包管理器
  • 【开源分享】can-utils:深入解析 Linux CAN 工具集
  • UE编辑器相机窗口运行时相机fov 大小不一致
  • 毕业设计选题推荐之基于Spark的在线教育投融数据可视化分析系统 |爬虫|大数据|大屏|预测|深度学习|数据分析|数据挖掘