乐于分享
好东西不私藏

Patroni 技术文档:配置与高可用机制 #HaishanDB

Patroni 技术文档:配置与高可用机制 #HaishanDB

1. 概述

Patroni 是用于 PostgreSQL 的高可用集群管理器,通过分布式配置存储(DCS)实现自动化故障转移、主节点选举和集群全生命周期管理。它由 Zalando 开源,采用 Python 开发,被公认为当前生产环境最主流的 PostgreSQL 高可用方案。

核心能力:自动故障转移、脑裂防护、节点自愈、跨数据中心灾备。

2. 架构简述

Patroni 集群由三层组成:

·PostgreSQL 节点:实际提供数据库服务,包含一主多备。

·Patroni 守护进程:运行在每个数据库节点上,负责监控、决策和配置同步。

·DCS(分布式配置存储):如 etcd / Consul / ZooKeeper,存储集群状态和元数据,提供领导选举所需的分布式锁。

3. Patroni 配置文件详解

每个节点都需要一份 patroni.yml,以下对核心配置块进行逐段解释。

3.1 基础标识与 DCS 连接

scope: pg_cluster # 集群名称,同一集群所有节点必须一致namespace: /service/ # DCS 中存储路径前缀name: pg1 # 节点名,必须唯一

restapi:listen: 0.0.0.0:8008 # REST API 监听地址connect_address: 192.168.17.20:8008 # 其他节点可访问的地址

etcd:hosts: 192.168.17.20:2379,192.168.17.21:2379,192.168.17.22:2379

·scope用于隔离不同集群,同一套 etcd 中可以有多个 scope

·name用于唯一标识当前节点,一旦运行不建议更改。

3.2 集群初始化与动态配置 (bootstrap)

bootstrap定义集群首次初始化时的参数,以及之后可动态修改的配置。

bootstrap:dcs:ttl: 30 # Leader 锁超时时间(秒)loop_wait: 10 # 主循环间隔(秒)retry_timeout: 10 # DCS 操作重试超时(秒)maximum_lag_on_failover: 1048576 # 允许故障转移的最大复制延迟(字节),超过则备节点不参与选主postgresql:use_pg_rewind: true # 启用 pg_rewind 快速回切旧主use_slots: true # 启用复制槽,防止 WAL 被过早清理parameters:# PostgreSQL 初始化参数(initdbinitdb:– encoding: UTF8– data-checksums# pg_hba 条目pg_hba:– host replication replicator 192.168.17.0/24 md5– host all all 0.0.0.0/0 md5

关键参数说明:

参数

作用

ttl

主节点需在 ttl 秒内刷新领导令牌,超时则令牌失效触发选举

loop_wait

Patroni 检查状态、尝试获取/刷新令牌的间隔

maximum_lag_on_failover

防止数据差异过大的备节点被提升为新主

use_pg_rewind

让旧主可以快速追齐新主时间线,重新加入集群

use_slots

物理复制槽可防止备节点所需 WAL 被清理,避免出现 requested WAL segment has already been removed

3.3 PostgreSQL本地配置

postgresql:listen: 192.168.17.20:5432connect_address: 192.168.17.20:5432 # 其他节点连接本机数据库的地址data_dir: /opt/pgdatabin_dir: /opt/pgsql/binpgpass: /tmp/pgpass # 存储密码文件路径authentication:replication:username: replicatorpassword: replicatorsuperuser:username: postgrespassword: postgresparameters:可在 bootstrap 中定义,也可在此覆盖某些 PostgreSQL 参数max_connections: 200shared_buffers: 256MB

·connect_address必须正确,其他节点通过此地址建立流复制。

·复制用户和超级用户的认证信息用于 Patroni 管理PostgreSQL实例。

3.4 Watchdog 配置

watchdog:

mode: required 

  # required | off | automatic

device: /dev/watchdog

safety_margin: 5 

  # 安全余量,必须小于 ttl

 Patroni 无法续约领导令牌(如进程卡死、网络隔离)时,Watchdog 会触发系统重启当前节点,避免出现双主脑裂。这是防范脑裂的最后一道硬件级防线。

3.5 标签(Tags)

tags:

nofailover: false 

  # true 则该节点不参与自动故障转移的主节点选举

