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 狀態做切換 |
零停機切換 | 客戶端連接不中斷,無感知漂移 |