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 状态做切换 |
| 零停机切换 | 客户端连接不中断,无感知漂移 |

相关推荐
小黄人V2 分钟前
使用skywalking进行go的接口监控和报警
数据库·golang·skywalking
烂漫心空1 小时前
数据库的死锁相关(一)
数据库·sql·mysql
星空1 小时前
Django 学习指南:从入门到精通(大体流程)
数据库·sqlite
码熔burning2 小时前
【MongoDB篇】MongoDB的索引操作!
数据库·mongodb·nosql
Rverdoser2 小时前
服务器和数据库哪一个更重要
数据库
StarRocks_labs2 小时前
StarRocks 查询优化器深度解析
数据库·starrocks·olap·数据查询·查询优化·logical rewrite
爱编程的小新☆2 小时前
【MySQL】增删改查(CRUD)
数据库·mysql
Yooyi_xin2 小时前
合并多个Excel文件到一个文件,并保留格式
数据库·windows·excel
Dklau-c4 小时前
『深夜_MySQL』详解数据库 && 探索数据库是如何存储的
数据库·mysql
程序猿John4 小时前
服务端字符过滤 与 SQL PDO防注入
服务器·数据库·sql