在 PostgreSQL-17 中設置故障轉移插槽

PostgreSQL 17 引入了故障切換插槽,以增強高可用性設置。複製插槽確保在複製過程中數據在節點之間保持可靠和一致,而故障切換插槽則確保在故障切換期間和之後節點之間保持一致性。

故障切換插槽是一項強大的功能,確保邏輯複製可以在切換到待機伺服器後無縫繼續進行。使用故障切換插槽可以自動將邏輯複製插槽同步到主節點和待機節點,顯著減少故障切換期間的停機時間,減少手動干預的需求。

本指南將引導您設置使用新的故障切換插槽功能的高可用性 PostgreSQL 集群。最終,您將擁有一個強大的複製設置,能夠無縫處理故障切換。 

故障切換插槽在歷史透視下的重要性

PostgreSQL 15 中的挑戰

  • 複製插槽綁定到主節點:在 PostgreSQL 15 中,複製插槽僅在主伺服器上創建。如果主伺服器失敗,所有邏輯複製插槽將丟失,導致嚴重的複製延遲和數據丟失。
  • 手動故障切換管理:在故障切換情況下,管理員需要手動在新的主伺服器上重新創建複製插槽,這增加了複雜性,引入了錯誤,並延長了停機時間。
  • 沒有插槽同步:待機伺服器無法知道主要伺服器上的邏輯複寫插槽。這種不同步導致如果發生故障轉移,複寫流將完全重置。

PostgreSQL 16的改進

最小邏輯解碼

PostgreSQL 16引入了一個名為最小邏輯解碼的功能在待機伺服器上:

  • 待機伺服器上的最小解碼:這使得待機伺服器可以解碼WAL日誌以準備進行邏輯複寫,從而在發生故障轉移時啟用預熱插槽。
  • 更快的故障轉移:通過在待機伺服器上預解碼WAL變更,可以在將待機升級為主要時減少複寫延遲。但是,這仍需要一些手動配置以確保順利的故障轉移。

PostgreSQL 17:改變遊戲規則 – 故障轉移插槽

  • 故障轉移插槽:在PostgreSQL 17中引入故障轉移插槽,消除了需要通過自動同步主要和待機伺服器之間的邏輯複寫插槽的手動干預。
  • 自動同步:新的插槽同步工作者確保故障轉移啟用的插槽(故障轉移=true)始終同步,即使主節點處於活動狀態。
  • 無縫切換: 在故障切換時,從備用伺服器接管主要伺服器而不會丟失任何複製槽,確保零數據丟失和持續複製。

功能

PostgreSQL 15

PostgreSQL 16

PostgreSQL 17

邏輯複製

自動槽同步

備用機上的最小邏輯解碼

完整故障切換槽

故障切換處理

需要手動干預

備用機上預熱槽

自動故障切換槽

槽同步至備用機

不支持

最小化,需要配置

自動與slotsync工作者

邏輯複製的高可用性

有限

透過最小解碼改善

具故障切換插槽的無縫集成

使用故障切換插槽創建高可用性集群

本部分將引導您創建一個具有故障切換插槽的PostgreSQL高可用性集群。在我們的示例中,我們將使用以下節點:

  1. 節點A(主服務器)
  2. 節點B(物理待命)
  3. 節點C(邏輯訂閱者)

先決條件

在開始之前,確保您已經:

  • 在所有三個節點上安裝了PostgreSQL 17。
  • 每個節點之間存在無密碼SSH訪問。
  • 對PostgreSQL、PostgreSQL複製和PostgreSQL 配置文件有基本理解。

步驟1:配置主節點(節點A)

1.1 在 NodeA 上初始化集群

在主节点安装 PostgreSQL 后,初始化集群;您可以使用以下命令:

Shell

 

1.2 在 postgresql.conf 文件中配置复制

初始化集群后,编辑位于默认位置 /home/pgedge/nodeA/postgresql.confpostgresql.conf 文件。设置以下参数值:

Shell

 

1.3 更新 pg_hba.conf 文件以允许复制访问

pg_hba.conf 文件管理 PostgreSQL 服务器的客户端身份验证。将以下条目添加到 /home/pgedge/nodeA/pg_hba.conf 以确保复制用户的访问:

Shell

 

然后重新加载配置:

Shell

 

1.4 创建复制用户

然后,登录 PostgreSQL 并创建复制用户:

Shell

 

SQL

 

1.5 创建表并设置发布

接下来,您需要创建一个表并创建相关的发布:

SQL

 

步骤 2:配置物理备用(NodeB)

2.1 初始化 NodeB

安装 PostgreSQL 后,初始化 NodeB:

Shell

 

2.1 创建基本备份

然后,使用 pg_basebackup 来备份集群:

Shell

 

2.2 在 Node-B 上配置 postgresql.conf

修改postgresql.conf文件(位於/home/pgedge/nodeB/postgresql.conf),設置:

Shell

 

2.3 啟用故障切換槽同步

使用psql客戶端登錄到NodeB:

Shell

 

然後,使用以下語句配置NodeB的複製:

SQL

 

退出psql客戶端並重新啟動NodeB:

Shell

 

2.4 驗證槽同步

然後,使用psql重新連接到NodeB並驗證槽是否同步:

SQL

 

第3步:設置邏輯訂閱者(NodeC)

3.1 初始化集群並配置NodeC

安裝完PostgreSQL後,初始化集群;您可以使用以下命令:

Shell

 

然後,編輯/home/pgedge/nodeC/postgresql.conf文件,設置以下參數值:

Shell

 

3.2 在NodeC上創建訂閱

使用以下命令在NodeC上創建訂閱:

Shell

 

第4步:模擬故障轉移並確保連續性

您可以使用以下命令模擬故障轉移並確認複製繼續進行並確保數據完整性被維護。

4.1 模擬故障轉移

使用以下命令模擬NodeA的故障,然後將NodeB從待機提升為主要:

Shell

 

4.2 更新NodeC上的訂閱

在推广 nodeB 之后,登录到 NodeC 并更新连接,以反映 NodeB 现在是主节点:

SQL

 

4.3 验证数据连续性

为了测试复制,请使用 psql 登录到 Node-B(现在是主节点):

SQL

 

检查 Node-C 上的复制:

SQL

 

结论

PostgreSQL 17 的故障转移槽功能允许在逻辑复制环境中实现无缝故障转移。通过按照本指南中概述的步骤,您可以创建一个高可用集群,确保数据流不间断,即使主服务器发生故障。

通过优化配置并利用 PostgreSQL 17 的新功能,您可以为关键业务应用程序创建一个弹性和高效的数据库基础设施。

Source:
https://dzone.com/articles/setting-up-failover-slots-in-postgresql-17