Pacemaker + PostgreSQL 16 + 仲裁模式高可用集群部署指南
文档版本信息
版本: v1.0
更新日期: 2026-05-22
适用系统: CentOS 7/8, RHEL 7/8, Rocky Linux 8/9
数据库版本: PostgreSQL 16.x
集群软件: Pacemaker + Corosync + PCS
仲裁模式: QDevice (Quorum Device)
一、架构概述
1.1 整体架构图
┌─────────────────┐
│ QDevice │
│ (仲裁设备) │
│ 10.212.9.100 │
└────────┬────────┘
│
┌──────────────┼──────────────┐
│ │ │
┌────────▼────────┐ │ ┌────────▼────────┐
│ Node1 (Primary) │◄───┼───►│ Node2 (Standby) │
│ 10.212.9.60 │ │ │ 10.212.9.62 │
│ │ │ │ │
│ PostgreSQL 16 │ │ │ PostgreSQL 16 │
│ Pacemaker │ │ │ Pacemaker │
│ Corosync │ │ │ Corosync │
└─────────────────┘ │ └─────────────────┘
│
┌────────▼────────┐
│ Virtual IP │
│ 10.212.9.200 │
└─────────────────┘
1.2 节点角色说明
节点 IP 地址 角色 说明
Node1 10.212.9.60 Primary 主数据库节点,承载写操作
Node2 10.212.9.62 Standby 备数据库节点,实时同步
QDevice 10.212.9.100 仲裁设备 防止脑裂,提供第三票
VIP 10.212.9.200 虚拟IP 客户端连接入口
1.3 高可用特性
自动故障切换: 主节点故障时,备节点自动接管
数据零丢失: 采用同步流复制(synchronous replication)
防脑裂机制: QDevice 仲裁确保集群决策一致性
快速恢复: 故障节点恢复后自动重新加入集群并同步数据
二、离线环境准备(关键章节)
2.1 离线部署挑战
在无互联网连接的生产环境中,需要提前在有网机器上下载所有依赖包,然后传输到目标服务器。本章节详细说明如何准备离线安装包。
2.2 需要准备的材料清单
2.2.1 操作系统镜像
CentOS 7: CentOS-7-x86_64-DVD-2009.iso
CentOS 8/Rocky 8: Rocky-8-x86_64-dvd1.iso
RHEL 8: rhel-8.x-x86_64-dvd.iso
注意: 使用与生产环境完全一致的系统版本,避免内核兼容性问题。
2.2.2 PostgreSQL 16 RPM 包清单
从 PostgreSQL YUM Repository 下载以下 RPM 包及其所有依赖:
核心包:
postgresql16-16.x.x-1PGDG.rhel8.x86_64.rpm
postgresql16-server-16.x.x-1PGDG.rhel8.x86_64.rpm
postgresql16-contrib-16.x.x-1PGDG.rhel8.x86_64.rpm
postgresql16-libs-16.x.x-1PGDG.rhel8.x86_64.rpm
依赖包(根据系统版本可能不同):
libicu-.rpm
libxml2-.rpm
libxslt-.rpm
openssl-libs-.rpm
readline-.rpm
zlib-.rpm
下载方法(在有网机器上执行):
方法1: 使用 yumdownloader(推荐)
sudo yum install -y yum-utils
mkdir -p /tmp/pg16_offline
cd /tmp/pg16_offline
下载 PostgreSQL 16 及所有依赖
sudo yumdownloader --resolve postgresql16-server postgresql16-contrib
打包
tar czf postgresql16_offline.tar.gz *.rpm
方法2: 使用 reposync(完整仓库同步)
sudo yum install -y createrepo
sudo yum-config-manager --add-repo https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm
sudo yum install -y pgdg-redhat-repo
同步整个 PGDG 仓库
reposync --repoid=pgdg16 --download_path=/tmp/pg_repo --newest-only
创建本地仓库元数据
createrepo /tmp/pg_repo/pgdg16
2.2.3 Pacemaker + Corosync RPM 包清单
对于 CentOS 8/RHEL 8/Rocky 8:
HighAvailability 仓库中的核心包
pacemaker-2.x.x-.rpm
pacemaker-cli-2.x.x-.rpm
pacemaker-libs-2.x.x-.rpm
pacemaker-cluster-libs-2.x.x-.rpm
corosync-3.x.x-.rpm
corosync-libknet1-3.x.x-.rpm
corosynclib-3.x.x-.rpm
pcs-0.10.x-.rpm
resource-agents-4.x.x-.rpm
QDevice 相关包:
corosync-qdevice-3.x.x-.rpm
corosync-qnetd-3.x.x-*.rpm # 安装在仲裁设备上
下载命令:
启用 HighAvailability 仓库
sudo subscription-manager repos --enable rhel-8-for-x86_64-highavailability-rpms
或对于 CentOS/Rocky:
sudo dnf config-manager --set-enabled ha
下载所有 HA 相关包
sudo yumdownloader --resolve
pacemaker
pacemaker-cli
corosync
corosync-qdevice
pcs
resource-agents
tar czf pacemaker_offline.tar.gz *.rpm
对于 CentOS 7:
启用 HA 仓库
sudo yum-config-manager --enable rhel-ha-for-rhel-7-server-rpms
或安装 centos-release-ha
sudo yum install -y centos-release-ha
下载包
sudo yumdownloader --resolve
pacemaker
pacemaker-cli
corosync
corosync-qdevice
pcs
resource-agents
2.2.4 其他必要工具包
网络工具
iproute-.rpm
net-tools-.rpm
SSH 和认证
openssh-clients-.rpm
openssh-server-.rpm
时间同步
chrony-*.rpm
或 ntp-*.rpm (CentOS 7)
防火墙
firewalld-*.rpm
监控工具(可选但推荐)
psmisc-.rpm # 提供 killall 命令
procps-ng-.rpm # 提供 ps, top 等
2.3 离线包传输步骤
步骤 1: 在有网机器上准备
创建离线包目录结构
mkdir -p /opt/offline_packages/{postgres,pacemaker,tools}
下载 PostgreSQL 16
cd /opt/offline_packages/postgres
sudo yumdownloader --resolve postgresql16-server postgresql16-contrib
下载 Pacemaker
cd /opt/offline_packages/pacemaker
sudo yumdownloader --resolve pacemaker pacemaker-cli corosync corosync-qdevice pcs resource-agents
下载工具包
cd /opt/offline_packages/tools
sudo yumdownloader --resolve iproute net-tools chrony firewalld psmisc procps-ng
打包所有 RPM
cd /opt/offline_packages
tar czf offline_packages_full.tar.gz postgres/ pacemaker/ tools/
生成校验文件
md5sum offline_packages_full.tar.gz > offline_packages_full.tar.gz.md5
步骤 2: 传输到目标服务器
方法1: 使用 scp
scp offline_packages_full.tar.gz user@10.212.9.60:/tmp/
scp offline_packages_full.tar.gz user@10.212.9.62:/tmp/
scp offline_packages_full.tar.gz user@10