clonefrom: true 

  # 允许其他节点从此节点克隆

可以自定义标签,用于调度

4. 高可用与故障转移机制

4.1 领导令牌与选举

Patroni 的高可用基于DCS提供的 Leader Key(领导令牌) 实现:

·每个节点在主循环中检查是否持有令牌。

·若自己是 Leader,则刷新令牌 TTL;同时确保 PostgreSQL 运行在主模式。

·若未持有令牌但发现集群无主(令牌过期),则尝试通过 DCS 的 CAS 操作获取令牌。成功者提升为主,失败者继续以备节点运行。

·若集群已有主,则本节点自动配置流复制指向当前主节点。

由于DCS保证令牌的唯一性,任意时刻最多只有一个节点能成为主,从机制上杜绝了脑裂。

4.2 自动故障转移流程

当主节点发生故障(如宕机、网络不通、PostgreSQL 崩溃)时:

心跳超时:主节点在 ttl秒内未刷新令牌,令牌过期。

2选举触发:各备节点检测到令牌过期,开始竞选。竞选规则:

·节点本身必须健康,且标记nofailover不为true

·复制延迟需小于maximum_lag_on_failover

·优先选择LSN(日志序列号)更大(即数据更新)的节点。

3提升新主:获胜节点在 DCS 中创建新令牌,执行pg_ctl promote将自己提升为主。

4拓扑重配:Patroni更新DCS中的members信息,其他备节点检测到新主后重新建立流复制。

5原主恢复:当故障节点恢复时,Patroni 检测到它曾为主且已不是最新时间线,会自动使用pg_rewind(若启用)将其快速同步并加入集群为备节点。若 pg_rewind失败,则执行全量pg_basebackup重建。

4.3 手动切换 (Switchover)

计划内维护可通过patronictl switchover平滑切换主备,流程与自动故障转移类似,但更可控:

·Patroni会先确认候选节点健康且延迟在允许范围内。

·先将旧主降级为备,再提升候选节点为主。

·整个过程对应用影响极小。

4.4 脑裂防护三层机制

层次

机制

作用

应用层(Patroni)

失去 Leader 令牌立即降级,不会继续接收写请求

防止双主在应用层共存

协调层(DCS)

强一致性分布式锁,同一时刻仅一个节点持有令牌

保证全局视角唯一主

系统层(Watchdog)

卡死或进程异常时强制重启当前机器

物理确保旧主无法继续服务

4.5 节点自愈与复制管理

·自动重启:PostgreSQL 异常退出后,Patroni自动重启实例。

·自动重建副本:备节点若因 WAL 缺失、时间线分叉等原因无法继续复制,Patroni 会自动从主节点(或 clonefrom标记的节点)全量重建。

·复制槽维护:启用use_slots后,Patroni 会在主节点创建并管理复制槽,防止备节点所需的WAL被清理;故障转移时会自动在新主上创建缺失的槽。

4.6 Standby Cluster(异地灾备集群)

Standby Cluster是一种级联复制方案,用于跨数据中心灾备:

·该集群内部也有一个“Standby Leader”(对主集群而言它只是一个备节点)。

·所有 Standby Cluster内的其他节点从该 Standby Leader复制。

·当主集群整体不可用时,可以将 Standby Cluster提升为独立的新主集群。

适用场景:地理冗余、云迁移、读写分离异地访问、灾备演练。

5. 最佳实践配置建议

·同步复制:通过设置synchronous_mode: truesynchronous_node_count保证至少指定数量的备节点写入成功后才返回提交确认,实现零数据丢失故障转移,但会略微增加写延迟。

·合理设置TTLttl不宜过小(避免网络抖动导致误判)也不宜过大(增大故障转移时间)。通常网络稳定环境设为 30 秒,loop_wait设为 10 秒。

·启用 pg_rewind:建议开启 use_pg_rewind: true,并确保 PostgreSQL 编译时有该功能,这样旧主恢复时无需全量重建。

·监控 REST API:通过 /health/primary/replica等端点集成到监控和负载均衡器中。 #HaishanDB#He3DB#Patroni

感谢阅读,如果这篇文章对你有帮助,欢迎点赞、在看、转发支持。

更多数据库硬核干货、实战避坑指南,请持续关注 「什么都要学点」,一起在数据的世界里精进。