PgPool 透過定期建立資料庫連線來檢測後端節點健康狀態:
main()
→ PgpoolMain()
→ processState = PERFORMING_HEALTH_CHECK
→ do_health_check()
→ make_persistent_db_connection() // 嘗試建立持久連線
→ discard_persistent_db_connection() // 丟棄連線
連線建立失敗 → 拋出異常 → 統一異常處理點
→ 超過重試次數 (health_check_max_retries)
→ 降級後端 (degenerate_backend_set)
→ 觸發 failover_command
failover() 函數執行以下 9 步驟:
backend_status = CON_DOWNnew_masterpgpool.conf 設定的腳本pg_is_in_recovery() != 't' 的節點health_check_period = 3 # 檢查間隔 (秒)
health_check_timeout = 20 # 超時時間 (秒)
health_check_user = 'admin' # 檢查用戶
health_check_password = 'admin' # 檢查密碼
health_check_database = 'postgres' # 檢查資料庫
health_check_max_retries = 0 # 最大重試次數 (0=不重試)
failover_command = '/path/failover.sh %h %H %d %P' # 切換腳本
fail_over_on_backend_error = on # 錯誤時自動切換
| 佔位符 | 含義 | 範例 |
|---|---|---|
| %h | 故障節點主機名 | node1 |
| %H | 新 Primary 主機名 | node2 |
| %d | 故障節點 ID | 0 |
| %P | 舊 Primary ID | 0 |
| %r | 新 Primary ID | 1 |
| %R | 新 Primary 埠號 | 5433 |
| %% | 字面 % 符號 | % |
health_check_max_retries > 0 避免網路抖動誤觸發failover_command 腳本需冪等、可重入、有詳細日誌tail -f /var/log/pgpool/pgpool.log