统信UOS部署PostgreSQL高可用集群需基于Patroni+etcd实现自动故障转移,核心步骤包括:配置三节点etcd集群、初始化主库并启用WAL与复制、创建replicator用户、编写Patroni配置文件(含restapi/etcd/postgresql参数)、部署systemd服务,并在备节点自动拉取数据构建流复制集群,最终通过patronictl验证failover能力。

在统信UOS上部署PostgreSQL高可用集群,需突破单实例局限,实现主库故障时自动切换至备库、数据零丢失、服务不中断。这要求同时配置流复制、触发器文件切换、Patroni或repmgr等编排工具,并调整内核参数与防火墙策略。
准备基础环境与依赖
先确认系统为UOS Server 20或Desktop Professional 1070及以上版本,内核≥5.10,且已关闭SELinux(UOS默认未启用,但需验证):
sudo cat /etc/os-version | grep -E "(MajorVersion|MinorVersion)"
sudo getenforce 2>/dev/null || echo "SELinux not installed"
安装高可用必需的底层工具链:
sudo apt update && sudo apt install -y curl wget gnupg2 python3-pip python3-setuptools python3-venv libpq-dev libssl-dev libsystemd-dev
若目标机器处于离线环境,必须提前在联网机执行:
sudo apt download postgresql-14 postgresql-client-14 postgresql-contrib-14 python3-patroni python3-etcd python3-consul python3-dnspython && scp *.deb user@offline-host:/tmp/debs/
在离线主机上一次性补全依赖并安装:
sudo dpkg -i /tmp/debs/*.deb 2>/dev/null || sudo apt --fix-broken install -y
部署Patroni集群控制器
Patroni是当前UOS环境下最稳定的PostgreSQL高可用方案,它基于DCS(如etcd)协调主从状态,避免脑裂。
方法一:使用pip安装(推荐,版本可控)
sudo python3 -m venv /opt/patroni-env
sudo /opt/patroni-env/bin/pip install --upgrade pip
sudo /opt/patroni-env/bin/pip install patroni[etcd] psycopg2-binary
方法二:APT安装(仅限UOS官方源含patroni包的版本)
sudo apt install -y python3-patroni python3-etcd
【关键前提】必须预先部署一个三节点etcd集群(非单点),监听地址绑定到内网IP(如192.168.10.10:2379),且Patroni节点能稳定访问该端口。单点etcd会导致整个HA失效。
初始化主库并配置流复制
第一步:创建专用postgres用户与数据目录
sudo useradd -r -m -u 26 -g 26 -d /var/lib/postgresql postgres
sudo mkdir -p /var/lib/postgresql/14/main && sudo chown -R postgres:postgres /var/lib/postgresql
第二步:以postgres用户初始化主库集群
sudo -u postgres /usr/lib/postgresql/14/bin/initdb -D /var/lib/postgresql/14/main -E UTF8 --locale=C.UTF-8 --data-checksums
第三步:修改postgresql.conf启用复制功能
sudo sed -i "s/#wal_level = replica/wal_level = logical/" /var/lib/postgresql/14/main/postgresql.conf
sudo sed -i "s/#archive_mode = off/archive_mode = on/" /var/lib/postgresql/14/main/postgresql.conf
sudo sed -i "s|#archive_command = ''|archive_command = 'cp %p /var/lib/postgresql/14/archive/%f'|" /var/lib/postgresql/14/main/postgresql.conf
sudo sed -i "s/#max_wal_senders = 10/max_wal_senders = 10/" /var/lib/postgresql/14/main/postgresql.conf
sudo sed -i "s/#max_replication_slots = 10/max_replication_slots = 10/" /var/lib/postgresql/14/main/postgresql.conf
sudo sed -i "s/#hot_standby = off/hot_standby = on/" /var/lib/postgresql/14/main/postgresql.conf
第四步:配置pg_hba.conf允许复制连接
echo "host replication replicator 192.168.10.0/24 md5" | sudo tee -a /var/lib/postgresql/14/main/pg_hba.conf
第五步:创建replicator用户并设密码(后续所有节点复用此凭据)
sudo -u postgres psql -c "CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD 'ReplicaPass2026!';"
配置Patroni并启动集群
创建Patroni配置文件 /etc/patroni.yml:
scope: postgres-cluster
namespace: /service/
restapi:
listen: 192.168.10.10:8008
connect_address: 192.168.10.10:8008
etcd:
hosts: ['192.168.10.10:2379','192.168.10.11:2379','192.168.10.12:2379']
bootstrap:
initdb:
- encoding: UTF8
- locale: C.UTF-8
pg_hba:
- host all all 0.0.0.0/0 md5
- host replication replicator 192.168.10.0/24 md5
postgresql:
listen: 192.168.10.10:5432
connect_address: 192.168.10.10:5432
data_dir: /var/lib/postgresql/14/main
bin_dir: /usr/lib/postgresql/14/bin
pgpass: /var/lib/postgresql/.pgpass
authentication:
replication:
username: replicator
password: ReplicaPass2026!
superuser:
username: postgres
password: PostgresAdmin2026!
赋予配置文件权限:
sudo chown postgres:postgres /etc/patroni.yml && sudo chmod 600 /etc/patroni.yml
编写systemd服务单元文件 /etc/systemd/system/patroni.service:
[Unit]
Description=Patroni High Availability PostgreSQL Cluster
After=network.target etcd.service
[Service]
Type=simple
User=postgres
Group=postgres
EnvironmentFile=/etc/default/patroni
ExecStart=/opt/patroni-env/bin/patroni /etc/patroni.yml
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
启用并启动Patroni服务:
sudo systemctl daemon-reload
sudo systemctl enable patroni
sudo systemctl start patroni
验证集群状态:
sudo -u postgres patronictl -c /etc/patroni.yml list
添加备库节点
在第二台UOS主机(IP: 192.168.10.11)上重复以下操作:
① 创建postgres用户与目录结构(同主库步骤)
② 安装Patroni及依赖(同主库)
③ 配置/etc/patroni.yml,仅修改以下三项:
restapi.listen → 192.168.10.11:8008
restapi.connect_address → 192.168.10.11:8008
bootstrap.postgresql.listen → 192.168.10.11:5432
bootstrap.postgresql.connect_address → 192.168.10.11:5432
④ 启动patroni服务:
sudo systemctl start patroni
此时Patroni会自动触发pg_basebackup拉取主库全量数据,并启动流复制。无需手动执行备份命令。
第三节点(192.168.10.12)按相同流程部署,构成三节点仲裁集群。
验证故障自动切换
登录任意节点执行:
sudo -u postgres patronictl -c /etc/patroni.yml failover
观察输出中出现“Successfully switched over to pg-node-02”字样,且原主库变为sync_standby状态。
连接数据库验证角色变更:
psql -h 192.168.10.10 -U postgres -c "SELECT pg_is_in_recovery();"
返回t表示已降为备库;返回f表示已升为主库。
强制杀死当前主库进程模拟宕机:
sudo pkill -f "postgres:.*master process"
等待约15秒后,执行:
sudo -u postgres patronictl -c /etc/patroni.yml list
确认新主节点状态为leader,且其余节点role列为replica。

















