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

PostgreSQL Patroni集群组件作用介绍:Patroni、etcd、HAProxy、Keepalived、Watchdog

1. Watchdog 简介

1.1 核心作用

• 主节点故障检测

Watchdog 会定时检测数据库主节点(或 Pgpool 主节点)的运行状态。

一旦主节点宕机,它会发起故障切换请求。
• 协调主备切换

多个 Pgpool 节点时,Watchdog 保证只有一个 Pgpool 处于“主”状态,避免混乱。

使用仲裁机制或投票(通常通过 VIP、网络心跳或 quorum 判定)决定新的主节点。
• 避免脑裂

防止两个节点误判对方故障后“各自称王”导致的数据不一致。

Watchdog 通过 心跳机制(heartbeat)+ 仲裁机制(arbitrator)+ VIP 管理,确保集群有单一主节点。
• 管理 VIP

Watchdog 控制一个浮动 IP(VIP),将其绑定到当前 Pgpool 主节点上。

客户端连接 VIP,无感知主备切换。

1.2 工作方式

(以 Pgpool-II 为例)
+-------------+     +-------------+     +-------------+
|  Pgpool 1   |<--->|  Pgpool 2   |<--->|  Pgpool 3   |
|  (主节点)   |     | (备用节点)  |     | (备用节点)  |
+-------------+     +-------------+     +-------------+
        |                   |                    |
        +--- VIP 地址由 Watchdog 绑定在主 Pgpool 上 ---+

节点通过心跳机制与仲裁机制协调主备身份并自动迁移 VIP。

心跳探测:每个 Pgpool Watchdog 互相通过 ping/TCP 检测存活状态。

仲裁:可以通过“仲裁者主机”或“第三方 etcd/Zookeeper”做一致性投票。

自动切换 VIP:主 Pgpool 宕机后,VIP 自动迁移到新的主节点。

1.3 应用场景

场景

是否需要 Watchdog

单节点 Pgpool

不需要

多节点 Pgpool + 自动主备切换

必须使用

提供高可用虚拟 IP(VIP)

必须使用

防止脑裂或双主场景

必须使用

2. etcd 简介

etcd 是一个开源的、分布式的键值存储系统,广泛用于服务发现、配置管理和主备协调等场景。

2.1 核心作用

• 存储 PostgreSQL 集群状态

etcd 存储整个 PostgreSQL 集群的元信息和状态信息,例如:

当前的主节点是谁(Leader)

各节点的健康状态

Patroni 实例的注册信息(IP、端口、角色等)

Failover 请求等

这样,所有节点都可基于 etcd 的一致性视图做决策,避免分歧。
• 分布式一致性协调器

etcd 基于 Raft 协议,提供分布式系统中一致性的基础,作用类似:

Zookeeper

Consul

etcd 保证任意节点都能看到相同的集群状态,从而在故障转移或主从切换时作出正确判断。
• 提供锁机制

Patroni 使用 etcd 的 分布式锁(Leader Key) 来决定主节点。

借助 etcd 的 TTL 租约机制,主节点需定期续约,否则失去主控权。

保证只有一个主节点存在(Single Leader),防止脑裂。

2.2 架构示意图


+----------------+         +-------------+
| Patroni 节点 A | <-----> |     etcd     |
| PostgreSQL主库 |         +-------------+
+----------------+                ↑
                            状态存储
+----------------+         +-------------+
| Patroni 节点 B | <-----> |     etcd     |
| PostgreSQL从库 |         +-------------+
+----------------+
关键行为:

所有 Patroni 节点向 etcd 注册自身状态。

Patroni 主节点持有一个 etcd 的“Leader 锁”键(带 TTL)。

主节点宕机后 TTL 过期,锁自动释放,其他节点竞争新主。

2.3 典型用途

用途

示例系统

服务发现

Kubernetes

配置中心

Istio、Traefik

主备协调

Patroni、TiDB

分布式锁

主选举场景

2.4 特性总结

特性

说明

数据一致性

使用 Raft 实现强一致性

高可用部署

支持奇数节点,允许少数节点宕机

分布式锁

用于主节点选举

监控 & 续租

主节点失联自动释放锁

易部署

单一二进制与配置文件即可

3. Patroni 简介

Patroni 是一个开源的 PostgreSQL 高可用(HA)管理工具,专为构建自动化主备切换、健康检查、集群协调的 PostgreSQL 集群而设计。

