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.mzph.cn/diannao/82097.shtml

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

相关文章

【多种不同提交方式】通过springboot实现与前端网页数据交互(非常简洁快速)

【多种不同提交方式】通过springboot实现与前端网页数据交互 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是springboot的使用。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性。【帮帮志系列文章】&am…

使用 AI 如何高效解析视频内容?生成思维导图或分时段概括总结

一、前言 AI 发展的如此迅速&#xff0c;有人想通过 AI 提效对视频的解析&#xff0c;怎么做呢&#xff1f; 豆包里面有 AI 视频总结的功能&#xff0c;可以解析bilibili网站上部分视频&#xff0c;如下图所示&#xff1a; 但有的视频解析时提示&#xff1a; 所以呢&#x…

鞅与停时 - 一种特别的概率论问题

讨论一个有趣的概率问题&#xff1a; [P3334 ZJOI2013] 抛硬币 - 洛谷 实际上是一个猴子打字问题&#xff0c;考虑一直无规律随即打字的猴子&#xff0c;键盘上只有A-Z一共26个字母&#xff0c;对于一个特定的字符串 S S S &#xff1a; ABCABCAB &#xff0c;能否在有限的打…

arcgis和ENVI中如何将数据输出为tif

一、arcgis中转换为tif 右键图层&#xff1a; Data -> Export Data, 按照图示进行选择&#xff0c;选择tiff格式导出即可&#xff0c;还可以选择其他类型的格式&#xff0c;比如envi。 二、 ENVI中转换为tif File -> Save As -> Save As (ENVI, NITF, TIFF, DTED) …

如何用命令行判断一个exe是不是c#wpf开发的

在powershell下执行 $assembly [Reflection.Assembly]::ReflectionOnlyLoadFrom("你的exe全路径") $references $assembly.GetReferencedAssemblies() echo $assembly $references | Where-Object { $_.Name -match "PresentationFramework|PresentationCore…

2025.05.07-华为机考第三题300分

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 城市紧急救援队伍协同规划 问题描述 智慧城市建设中,卢小姐负责设计一套紧急救援队伍协同系统。城市被规划为一个 n n n \times n

深入理解Redis SDS:高性能字符串的终极设计指南

&#x1f4cd; 文章提示 10分钟掌握Redis核心字符串设计 | 从底层结构到源码实现&#xff0c;揭秘SDS如何解决C字符串七大缺陷&#xff0c;通过20手绘图示与可运行的C代码案例&#xff0c;助你彻底理解二进制安全、自动扩容等核心机制&#xff0c;文末附实战优化技巧&#xff…

jupyter notebook汉化教程

本章教程记录&#xff0c;jupyter notebook汉化步骤&#xff0c;如果对汉化有需求的小伙伴可以看看。 一、安装jupyter 如果你是安装的anaconda的那么默认是包含了Jupyter notebook的&#xff0c;如果是miniconda或者基础python&#xff0c;默认是不包含的jupyter组件的&#x…

模拟设计中如何减小失配

Xx 芯片测试结果显示&#xff0c;offset 指标偏高&#xff0c;不符合指标要求。所以查看了资料&#xff0c;温习了减小的失配的方法。 注意点一&#xff1a; 将所有offet折算到输入端&#xff0c;得到以下公式&#xff1a; 可以看到a&#xff09;阈值电压失配直接折算成输…

C++ 与 Lua 联合编程

在软件开发的广阔天地里&#xff0c;不同编程语言各有所长。C 以其卓越的性能、强大的功能和对硬件的直接操控能力&#xff0c;在系统开发、游戏引擎、服务器等底层领域占据重要地位&#xff0c;但c编写的程序需要编译&#xff0c;这往往是一个耗时操作&#xff0c;特别对于大型…

烤箱面包烘焙状态图详解:从UML设计到PlantUML实现

题目&#xff1a;假设你正着手设计一个烤箱。建立一个跟踪烤箱中面包状态的状态图。要包括必要的触发器事件、动作和监视条件。 一、状态图概述 状态图是UML&#xff08;统一建模语言&#xff09;中的一种行为图&#xff0c;它用于描述系统中对象的状态变化以及触发这些变化的…

三款实用工具推荐:配音软件+Windows暂停更新+音视频下载!

各位打工人请注意&#xff01;今天李师傅掏出的三件套&#xff0c;都是经过实战检验的效率放大器。先收藏再划走&#xff0c;说不定哪天就能救命&#xff01; 一.祈风TTS-配音大师 做短视频的朋友肯定深有体会——配个音比写脚本还费劲&#xff01;要么付费买声音&#xff0c…

物流无人机结构与载货设计分析!

一、物流无人机的结构与载货设计模块运行方式 1.结构设计特点 垂直起降与固定翼结合&#xff1a;针对复杂地形&#xff08;如山区、城市&#xff09;需求&#xff0c;采用垂直起降&#xff08;VTOL&#xff09;与固定翼结合的复合布局&#xff0c;例如“天马”H型无人机&am…

Decode rpc invocation failed: null -> DecodeableRpcInvocation

DecodeableRpcInvocation 异常情况解决方法 错误警告官方FAQ 异常情况 记录一下Dubbo调用异常 java.util.concurrent.ExecutionException: org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2025-05-07 22:09:5…

Excel VBA 词频统计宏

在Excel中&#xff0c;我们经常需要分析文本数据&#xff0c;例如统计某个单词或短语在文档中出现的次数。虽然Excel本身提供了一些文本处理功能&#xff08;如COUNTIF&#xff09;&#xff0c;但对于复杂的词频统计&#xff0c;手动操作可能效率低下。这时&#xff0c;VBA宏可…

DRV8301 三相电机驱动芯片的硬件参数与应用设计

DRV8301 硬件参数分析 1. 电源与驱动能力 输入电压范围&#xff1a;PVDD1&#xff08;主电源&#xff09;6V~60V&#xff0c;PVDD2&#xff08;降压转换器电源&#xff09;3.5V~60V&#xff0c;支持宽电压应用场景。 驱动电流&#xff1a;1.7A 源极驱动电流&#xff08;Sourc…

QT Sqlite数据库-教程03 插入数据-下

【1】手动提交事务 #include <QtSql/QSqlDatabase> #include <QtSql/QSqlQuery> #include <QtSql/QSqlRecord>QSqlDatabase db; db.transaction(); for(int i0; i<100000; i){QSqlQuery cmd(QString("UPDATE %1 SET %2%3 WHERE id%4").arg(tab…

LeetCode 每日一题 2025/4/28-2025/5/4

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 4/28 2302. 统计得分小于 K 的子数组数目4/29 2962. 统计最大元素出现至少 K 次的子数组4/30 1295. 统计位数为偶数的数字5/1 2071. 你可以安排的最多任务数目5/2 838. 推多…

三、Hadoop1.X及其组件的深度剖析

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月7日 专栏&#xff1a;Hadoop教程 一、Hadoop 1.X 概述 &#xff08;一&#xff09;概念 Hadoop 是 Apache 开发的分布式系统基础架构&#xff0c;用 Java 编写&#xff0c;为集群处理大型数据集提供编程模型&#xff0c;…

Java中字符转数字的原理解析 - 为什么char x - ‘0‘能得到对应数字

前言 在Java编程中&#xff0c;我们经常需要将字符形式的数字转换为实际的数值。有很多方法可以实现这一转换&#xff0c;比如使用Integer.parseInt()或Character.getNumericValue()等方法。但有一种简便且高效的方式是直接使用char - 0运算&#xff0c;本文将详细解析这种方法…