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.pswp.cn/diannao/82097.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82097.shtml
英文地址,請注明出處:http://en.pswp.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;本文將詳細解析這種方法…