下面是 PostgreSQL 主從復制(Streaming Replication)環境的安裝與配置指南,適合在兩臺或多臺服務器之間構建一主一從(或一主多從)的高可用讀寫分離系統。
環境準備
角色 | 主機名/IP | 說明 |
---|---|---|
主庫 | 192.168.1.10 | 可讀寫,負責復制源 |
從庫 | 192.168.1.11 | 只讀,從主庫同步數據 |
推薦 PostgreSQL 版本一致,例如 15.x;操作系統為 Ubuntu/CentOS 均可。
一、安裝 PostgreSQL(主從都要裝)
以 Ubuntu 為例:
sudo apt update
sudo apt install postgresql postgresql-contrib -y
CentOS:
sudo yum install -y postgresql-server postgresql-contrib
初始化數據庫(如未自動初始化):
sudo -u postgres /usr/pgsql-15/bin/initdb -D /var/lib/pgsql/15/data
二、配置主庫(192.168.1.10)
1. 修改 postgresql.conf
路徑通常為 /etc/postgresql/15/main/postgresql.conf
或 /var/lib/pgsql/15/data/postgresql.conf
# 啟用 WAL 日志并設置參數
wal_level = replica
max_wal_senders = 10
wal_keep_size = 128MB
hot_standby = on
listen_addresses = '*'
2. 修改 pg_hba.conf
(允許從庫連接復制)
# 添加允許從庫復制連接
host replication all 192.168.1.11/32 md5
3. 重啟主庫
sudo systemctl restart postgresql
三、從庫配置(192.168.1.11)
1. 停止 PostgreSQL 服務并清空數據目錄
sudo systemctl stop postgresql
rm -rf /var/lib/postgresql/15/main/*
2. 使用 pg_basebackup
拉取主庫數據
pg_basebackup -h 192.168.1.10 -D /var/lib/postgresql/15/main -U postgres -P -R
說明:
-h
:主庫 IP-D
:寫入數據目錄-U
:復制用戶(需先創建)-R
:自動創建standby.signal
和primary_conninfo
如果提示用戶不存在,請先在主庫執行:
CREATE ROLE repl WITH REPLICATION LOGIN PASSWORD 'replpass';
并確保 pg_hba.conf
中允許該 IP 使用此用戶連接。
3. 修改復制用戶密碼(如果 -R
中未設置)
編輯 postgresql.conf
確保:
primary_conninfo = 'host=192.168.1.10 port=5432 user=repl password=replpass'
四、啟動從庫
sudo systemctl start postgresql
檢查日志 /var/log/postgresql/postgresql-15-main.log
是否同步成功。
五、驗證主從同步
主庫執行:
SELECT * FROM pg_stat_replication;
從庫查看:
SELECT pg_is_in_recovery(); -- 返回 true 表示是從庫
六、主從讀寫測試建議
操作 | 主庫 | 從庫 |
---|---|---|
創建表/插入數據 | ? 支持 | ? 禁止 |
查詢數據 | ? 支持 | ? 支持 |
自動同步 | ? 向從庫推送 | ? 被動接收 |
七、開機自啟動設置(主從)
sudo systemctl enable postgresql
八、參考目錄結構(Debian/Ubuntu)
配置文件 | 路徑 |
---|---|
postgresql.conf | /etc/postgresql/15/main/ |
pg_hba.conf | /etc/postgresql/15/main/ |
數據目錄 | /var/lib/postgresql/15/main/ |
日志文件 | /var/log/postgresql/postgresql-15-main.log |
常見問題排查
問題 | 解決辦法 |
---|---|
pg_basebackup 報權限錯誤 | 主庫需創建 replication 權限用戶 |
從庫無法連接主庫 | 檢查主庫防火墻 / pg_hba.conf |
主庫 pg_stat_replication 為空 | 檢查從庫連接信息是否正確 |
寫入從庫失敗 | 合理,PostgreSQL 只讀備庫默認禁止寫入 |
高級擴展建議
目標 | 建議工具 |
---|---|
自動故障切換 | repmgr , Patroni |
虛擬 IP 高可用切換 | Keepalived + VIP |
讀寫分離中間件 | pgpool-II |
多從、鏈式復制 | 支持 |
雙機部署腳本化自動搭建 | Ansible/腳本工具 |