前言

实现 PostgreSQL 的高可用性(High Availability, HA)是一个系统工程,需要结合复制技术、连接路由(负载均衡)、自动故障转移(Failover)以及监控告警。以下是主流方案和关键流程的详细说明:


一、核心基础:复制(Replication)

所有 HA 方案都建立在可靠的数据复制之上。

  1. 物理流复制(Physical Streaming Replication, PSR)

    • 原理:主库(Primary)持续将 WAL(Write-Ahead Log)记录流式传输给一个或多个备库(Standby)。备库实时重放 WAL,保持与主库物理数据块级别一致。
    • 模式
      • 异步复制(Async):主库提交事务后无需等待备库确认。性能最好,但存在数据丢失风险(主库宕机时未传输的 WAL)。
      • 同步复制(Sync):主库提交事务必须等待至少一个指定备库接收并写入 WAL 后才返回成功。保证零数据丢失,但增加延迟且依赖备库可用性。通常配置为 synchronous_standby_names = 'ANY 1 (standby1, standby2)' 以平衡可靠性和性能。
    • 优点:简单、高效、低开销、数据一致性高(物理一致)。
    • 缺点:备库通常只读,不能写入;大版本升级需重建备库。
  2. 逻辑复制(Logical Replication)

    • 原理:基于发布/订阅模型。主库将预定义的逻辑变更(INSERT/UPDATE/DELETE)解码后发送给订阅者(备库)。备库独立应用这些变更。
    • 优点:支持跨大版本复制、可选择复制特定表/行/列、备库可读写。
    • 缺点:开销大于 PSR、延迟通常更高、序列/DDL 变更需额外处理、不保证完全物理一致。
    • 适用场景:多主架构(需应用层解决冲突)、数据分片聚合、跨版本升级、部分表同步。

二、故障转移(Failover)与自动切换

核心目标是主库故障时,快速将流量切换到最新备库并提升为新主库。

  1. 关键组件:

    • 高可用管理器(HA Manager):负责监控、决策和执行故障转移。主流选择:
      • Patroni(推荐):结合 DCS(如 etcd, Consul, ZooKeeper)存储集群状态,提供自动故障转移、主库选举、配置管理。支持自定义脚本。
      • repmgr:轻量级工具,提供监控、故障转移通知和手动/自动切换命令。
      • Pgpool-II:内置 HA 管理功能(需谨慎配置避免脑裂)。
      • 云托管服务(RDS, Cloud SQL, Azure DB):使用其内置的 HA 方案。
    • 分布式一致性存储(DCS):如 etcd/Consul/ZooKeeper。存储集群拓扑、主库标识、健康状态、配置。防止脑裂(Split-Brain)的核心。
  2. 故障转移流程(以 Patroni + etcd 为例):

    1. 监控与检测:Patroni Agent 在每个节点运行,定期检查本地 PostgreSQL 状态(进程、连接性、WAL 进度、复制延迟)。
    2. 故障判定:当主库的 Agent 无法续租 DCS 中的 Leader 租约(TTL过期),或备库 Agent 检测到主库连接失败 + 复制中断超过阈值。
    3. Leader 选举
    • 存活的备库节点在 DCS 中发起选举。
    • 基于预设规则(如 prioritylag)选择最合适的备库。
    • DCS 确保只有一个节点能赢得选举。
    1. 新主库提升(Promotion)
    • 当选节点执行 pg_ctl promoteSELECT pg_promote(),脱离恢复模式,成为可读写主库。
    • 更新 DCS 中的 Leader 记录。
    1. 旧主库隔离(Fencing):若旧主库可能存活,需确保其不能继续写入(避免脑裂)。方法:
    • Patroni 调用脚本(如 pg_ctl stop -m fast, kill -9, iptables 阻断端口,或通过管理接口关机)。
    • 硬件/云层面的隔离(STONITH)。
    1. 重新配置复制:剩余备库自动根据 DCS 中的新主库信息,使用 pg_rewind(若旧主库可连接且时间线未偏离太多)或重建方式(pg_basebackup)重新指向新主库复制。

三、负载均衡与连接路由

