在Ubuntu系統上搭建PostgreSQL集群前,需完成以下基礎配置:
sudo apt update && sudo apt install -y postgresql postgresql-contrib
,安裝PostgreSQL數據庫及擴展工具。sudo apt install -y libcurl4-openssl-dev libjson-c-dev flex libselinux1-dev libzstd-dev liblz4-dev libxslt1-dev libxml2-dev libpam0g-dev libssl-dev libkrb5-dev zlib1g-dev libreadline-dev
wget https://www.repmgr.org/download/repmgr-5.5.0.tar.gz
tar xvf repmgr-5.5.0.tar.gz
cd repmgr-5.5.0/
./configure && make && sudo make install
ssh-keygen
),并將公鑰復制到所有從節點(ssh-copy-id <從節點IP>
),確保節點間可通過SSH無密碼通信。/etc/postgresql/<版本>/main/postgresql.conf
):wal_level = replica # 啟用WAL日志(支持復制)
max_wal_senders = 10 # 允許的最大WAL發送器數量(至少比備節點數多1)
max_replication_slots = 10 # 最大復制槽數(與備節點數一致)
hot_standby = on # 允許備節點以只讀模式運行
/etc/postgresql/<版本>/main/pg_hba.conf
):host replication repmgr <從節點IP>/32 md5
host repmgr repmgr 192.168.1.0/24 trust # 集群內部節點信任(生產環境建議用md5)
sudo systemctl restart postgresql
。sudo -u postgres psql -c "CREATE USER repmgr WITH SUPERUSER REPLICATION PASSWORD 'repmgr123';"
sudo -u postgres createdb -O repmgr repmgr;
ALTER USER repmgr SET search_path TO repmgr, "$user", public;
sudo systemctl stop postgresql
。sudo rm -rf /var/lib/postgresql/<版本>/main/*
。pg_basebackup
從主節點同步數據:sudo -u postgres pg_basebackup -h <主節點IP> -D /var/lib/postgresql/<版本>/main -U repmgr -P --wal-method=stream
/etc/repmgr.conf
):node_id=2 # 從節點ID(主節點為1)
node_name='node2' # 節點名稱(需唯一)
conninfo='host=<從節點IP> user=repmgr dbname=repmgr connect_timeout=2'
data_directory='/var/lib/postgresql/<版本>/main'
repmgr -f /etc/repmgr.conf primary register
,將主節點加入集群。repmgr -f /etc/repmgr.conf standby register
,將從節點注冊到主節點。repmgr -f /etc/repmgr.conf cluster show
,查看集群節點狀態(主節點狀態為“primary”,從節點為“standby”)。repmgrd -f /etc/repmgr.conf --daemonize
,監控節點狀態并自動處理故障。Pgpool是一個PostgreSQL中間件,提供連接池、負載均衡、自動故障轉移功能,適用于生產級高可用場景。
在獨立節點(或主節點)安裝Pgpool:
sudo apt install -y pgpool2
/etc/pgpool2/pgpool.conf
):listen_addresses = '*' # 監聽所有IP
backend_hostname0 = '<主節點IP>' # 主節點IP
backend_port0 = 5432
backend_weight0 = 1
backend_hostname1 = '<備節點1IP>' # 備節點1IP
backend_port1 = 5432
backend_weight1 = 1
backend_hostname2 = '<備節點2IP>' # 備節點2IP
backend_port2 = 5432
backend_weight2 = 1
sr_check_period = 10 # 主節點狀態檢查間隔(秒)
failover_command = '/etc/pgpool2/failover.sh %d %H %P' # 故障轉移腳本
load_balance_mode = on # 開啟負載均衡
/etc/pgpool2/failover.sh
):#!/bin/bash
FAILED_NODE=$1
NEW_PRIMARY=$2
PGDATA=$3
# 停止故障節點的Pgpool服務
ssh postgres@$FAILED_NODE "systemctl stop pgpool"
# 晉升備節點為主節點
ssh postgres@$NEW_PRIMARY "pg_ctl promote -D $PGDATA"
# 重新配置Pgpool連接
ssh postgres@$NEW_PRIMARY "pgpool -n -f /etc/pgpool2/pgpool.conf"
sudo systemctl start pgpool2
sudo systemctl enable pgpool2
通過Pgpool節點連接數據庫(psql -h <PgpoolIP> -U postgres
),執行查詢時,Pgpool會自動將讀請求分發到備節點,寫請求發送到主節點。
wal_level
、archive_mode
等參數一致,避免數據丟失。md5
或scram-sha-256
認證,避免明文密碼傳輸。pg_stat_replication
視圖監控復制狀態,結合Prometheus+Granafa搭建監控告警體系。pg_dump
或barman
),避免集群完全故障時數據丟失。