引言

流複製(Streaming Replication)是PostgreSQL提供的核心高可用性功能之一,它通過實時傳輸主庫的WAL(Write-Ahead Log)日誌到備庫,實現數據的近實時同步。流複製不僅能夠提供數據冗餘保護,還能實現讀寫分離、負載均衡和災難恢復等多種應用場景。正確配置流複製對於構建穩定可靠的數據庫架構至關重要。

流複製工作原理

PostgreSQL流複製基於WAL日誌傳輸機制。當主庫發生數據變更時,變更操作首先記錄在WAL日誌中,然後通過網絡實時傳輸到備庫。備庫接收到WAL日誌後,將其應用到自己的數據文件中,從而保持與主庫的數據同步。

這種機制的優勢在於延遲極低,通常在毫秒級別,而且對主庫性能影響很小。流複製支持異步和同步兩種模式,可以根據業務需求選擇合適的複製策略。

環境準備與前提條件

配置流複製前需要準備兩台服務器:一台作為主庫服務器,另一台作為備庫服務器。兩台服務器需要滿足以下條件:

  1. 安裝相同版本的PostgreSQL
  2. 網絡連通性良好
  3. 時間同步(建議使用NTP服務)
  4. 相同的操作系統環境

主庫配置詳解

修改postgresql.conf配置文件

主庫需要啓用WAL歸檔和流複製支持:

# 基本複製相關配置
wal_level = replica                    # 啓用複製所需WAL級別
max_wal_senders = 3                   # 允許的最大複製連接數
max_replication_slots = 3             # 複製槽位數量
archive_mode = on                     # 啓用WAL歸檔
archive_command = 'cp %p /var/lib/postgresql/archive/%f'  # 歸檔命令

# 流複製相關配置
hot_standby = on                      # 允許備庫接受連接
wal_keep_segments = 64                # 保留WAL段文件數量
listen_addresses = '*'                # 監聽所有地址
port = 5432                           # 監聽端口

配置訪問控制

pg_hba.conf文件中添加複製用户的訪問權限:

# 允許備庫IP地址的複製連接
host replication replicator 192.168.1.101/32 md5
host all all 0.0.0.0/0 md5

創建複製用户

-- 創建專門用於複製的用户
CREATE USER replicator REPLICATION LOGIN ENCRYPTED PASSWORD 'strong_password';

備庫配置步驟

初始化備庫數據目錄

首先需要創建備庫的數據目錄,並從主庫獲取基礎備份:

# 停止備庫PostgreSQL服務
sudo systemctl stop postgresql

# 刪除現有數據目錄內容
sudo rm -rf /var/lib/postgresql/12/main/*

# 使用pg_basebackup創建基礎備份
sudo -u postgres pg_basebackup -h 192.168.1.100 -D /var/lib/postgresql/12/main -U replicator -P -v -R

# 啓動備庫服務
sudo systemctl start postgresql

pg_basebackup命令中的-R參數會自動生成standby.signal文件和postgresql.auto.conf配置文件。

手動配置備庫(可選)

如果不使用-R參數,需要手動創建配置文件:

創建standby.signal文件標記備庫狀態:

touch /var/lib/postgresql/12/main/standby.signal

創建或修改postgresql.auto.conf文件:

primary_conninfo = 'host=192.168.1.100 port=5432 user=replicator password=strong_password'
primary_slot_name = 'physical_slot'

同步複製配置

對於要求更高數據一致性的場景,可以配置同步複製:

# 主庫postgresql.conf配置
synchronous_standby_names = 'standby1'  # 指定同步備庫名稱

同步複製確保事務在主庫和至少一個備庫上都提交成功才返回客户端成功,提供更強的數據安全保障,但會增加事務響應時間。

複製槽管理

複製槽(Replication Slot)是PostgreSQL 9.4引入的重要特性,能夠防止WAL日誌過早回收:

-- 在主庫上創建物理複製槽
SELECT pg_create_physical_replication_slot('physical_slot');

-- 查看複製槽狀態
SELECT slot_name, active, restart_lsn FROM pg_replication_slots;

複製槽確保主庫保留足夠的WAL日誌供備庫使用,避免因備庫延遲導致的日誌丟失問題。

監控與狀態檢查

配置完成後,需要驗證流複製是否正常工作:

-- 在主庫上查看複製連接狀態
SELECT client_addr, state, sync_state, 
       pg_wal_lsn_diff(pg_current_wal_lsn(), sent_lsn) AS lag_bytes
FROM pg_stat_replication;

-- 在備庫上檢查複製狀態
SELECT pg_is_in_recovery();           -- 返回true表示處於恢復模式
SELECT pg_last_wal_receive_lsn();     -- 最後接收的WAL位置
SELECT pg_last_wal_replay_lsn();      -- 最後應用的WAL位置

故障排除與常見問題

連接認證失敗

檢查pg_hba.conf配置是否正確,確保複製用户有相應權限。

WAL日誌延遲過大

增加max_wal_senderswal_keep_segments參數值,或者使用複製槽防止日誌過早回收。

備庫無法啓動

檢查備庫數據目錄權限,確認standby.signal文件存在,驗證主庫連接信息是否正確。

性能優化建議

  1. 網絡優化:確保主備庫之間網絡帶寬充足,延遲較低
  2. 存儲優化:使用SSD存儲提升WAL日誌寫入性能
  3. 參數調優:根據實際負載調整max_wal_senders等參數
  4. 壓縮傳輸:在網絡帶寬受限時考慮啓用WAL壓縮傳輸

高可用性增強

結合其他工具可以進一步提升流複製的高可用性:

使用repmgr管理複製集羣

# 註冊主庫節點
repmgr primary register

# 註冊備庫節點
repmgr standby register

# 檢查集羣狀態
repmgr cluster show

配置自動故障轉移

通過腳本或工具實現自動故障檢測和切換,確保服務連續性。

最佳實踐總結

  1. 定期驗證:定期測試主備切換和數據一致性
  2. 監控告警:建立完善的監控體系,及時發現複製異常
  3. 備份策略:即使有流複製也要制定獨立的備份計劃
  4. 安全加固:使用SSL加密複製流量,加強訪問控制
  5. 文檔記錄:詳細記錄配置參數和操作步驟,便於維護

通過合理配置和精心維護PostgreSQL流複製,可以構建高可用、高可靠的數據架構,為業務系統提供強有力的數據保障。關鍵是要根據具體業務需求選擇合適的配置方案,並建立完善的監控和維護機制。