它不是数据库本身,而是一个控制器,负责维护 PostgreSQL 的主从架构,并在主节点宕机时自动选择一个新主节点,保证服务连续性。

3.1 核心作用

• 自动主从切换

当 Patroni 监测到主库不可用时,会自动发起主从切换流程。

通过协调系统(如 etcd、Consul、ZooKeeper)选出新的主节点。
• 分布式选主

依赖后端协调服务(如 etcd)的分布式锁(leader key)机制,确保只有一个主节点存在。

有效防止脑裂(Split-Brain)现象。
• 集群状态管理

所有 Patroni 节点将自己的状态(角色、健康、PostgreSQL 配置等)注册到共享存储(如 etcd)。

客户端如 HAProxy、pgbouncer 可以通过 Patroni API 查询集群健康信息。
• 自动配置 PostgreSQL 复制

Patroni 自动配置 streaming replication(流复制),支持同步或异步模式。

自动处理 pg_hba.conf、主备配置差异、recovery.conf(或 standby.signal)等。
• 提供 REST API 接口

每个节点运行一个 HTTP REST API,可用于:

查询节点状态

手动发起 failover/switchover

管理维护模式(pause/resume)

3.2 架构示意图


+----------------------+          +----------------------+
|   PostgreSQL 主节点  |          |   PostgreSQL 从节点  |
|      Patroni         | <----->  |      Patroni         |
+----------------------+          +----------------------+
          |                                 |
          +-------------+   +---------------+
                          |   |
                     +---------+
                     |  etcd   |  <- 协调主选举
                     +---------+
所有节点通过 etcd 协调主节点身份。

Patroni 定期健康检查本地 PostgreSQL,并与集群中其他节点同步状态。

3.3 配套工具

工具/组件

作用

etcd / Consul

分布式一致性协调

HAProxy / pgbouncer

客户端连接负载均衡

WAL-G / Barman

备份与恢复

3.4 Patroni vs 其它 HA 方案

特性

Patroni

Pgpool-II

repmgr

主从切换

自动

半自动(需配置)

自动或手动

状态协调

etcd/Consul 支持

无状态或 Watchdog

无(自己维护)

配置自动化

架构复杂度

高(需 watchdog)

低(轻量)

4. HAProxy 简介

在 PostgreSQL 高可用集群中,HAProxy 充当的是客户端访问的统一入口,起到流量转发、负载均衡、故障切换引导的作用。

4.1 核心作用

• 客户端统一访问入口

无论 PostgreSQL 的主节点如何切换,客户端始终通过 HAProxy 的 IP 和端口连接。

客户端无需知道谁是当前主节点,避免频繁改配置。
• 主从识别自动转发

HAProxy 可结合 Patroni 的 REST API 判断当前主库。

根据主备角色,将写请求转发到主库,将读请求转发到从库(可实现读写分离)。
• 负载均衡

在读请求场景中(例如只读查询、BI分析),HAProxy 可将请求负载均衡到多个只读从库。
• 健康检查

自动探测数据库节点是否在线。

可通过 TCP 检查 PostgreSQL 端口、或调用 Patroni 的 /health HTTP API 返回状态。
• 支持 VIP 高可用

多个 HAProxy 节点 + VIP 浮动可实现自身的高可用,不再是单点。

4.2 架构示意图

HAProxy 架构图(结合 Patroni)


+-------------+        +------------------+
|   客户端     | -----> |   HAProxy 节点    |
+-------------+        +--------+---------+
                               |
         +---------------------+---------------------+
         |                     |                     |
+-------------+   +-------------------+   +-------------------+
| Patroni 主库 |   | Patroni 从库 1    |   | Patroni 从库 2    |
+-------------+   +-------------------+   +-------------------+

4.3 示例场景

功能需求

HAProxy 配置方式

主库写请求

frontend → backend 主节点(只选 leader)

从库读请求

frontend → backend 所有 follower 节点

健康检查

每隔几秒请求 Patroni API

故障自动切换

新主上线后自动切换到新主

多个 HAProxy 节点

使用 Keepalived + VIP

4.4 示例配置片段

主库健康检查:
frontend pgsql_front
    bind *:5432
    default_backend pgsql_primary

backend pgsql_primary
    option httpchk GET /master
    server node1 192.168.1.101:5432 check port 8008
    server node2 192.168.1.102:5432 check port 8008
    server node3 192.168.1.103:5432 check port 8008
说明:

port 8008 是 Patroni 默认的 HTTP API 端口。

