在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
),避免集群完全故障时数据丢失。