首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

PgPool 健康檢查與 Failover 機制原始碼深度解析

     編輯:Java 綜合教學

健康檢查流程

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 切換完整流程

failover() 函數執行以下 9 步驟:

  1. 確認後端狀態:再次檢查,無效則設 backend_status = CON_DOWN
  2. 選出新 Primary:尋找第一個狀態正常的後端作為 new_master
  3. 殺死所有子進程:切斷所有客戶端連線,隔離故障節點 (PgPool 獨特優勢)
  4. 執行 failover_command:呼叫 pgpool.conf 設定的腳本
  5. 搜尋新 Primary:若故障為 Primary,查找 pg_is_in_recovery() != 't' 的節點
  6. 重啟子進程:恢復連線池服務
  7. 通知 Worker 進程:發送 restart 通知
  8. 通知 PCP 子進程:Failover 完成通知
  9. 發送 restart 給 PCP 進程

關鍵配置參數

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    # 錯誤時自動切換

Failover 腳本參數說明

佔位符含義範例
%h故障節點主機名node1
%H新 Primary 主機名node2
%d故障節點 ID0
%P舊 Primary ID0
%r新 Primary ID1
%R新 Primary 埠號5433
%%字面 % 符號%

生產環境建議

  • 設定 health_check_max_retries > 0 避免網路抖動誤觸發
  • failover_command 腳本需冪等、可重入、有詳細日誌
  • 監控 PgPool 日誌:tail -f /var/log/pgpool/pgpool.log
  • 定期演練 Failover 切換與恢復流程
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved