在CentOS环境下,实现PostgreSQL高可用性需结合数据复制、故障转移和负载均衡等技术。以下是几种主流方案及详细实现步骤:
流复制是PostgreSQL原生支持的高可用机制,通过WAL(Write-Ahead Log)日志实现主从数据同步,适用于需要读写分离或基础故障转移的场景。
sudo yum install -y postgresql-server postgresql-contrib
sudo postgresql-setup initdb
listen_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 postgresql
pg_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 patroni
sudo systemctl start keepalived && sudo systemctl enable keepalived
192.168.1.100
,确认能连接到PostgreSQL。pg_dump
或barman
备份数据,测试恢复流程。