Ubuntu环境下PostgreSQL高可用方案设计与实现
PostgreSQL作为企业级开源数据库,其高可用性是保障业务连续性的核心需求。在Ubuntu系统中,可通过原生流复制构建基础高可用架构,并结合集群管理工具(如Patroni、repmgr)实现自动化故障转移,或通过VIP+中间件(如Keepalived+HAProxy)提升访问可靠性。以下是具体方案的详细设计:
原生流复制是PostgreSQL内置的高可用解决方案,通过WAL(Write-Ahead Logging)日志实现主从数据同步,适用于读多写少的场景。
sudo apt update && sudo apt install postgresql postgresql-contrib -y
wal_level = replica # WAL级别设为replica(支持复制)
max_wal_senders = 10 # 允许最多10个复制连接
wal_keep_size = 128MB # 保留WAL日志大小(避免被删除)
hot_standby = on # 允许从库进入热备模式
listen_addresses = '*' # 监听所有IP(便于从库连接)
host replication all 从库IP/32 md5
repl):CREATE ROLE repl WITH REPLICATION LOGIN PASSWORD '强密码';
sudo systemctl restart postgresql
sudo systemctl stop postgresql
sudo rm -rf /var/lib/postgresql/15/main/*
sudo -u postgres pg_basebackup -h 主库IP -U repl -D /var/lib/postgresql/15/main -P -R
sudo systemctl start postgresql
SELECT * FROM pg_stat_replication;
SELECT pg_is_in_recovery(); -- 返回true表示从库处于恢复模式(正常)
原生流复制需手动处理故障转移,而Patroni是基于Python的集群管理工具,结合Etcd(分布式键值存储)可实现自动故障检测与主从切换,适用于生产环境。
sudo apt install python3-pip etcd -y
sudo pip3 install patroni[etcd]
/etc/patroni.yml(示例):scope: postgres_cluster
namespace: /db/
name: pg01 # 节点名称(需唯一)
restapi:
listen: 0.0.0.0:8008
connect_address: 主库IP:8008
etcd:
hosts:
- etcd1IP:2379
- etcd2IP:2379
- etcd3IP:2379
bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1048576
postgresql:
use_pg_rewind: true
use_slots: true
parameters:
wal_level: replica
max_wal_senders: 10
wal_keep_size: 128
hot_standby: on
initdb:
- encoding: UTF8
- locale: en_US.UTF-8
pg_hba:
- host replication repl 从库IP/32 md5
- host all all 0.0.0.0/0 md5
postgresql:
listen: 0.0.0.0:5432
connect_address: 主库IP:5432
data_dir: /var/lib/postgresql/15/main
pg_hba: # 同bootstrap.pg_hba
authentication:
replication:
username: repl
password: 强密码
superuser:
username: postgres
password: 强密码
sudo patroni /etc/patroni.yml
curl http://主库IP:8008/patroni
返回结果中role字段显示主节点(master),其他节点为replica。sudo systemctl stop patroni
为解决单点故障问题,可通过VIP(虚拟IP)将流量导向可用节点,结合Keepalived实现VIP漂移,HAProxy实现读写分离。
sudo apt install keepalived -y
/etc/keepalived/keepalived.conf:vrrp_instance VI_1 {
state MASTER
interface eth0 # 网卡名称(通过ip a查看)
virtual_router_id 51 # 虚拟路由ID(集群内唯一)
priority 100 # 优先级(主节点高于备节点)
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
virtual_ipaddress {
10.24.57.101 # VIP地址
}
}
state为BACKUP,priority为90)。sudo apt install haproxy -y
/etc/haproxy/haproxy.cfg:frontend postgres_frontend
bind *:5432
mode tcp
default_backend postgres_backend
backend postgres_backend
mode tcp
balance roundrobin
option pgsql-check user=postgres # 健康检查(需PostgreSQL允许)
server pg01 主库IP:5432 check inter 2000 rise 2 fall 3
server pg02 从库IP:5432 check inter 2000 rise 2 fall 3 backup # 从库设为backup
sudo systemctl start keepalived && sudo systemctl start haproxy
10.24.57.101)访问PostgreSQL,HAProxy会自动将写请求导向主节点,读请求分发到从节点。高可用系统的稳定性依赖于持续的监控,建议使用以下工具:
以上方案覆盖了Ubuntu环境下PostgreSQL从基础到进阶的高可用需求,可根据业务规模(如数据量、并发量)和容灾要求(如RTO、RPO)选择合适的架构。例如,中小规模业务可采用原生流复制+Keepalived,大规模分布式业务则推荐Patroni+Etcd+HAProxy组合。