在CentOS環境下,實現PostgreSQL高可用性需結合數據復制、故障轉移和負載均衡等技術。以下是幾種主流方案及詳細實現步驟:
流復制是PostgreSQL原生支持的高可用機制,通過WAL(Write-Ahead Log)日志實現主從數據同步,適用于需要讀寫分離或基礎故障轉移的場景。
sudo yum install -y postgresql-server postgresql-contribsudo postgresql-setup initdblisten_addresses = '*'(監聽所有IP)、wal_level = replica(開啟復制日志)、max_wal_senders = 10(允許10個WAL發送進程)、wal_keep_segments = 64(保留64個WAL文件)。host replication replicator 0.0.0.0/0 md5(允許所有IP的復制用戶連接,密碼認證)。CREATE USER replicator REPLICATION LOGIN ENCRYPTED PASSWORD 'your_password';sudo systemctl restart postgresqlpg_basebackup -h master_ip -U replicator -D /var/lib/pgsql/data --wal-method=stream --no-password(實時拉取主節點數據)。listen_addresses = '*'、hot_standby = on)。standby_mode = 'on'(聲明為備庫)、primary_conninfo = 'host=master_ip dbname=postgres user=replicator password=your_password'(連接主庫的信息)。sudo systemctl start postgresql在主節點執行SELECT * FROM pg_stat_replication;,若返回備庫連接信息,則說明復制成功。
repmgr是PostgreSQL生態中的復制管理工具,可自動化監控、故障轉移和節點管理,彌補原生流復制的不足。
sudo yum install -y repmgr
/etc/repmgr.conf,設置node_id = 1、node_name = master、conninfo = 'host=master_ip dbname=postgres user=repmgr password=repmgr_pass'。/etc/repmgr.conf,設置node_id = 2、node_name = standby、conninfo = 'host=standby_ip dbname=postgres user=repmgr password=repmgr_pass'、primary_conninfo = 'host=master_ip dbname=postgres user=replicator password=your_password'。repmgr -f /etc/repmgr.conf init(初始化主節點)。repmgr -f /etc/repmgr.conf standby clone master_ip(克隆主節點數據)、repmgr -f /etc/repmgr.conf standby register(注冊備庫到集群)。若主節點故障,執行repmgr -f /etc/repmgr.conf failover,repmgr會自動提升備庫為新主庫,并更新集群狀態。
Patroni是基于Raft算法的高可用管理工具,結合etcd(分布式鍵值存儲)實現集群狀態同步,Keepalived提供虛擬IP(VIP),確??蛻舳耸冀K訪問可用節點。
sudo yum install -y python3-pip && sudo pip3 install patroni
scope: postgres_cluster
name: node1
namespace: /db
restapi:
listen: 0.0.0.0:8008
connect_address: 192.168.1.101
etcd:
host: 192.168.1.103:2379 # etcd服務器IP
bootstrap:
dcs:
ttl: 30
retry_timeout: 10
postgresql:
use_pg_rewind: true
parameters:
wal_level: replica
hot_standby: on
max_wal_senders: 4
initdb:
- encoding: UTF8
- locale: en_US.UTF-8
pg_hba:
- host replication replicator 192.168.1.0/24 md5
- host all all 192.168.1.0/24 md5
postgresql:
listen: 0.0.0.0:5432
connect_address: 192.168.1.101
data_dir: /var/lib/pgsql/data
authentication:
replication:
username: replicator
password: replicator_pass
superuser:
username: postgres
password: postgres_pass
name、connect_address和data_dir,其他配置與主節點一致。vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
192.168.1.100 # 虛擬IP,客戶端通過此IP訪問PostgreSQL
}
}
state改為BACKUP,priority改為90(低于主節點)。sudo systemctl start patroni && sudo systemctl enable patronisudo systemctl start keepalived && sudo systemctl enable keepalived192.168.1.100,確認能連接到PostgreSQL。pg_dump或barman備份數據,測試恢復流程。