Postgresql

PostgreSQL 故障轉移:誰負責處理?客戶如何連接到新的領導者?

  • March 3, 2020

在高層次上,考慮兩個獨立節點上的兩個 PostgreSQL 實例:領導者及其熱備用。配置了從領導者到追隨者的複制。

考慮領導節點崩潰。兩個問題:

  1. 誰負責提拔追隨者成為新的領導者?您是否必須設置某種心跳系統,還是由 PostgreSQL 自動處理?
  2. 依賴 PostgreSQL 的客戶端現在必須知道領導者已更改。為客戶提供無縫連接的最佳方式是什麼?它有 PostgreSQL 提供的自動程序嗎?

對於問題 2,我想到了一些想法,其中外部伺服器或熱備用跟隨者將心跳領導者。如果領導者被認為已死亡,請執行以下操作之一:

  • 客戶端通過主機名連接到 PostgreSQL 實例。在故障轉移時,心跳伺服器將更改 DNS 條目以指向新的領導節點。
  • 客戶端通過 IP 連接到 PostgreSQL 實例。浮動 IP 的脈絡,其中心跳伺服器廣播 ARP 請求以更新交換機的 MAC 表,以便將 IP 指向新的領導者。
  • 客戶端通過 ZooKeeper 提供的 IP 連接到 PostgreSQL 實例。心跳伺服器會將 ZooKeeper 上的條目更新為新的領導者。

你能幫我回答前兩個問題,並斷言問題 2 提案的有效性嗎?

  1. https://www.postgresql.org/docs/12/warm-standby-failover.html說:

PostgreSQL 不提供辨識主數據庫故障並通知備用數據庫伺服器所需的系統軟體。許多此類工具已經存在,並且與成功故障轉移所需的作業系統設施(例如 IP 地址遷移)很好地集成在一起。

是的,你必須設置一些東西。

  1. PostgreSQL 不為客戶端提供自動程序。

廣告1:你有責任。您將不得不使用像 Patroni 這樣的第三方軟體。當心嘗試使用幾個 shell 腳本自己編寫集群件。

廣告 2:如果您使用如下連接字元串,PostgreSQL 客戶端庫(和 JDBC 驅動程序)可以自動執行此操作:

host=server1,server2 port=5432,5432 dbname=mydb user=myuser target_session_attrs=read-write

引用自:https://dba.stackexchange.com/questions/261121