确保应用连接始终指向可用主库或分发到只读备库。

  1. 读写分离(Read/Write Splitting)

    • 应用层实现:应用代码根据 SQL 类型(读/写)选择连接主库或只读备库池。需框架支持(如 Java 的 ShardingSphere, Python 的 SQLAlchemy)。
    • 中间件实现
      • Pgpool-II:位于应用和 PG 之间。解析 SQL,将写请求路由到主库,读请求路由到备库池。支持连接池、负载均衡算法(round-robin, least conn)。注意:启用负载均衡时需禁用其内建 HA 管理以避免冲突(推荐用 Patroni 管理 HA)。
      • HAProxy:TCP 层代理。需结合外部机制(如 Patroni REST API)动态更新主库和备库列表的健康检查状态。
      • 云负载均衡器(如 AWS ELB/NLB, GCP Load Balancer):配合健康检查使用。
  2. 主库连接路由

    • 虚拟 IP(VIP):主库绑定一个 VIP。故障转移时,新主库接管该 VIP(通过 arping, VRRP/Keepalived 或云供应商的浮动 IP)。
    • DNS 更新:故障转移后更新 DNS 记录指向新主库 IP(TTL 需足够短)。响应慢,通常作为备用方案。
    • 服务发现:应用通过查询 DCS(如 Consul DNS Interface)或 Patroni REST API (GET /primary) 动态获取当前主库地址。现代云原生应用常用方式。

四、推荐高可用架构方案

  1. 经典方案:Patroni + PSR + HAProxy/Keepalived

    • 节点:1 主 + N 同步/异步备库(至少 2 个节点)。
    • HA 管理:Patroni + etcd/Consul(3节点避免脑裂)。
    • 连接路由:
      • 写请求:应用连接 VIP(由 Keepalived 管理)或通过 HAProxy(配置主库健康检查)。
      • 读请求:HAProxy 负载均衡到所有健康备库。
    • 优点:成熟、灵活、社区支持好。
  2. 云原生方案:Patroni + PSR + Kubernetes Service

    • 在 K8s 上部署 PostgreSQL StatefulSet。
    • Patroni 使用 K8s API 作为 DCS(替代 etcd)。
    • 读写服务:K8s Service ClusterIPLoadBalancer,后端指向 Patroni 管理的 Leader Pod。
    • 只读服务:指向非 Leader Pods。
    • 优点:无缝集成 K8s 生态(监控、日志、滚动更新)。
  3. 托管数据库服务(RDS/Aurora, Cloud SQL, Azure DB)

    • 使用云服务商提供的 HA 方案(通常基于 PSR 或共享存储)。
    • 自动处理复制、备份、故障转移、维护窗口。
    • 优点:省运维,开箱即用。缺点:成本较高,灵活性受限。

五、关键注意事项

  1. 监控告警

    • 核心指标:节点状态、主备延迟(pg_stat_replication)、连接数、锁、WAL 积压、存储空间、HA 管理器状态。
    • 工具:Prometheus + Grafana(配合 postgres_exporter)、Zabbix、云监控。
  2. 定期备份:HA ≠ 备份!必须保留独立于主集群的 PITR 备份(如 pg_basebackup + WAL 归档到 S3/MinIO)。

  3. 测试!测试!测试!

    • 定期模拟主库宕机(kill -9 postgres, 关机),验证故障转移时间(RTO)和数据丢失量(RPO)。
    • 测试网络分区场景,确保脑裂防护生效。
  4. 脑裂防护(Split-Brain Prevention)

    • 严格依赖 DCS 的分布式锁和租约机制。
    • 配置足够的备库(建议至少 2 个)。
    • 使用隔离(Fencing)机制。
  5. 应用重连机制

  • 应用需处理连接中断,实现自动重试和重连(使用支持自动重连的连接池)。

总结:

实现 PostgreSQL 高可用性的黄金标准是:物理流复制(PSR) + Patroni(管理故障转移) + HAProxy/PGBouncer(连接池/路由) + 分布式存储(etcd/Consul) + 严格监控。根据环境(自建/云)和需求选择具体组件,并通过充分测试确保方案可靠性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/92853.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/92853.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/92853.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache Ignite 生产级的线程池关闭工具方法揭秘

Apache Ignite 中用于 安全、可靠地关闭线程池&#xff08;ExecutorService&#xff09; 的关键逻辑。我们来一步步深入理解它的设计思想和实现细节。&#x1f9f1; 一、核心方法&#xff1a;U.shutdownNow(...) public static void shutdownNow(Class<?> owner, Nullab…

Unity:GUI笔记(一)——文本、按钮、多选框和单选框、输入框和拖动条、图片绘制和框绘制

写在前面&#xff1a;写本系列(自用)的目的是回顾已经学过的知识、记录新学习的知识或是记录心得理解&#xff0c;方便自己以后快速复习&#xff0c;减少遗忘。主要是唐老师的课程。一、重要参数、文本、按钮GUI相关代码需要写在private void OnGUI()中。该函数每帧执行&#x…

wordpress从wp_nav_menu中获取菜单项

从wp_nav_menu中获取菜单项&#xff0c;然后检查这些菜单项是否对应分类(Category)&#xff0c;并输出这些分类的ID。 以下是完整的代码实现&#xff1a; <?php // 获取指定菜单位置的菜单项 $menu_items wp_get_nav_menu_items(wodepress); // wodepress 是菜单位置的名…

第4章 程序段的反复执行2 while语句P128练习题(题及答案)

&#xff08;&#xff08;1&#xff09;阅读程序#include <bits/stdc.h> using namespace std; //汤永红 int main(){int n,s0;cin >> n;while(n){s s * 10 n % 10;n / 10;}cout << s << endl;return 0; }分别输入&#xff1a;0 1024 1234567890输出…

图解软件系统组成

这是基于 ​​PlantUML​​ 绘制的软件系统组成部分思维导图&#xff0c;聚焦技术路线与文件类型的对应关系&#xff0c;采用分层架构展示核心模块&#xff1a;startmindmap * **软件系统组成部分*** **一、核心技术栈*** 后端技术* 技术路线: Python Web 框架* 文件类型: .py …

【传奇开心果系列】Flet框架实现的多人访问web数据表高并发前后端自定义框架模板

Flet框架实现的多人访问web数据表高并发前后端自定义框架模板一、效果展示截图二、应用场景介绍1. **多用户实时协作**2. **产品管理**3. **数据可视化**三、特色说明1. **实时通信**2. **高性能**3. **用户友好的界面**4. **日志记录**5. **安全性**四、总结五、源码下载地址六…

农业智慧大屏系统 - Flask + Vue实现

下面我将实现一个完整的农业智慧大屏系统&#xff0c;使用Flask作为后端框架&#xff0c;前端使用Vue.js结合ECharts进行数据可视化展示。 设计思路 前端部分&#xff1a; 使用Vue.js构建响应式界面 使用ECharts实现各类农业数据可视化 使用CSS Grid布局实现大屏适配 后端…

Linux中Https配置与私有CA部署指南

Linux中Https配置与私有CA部署指南 一、HTTPS 核心概念特性HTTPHTTPS协议明文传输HTTP SSL/TLS端口80443加密未加密数据加密二、SSL/TLS 握手流程 Client → Server ClientHello&#xff1a;支持哪些版本、支持哪些加密算法&#xff0c;随机生成一组32字节数据 random_c Serve…

【软考架构】主流数据持久化技术框架

JDO与JPA JDO&#xff08;Java Data Objects&#xff09;和JPA&#xff08;Java Persistence API&#xff09;都是Java中用于对象持久化的规范&#xff0c;但它们在设计目标、技术背景和应用场景上存在显著区别。以下是两者的核心对比&#xff1a;1. 规范背景与维护方 JDO&…

服务日志、监控

服务怎么做监控和告警使用 Prometheus 和 Grafana 来实现整个微服务集群的监控和告警&#xff1a;Prometheus&#xff1a;Prometheus 是一个开源的监控系统&#xff0c;具有灵活的数据模型和强大的查询语言&#xff0c;能够收集和存储时间序列数据。它可以通过 HTTP 协议定期拉…

秋招笔记-8.12

我决定从今天开始&#xff0c;在每天的学习内容中加入算法的内容&#xff0c;大致分布时间的话&#xff0c;假设我一天可以学习八个小时&#xff0c;那算法两个小时&#xff0c;八股三个小时&#xff0c;项目三个小时这样的分布差不多吧。之所以还是需要做做笔试一是为了应对面…

