在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),确保客户端始终访问可用节点。
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备份数据,测试恢复流程。