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高可用性集群。在我們的示例中,我們將使用以下節點:
- 節點A(主服務器)
- 節點B(物理待命)
- 節點C(邏輯訂閱者)
先決條件
在開始之前,確保您已經:
- 在所有三個節點上安裝了PostgreSQL 17。
- 每個節點之間存在無密碼SSH訪問。
- 對PostgreSQL、PostgreSQL複製和PostgreSQL 配置文件有基本理解。
步驟1:配置主節點(節點A)
1.1 在 NodeA 上初始化集群
在主节点安装 PostgreSQL 后,初始化集群;您可以使用以下命令:
mkdir -p /home/pgedge/nodeA
initdb -D /home/pgedge/nodeA --no-locale -E UTF8
pg_ctl -D /home/pgedge/nodeA -l /home/pgedge/logs/nodeA.log start
1.2 在 postgresql.conf 文件中配置复制
初始化集群后,编辑位于默认位置 /home/pgedge/nodeA/postgresql.conf
的 postgresql.conf
文件。设置以下参数值:
wal_level = logical
max_replication_slots = 10
max_wal_senders = 10
synchronous_standby_names = '*'
synchronized_standby_slots = 'sb1_slot'
port = 5432
1.3 更新 pg_hba.conf 文件以允许复制访问
pg_hba.conf 文件管理 PostgreSQL 服务器的客户端身份验证。将以下条目添加到 /home/pgedge/nodeA/pg_hba.conf
以确保复制用户的访问:
host replication replicator 127.0.0.1/32 md5
然后重新加载配置:
pg_ctl -D /home/pgedge/nodeA reload
1.4 创建复制用户
然后,登录 PostgreSQL 并创建复制用户:
psql -d postgres -p 5432
CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'replicator_password';
1.5 创建表并设置发布
接下来,您需要创建一个表并创建相关的发布:
CREATE TABLE foo (c1 INT PRIMARY KEY);
GRANT SELECT ON foo TO replicator;
CREATE PUBLICATION mypub FOR TABLE foo;
步骤 2:配置物理备用(NodeB)
2.1 初始化 NodeB
安装 PostgreSQL 后,初始化 NodeB:
mkdir -p /home/pgedge/nodeB
initdb -D /home/pgedge/nodeB --no-locale -E UTF8
pg_ctl -D /home/pgedge/nodeB -l /home/pgedge/logs/nodeB.log start
2.1 创建基本备份
然后,使用 pg_basebackup 来备份集群:
mkdir -p /home/pgedge/nodeB
pg_basebackup -D /home/pgedge/nodeB -R -X stream -P -h localhost -p 5432 -U replicator
2.2 在 Node-B 上配置 postgresql.conf
修改postgresql.conf
文件(位於/home/pgedge/nodeB/postgresql.conf
),設置:
port = 5433
primary_conninfo = 'host=localhost port=5432 user=replicator password=replicator_password dbname=postgres application_name=sb1_slot'
primary_slot_name = 'sb1_slot'
hot_standby_feedback = on
sync_replication_slots = on
2.3 啟用故障切換槽同步
使用psql客戶端登錄到NodeB:
psql -d postgres -p 5433
然後,使用以下語句配置NodeB的複製:
ALTER SYSTEM SET sync_replication_slots = on;
ALTER SYSTEM SET hot_standby_feedback = on;
ALTER SYSTEM SET synchronized_standby_slots = 'sb1_slot';
退出psql
客戶端並重新啟動NodeB:
pg_ctl -D /home/pgedge/nodeB restart
2.4 驗證槽同步
然後,使用psql
重新連接到NodeB並驗證槽是否同步:
SELECT slot_name, failover, synced FROM pg_replication_slots;
第3步:設置邏輯訂閱者(NodeC)
3.1 初始化集群並配置NodeC
安裝完PostgreSQL後,初始化集群;您可以使用以下命令:
mkdir -p /home/pgedge/nodeC
initdb -D /home/pgedge/nodeC --no-locale -E UTF8
然後,編輯/home/pgedge/nodeC/postgresql.conf
文件,設置以下參數值:
wal_level = logical
max_replication_slots = 10
max_wal_senders = 10
sync_replication_slots = on
port = 5444
After editing the configuration file, start NodeC:
pg_ctl -D /home/pgedge/nodeC -l /home/pgedge/logs/nodeC.log start
3.2 在NodeC上創建訂閱
使用以下命令在NodeC上創建訂閱:
CREATE SUBSCRIPTION foosub CONNECTION 'dbname=postgres host=localhost port=5432 user=replicator password=replicator_password' PUBLICATION mypub WITH (failover = true);
第4步:模擬故障轉移並確保連續性
您可以使用以下命令模擬故障轉移並確認複製繼續進行並確保數據完整性被維護。
4.1 模擬故障轉移
使用以下命令模擬NodeA的故障,然後將NodeB從待機提升為主要:
pg_ctl -D /home/pgedge/nodeA stop
pg_ctl -D /home/pgedge/nodeB promote
4.2 更新NodeC上的訂閱
在推广 nodeB 之后,登录到 NodeC 并更新连接,以反映 NodeB 现在是主节点:
ALTER SUBSCRIPTION foosub DISABLE;
ALTER SUBSCRIPTION foosub CONNECTION 'dbname=postgres host=localhost port=5433 user=replicator password=replicator_password';
ALTER SUBSCRIPTION foosub ENABLE;
4.3 验证数据连续性
为了测试复制,请使用 psql
登录到 Node-B(现在是主节点):
INSERT INTO foo VALUES (3), (4);
检查 Node-C 上的复制:
SELECT * FROM foo;
结论
PostgreSQL 17 的故障转移槽功能允许在逻辑复制环境中实现无缝故障转移。通过按照本指南中概述的步骤,您可以创建一个高可用集群,确保数据流不间断,即使主服务器发生故障。
通过优化配置并利用 PostgreSQL 17 的新功能,您可以为关键业务应用程序创建一个弹性和高效的数据库基础设施。
Source:
https://dzone.com/articles/setting-up-failover-slots-in-postgresql-17