【从0带做】基于Springboot3+Vue3的校园表白墙系统

大家好&#xff0c;我是武哥&#xff0c;最近给大家手撸了一个基于SpringBoot3Vue3的校园表白墙系统&#xff0c;可用于毕业设计、课程设计、练手学习&#xff0c;系统全部原创&#xff0c;如有遇到网上抄袭站长的&#xff0c;欢迎联系博主~ 资料获取方式 请点开作者头像看下…

【Linux系列】服务器 IP 地址查询

博客目录一、hostname 命令&#xff1a;简单高效的 IP 查询工具命令详解实际应用技巧注意事项二、ip 命令&#xff1a;新一代网络配置全能工具基本用法在服务器管理和网络运维中&#xff0c;快速准确地获取服务器的 IP 地址是一项基本但至关重要的技能。无论是进行远程连接、配…

【完美解决】在 Ubuntu 24.04 上为小米 CyberDog 2 刷机/交叉编译:终极 Docker 环境搭建指南

摘要 本文旨在为广大开发者提供一份在非官方推荐的 Ubuntu 24.04 系统上&#xff0c;成功为小米机器狗 CyberDog 2 进行刷机和交叉编译的终极解决方案。通过层层排查 setup.sh 依赖缺失、No devices to flash 以及交叉编译 Segmentation fault 等疑难杂症&#xff0c;我们发现根…

XX生产线MES系统具体实施方案

一、系统架构设计1. 整体架构图2. 技术组件清单模块技术选型部署要求应用服务Spring Boot 3.2 Spring CloudKubernetes Pod (4C8G)实时通信Kafka 3.6 WebSocket3节点集群工业协议Eclipse Milo (OPC UA)独立服务器 (2C4G)数据库PostgreSQL 15 TimescaleDB 2.10SSD存储, 主从复…

Go语言实战案例:使用模板渲染HTML页面

在 Web 开发中&#xff0c;身份验证是一个绕不开的话题。传统的 Session 机制依赖服务器存储用户状态&#xff0c;而在微服务、分布式架构下&#xff0c;这种方式可能会导致状态同步困难。 JWT&#xff08;JSON Web Token&#xff09;是一种无状态的、跨平台的身份验证解决方案…

@RequestMapping接收文件格式的形参(方法参数)

需求&#xff1a;将文件上传到OSS&#xff0c;忽略域名与路径&#xff0c;将文件名以 “img1.png,img2.png,img3.png”保存到数据库中 1、先看结果 后端要接收postman传递的file文件2、SpringBoot接收参数方式 很显然&#xff0c;上面postman上传的地方可以传入多个文件&#x…

【数据分享】2020-2022年我国乡镇的逐日最高气温数据(Shp/Excel格式)

之前我们分享过2020—2022年中国0.01分辨率逐日最高气温栅格数据&#xff08;可以查看之前的文章获悉详情&#xff09;&#xff01;该数据是研究者张凌, 胡英屹等发布在国家冰川冻土沙漠科学数据中心平台上的高分辨最高气温数据。很多小伙伴拿到数据后反馈栅格数据不太方便使用…

为什么C++主函数 main 要写成 int 返回值 | main(int argc, char* argv[]) 这种写法是什么意思?

主函数 main 要写成 int 返回值&#xff1f;main(int argc, char* argv[]) 为什么里面没有 cin 也能读到数据&#xff0c;数据是怎么传进去的&#xff1f;本文将一步步回答这些问题。1. 为什么 main 要写成 intC 标准&#xff08;ISO/IEC 14882&#xff09;规定&#xff0c;mai…

【oracle闪回查询】记录字段短时间被修改的记录

SELECT versions_starttime, versions_endtime, versions_operation, versions_xid, [字段1], [字段2] – 替换为实际字段名 FROM 表名 VERSIONS BETWEEN TIMESTAMP SYSTIMESTAMP - INTERVAL ‘15’ MINUTE AND SYSTIMESTAMP --15分钟内 WHERE id ‘目标ID’ – 指定记录的唯…