GET /master 是自定义脚本或 HTTP 返回判断是否为主库。

4.5 特性总结

功能

写请求引导

只连接主库,防止写入从库

读写分离

可配置多个 frontend/backend

故障自动绕行

通过健康检查绕过不可用节点

无感主备切换

客户端无需关心实际主节点地址

5. Keepalived 简介

在 PostgreSQL 高可用架构中,Keepalived 的主要作用是:通过 VRRP 协议提供高可用的虚拟IP(VIP)漂移机制,确保即使服务节点发生故障,客户端仍然能通过一个固定 IP 无缝访问数据库或中间件(如 HAProxy),实现 PostgreSQL 集群访问地址的高可用。

5.1 核心作用

• 虚拟 IP (VIP) 漂移

Keepalived 运行在多个节点上,多个节点共享一个 VIP(Virtual IP)。

其中一个节点是 MASTER,持有该 VIP,其他为 BACKUP。

MASTER 节点宕机时,VIP 自动漂移到 BACKUP 节点,实现 IP 的高可用。

• 服务可用性监控

Keepalived 可配置脚本或进程监控(如 HAProxy、PostgreSQL)。

若检测到服务失败,可主动释放 VIP 并由其它节点接管。

• 实现无单点的访问入口

通常结合 HAProxy 或 Pgpool-II 使用,确保即使一个代理节点宕机,客户端依然可用。

5.2 架构示意图


+------------+   VIP   +------------+   +-----------------+
| HAProxy A | <------> | HAProxy B |---| Patroni/Postgres|
| Keepalived|         |Keepalived |   +------------------+
+------------+         +------------+

客户端通过 VIP(如 192.168.1.100:5432)访问,无感切换。

工作机制

• Keepalived 使用 VRRP 协议,维持节点优先级(priority)来决定谁持有 VIP。

• 定期心跳检测:

如果 MASTER 掉线,BACKUP 自动提升为 MASTER,接管 VIP。

当原 MASTER 恢复,可以自动重新接管(可配置)。

5.3 示例配置


vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        192.168.1.100
    }
    track_script {
        chk_haproxy
    }
}

vrrp_script chk_haproxy {
    script "/etc/keepalived/check_haproxy.sh"
    interval 2
    weight -10
}
说明:

priority 决定主备优先级。

track_script 可用于检测 HAProxy 是否存活。

若脚本返回非 0,则降低优先级,触发 VIP 漂移。

5.4 特性总结

功能

说明

VIP 漂移

提供固定访问 IP,屏蔽后端节点变化

节点高可用

后备节点自动接管服务

主备监控

可结合 HAProxy/Pgpool 状态做切换

零停机切换

客户端连接不中断,无感知漂移

http://www.xdnf.cn/news/3089.html

相关文章:

  • SpringBoot+EasyExcel+Mybatis+H2实现导入
  • 力扣面试150题--删除排序链表中的重复元素 II
  • 4.29[Q]NLP-Exp2
  • uni-app - 小程序使用高德地图完整版
  • Snap7西门子PLC通信协议
  • 【Python魔法方法(特殊方法)】
  • VSCode Verilog编辑仿真环境搭建
  • 松灵PiPER强势突围,攻克具身智能“数据壁垒”
  • [逆向工程]深入理解计算机中的“栈”
  • 内容/社区APP增长:用Deeplink让用户分享的内容“一键直达”
  • 4.2.4 MYSQL的缓存策略
  • C++中vector的扩容过程是怎样的?
  • ARP渗透学习1
  • 农村供水智能化远程监控解决方案
  • std::optional 类是个啥?
  • esp32将partitions.csv文件启用到工程项目中的配置
  • antd pro4 升级 antd5
  • 深入解析:实现一个详细的日志过滤器(LogFilter)
  • 2025年渗透测试面试题总结-拷打题库25(题目+回答)
  • 30天通过软考高项-第一天
  • 刀客doc:小红书商业技术负责人苍响离职
  • 信息系统项目管理师——第10章 项目进度管理 笔记
  • 解决Ollama run qwen3:32b: Error: unable to load model问题
  • 阵列麦克风降噪原理
  • 记录一个单独读取evt.bdf的方法
  • 头歌java课程实验(文件操作)
  • 【CF】Day46——Codeforces Round 967 (Div. 2) B
  • 2025年高级Java后端面试题:最新技术体系深度解析
  • java发送邮件
  • 运行不会存储上一次的命令;运行命令不保存历史记录