
在现代分布式系统架构中,关系型数据库的高可用性(High Availability)与跨地域数据同步是关键能力。A5数据以 Debian 11(Bullseye)为操作系统,以 PostgreSQL 14/15 为数据库核心,通过开源组件构建一个高可用性、支持跨地域同步的 PostgreSQL 集群,并在此基础上深入讲解架构设计、硬件选型、配置细节、自动故障切换、监控与性能优化。
本文适用于:
- 数据库管理员(DBA)
- 系统运维工程师
- 架构师
部署集群核心目标:
- 主从复制(物理流复制 + 自动故障切换)
- 自动高可用性管理(自动选主、容错)
- 跨地域同步(跨多个数据中心)
- 性能与网络优化
- 集群监控与维护
第一部分 系统与硬件选型
一、操作系统
| 项目 | A5IDC建议版本 |
|---|---|
| 操作系统 | Debian 11 "Bullseye" |
| 内核 | 5.10 及以上 |
| 文件系统 | XFS / EXT4(XFS 在大文件写入更稳定) |
| 内核参数(sysctl) | 调优见下文 |
二、PostgreSQL 版本
选择 PostgreSQL 14 或 PostgreSQL 15,二者在逻辑复制与性能上都有显著提升。本文以 PostgreSQL 15 为主,但示例兼容 PostgreSQL 14。
三、香港服务器www.a5idc.com硬件建议
建议分别在各地域部署至少 3 节点(主/备用/仲裁 / 管理节点)。A5数据推荐配置如下:
| 节点类型 | CPU | 内存 | 存储 | 网络 |
|---|---|---|---|---|
| 主节点 / 备用 | Intel Xeon Silver 4214 / AMD EPYC 7252 | 32GB | 1--2TB NVMe | 10Gbps |
| ETCD / HA 管理节点 | 4 核 | 8GB | 100GB SSD | 1--10Gbps |
| 监控节点 | 4--8 核 | 16GB | 200GB SSD | 1--10Gbps |
NVMe 存储能够显著提高写性能,尤其在高负载下流复制 WAL 传输。
第二部分 架构方案
本文采用的高可用性架构如下:
Region A Region B
┌─────────────────┐ ┌─────────────────┐
| PostgreSQL A | <======= WAN =======> | PostgreSQL B |
| Primary/Replica | | Replica |
└───────┬─────────┘ └───────┬─────────┘
│ │
└─────────── Patroni Cluster ─────┘
│ │ │
ETCD/Consul/RAFT 集群
- Patroni:自动高可用管理,健康检测、自动选主
- ETCD / Consul / RAFT:分布式一致性存储
- 物理流复制:跨地域同步主节点 WAL 日志
- 逻辑复制(可选):针对不同版本或表级复制
第三部分 环境准备
一、安装 PostgreSQL
- 添加 PostgreSQL APT 源:
bash
echo "deb http://apt.postgresql.org/pub/repos/apt/ bullseye-pgdg main" |
sudo tee /etc/apt/sources.list.d/pgdg.list
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc |
sudo apt-key add -
sudo apt update
- 安装 PostgreSQL 15:
bash
sudo apt install -y postgresql-15 postgresql-client-15
二、设置内核参数(适用于所有节点)
在 /etc/sysctl.d/99-postgresql.conf 添加:
conf
# 增强网络连接
net.core.somaxconn = 1024
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_forward = 1
# 内存与IO设置
vm.swappiness = 10
vm.dirty_ratio = 15
vm.dirty_background_ratio = 5
加载:
bash
sudo sysctl -p /etc/sysctl.d/99-postgresql.conf
三、关闭防火墙或添加服务访问规则
示例开放 PostgreSQL 默认端口与 Patroni 管理端口:
bash
sudo ufw allow 5432/tcp
sudo ufw allow 8008/tcp
sudo ufw allow 2379/tcp
第四部分 配置 PostgreSQL 流复制 + Patroni
一、PostgreSQL 配置
在主节点和备节点上编辑 /etc/postgresql/15/main/postgresql.conf:
conf
listen_addresses = '*'
wal_level = replica
max_wal_senders = 10
wal_keep_size = 1024
archive_mode = on
archive_command = 'cd .'
synchronous_commit = remote_apply
synchronous_standby_names = '*'
参数说明:
| 参数 | 作用 |
|---|---|
| wal_level | 决定 WAL 日志保留级别 |
| max_wal_senders | 最大 WAL 发送进程数 |
| wal_keep_size | 保留 WAL 大小(MB) |
| synchronous_commit | 指定同步提交级别 |
| synchronous_standby_names | 定义同步备用节点 |
二、创建复制用户
bash
sudo -u postgres psql -c \
"CREATE ROLE replicator WITH REPLICATION LOGIN ENCRYPTED PASSWORD 'Rep1!cP@ss';"
三、配置 pg_hba.conf
在主节点与备用节点加入:
# 允许复制连接
host replication replicator 0.0.0.0/0 md5
host all all 0.0.0.0/0 md5
重启 PostgreSQL:
bash
sudo systemctl restart postgresql
第五部分 部署 Patroni + etcd
一、安装 Patroni 与 etcd
在所有 HA 管理节点上:
bash
sudo apt install -y python3-pip
pip3 install patroni[etcd] psycopg2-binary
安装 etcd:
bash
wget https://github.com/etcd-io/etcd/releases/download/v3.5.9/etcd-v3.5.9-linux-amd64.tar.gz
tar xzf etcd-v3*.tar.gz
sudo mv etcd-v3.5.9-linux-amd64/etcd* /usr/local/bin/
二、配置 etcd
在每个 etcd 节点创建 /etc/default/etcd:
bash
ETCD_NAME="node1"
ETCD_DATA_DIR="/var/lib/etcd"
ETCD_INITIAL_CLUSTER="node1=http://10.0.0.1:2380,node2=http://10.0.0.2:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-01"
ETCD_LISTEN_PEER_URLS="http://10.0.0.1:2380"
ETCD_LISTEN_CLIENT_URLS="http://10.0.0.1:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://10.0.0.1:2379"
启动服务:
bash
sudo systemctl enable etcd
sudo systemctl start etcd
三、Patroni 配置
在每个 PostgreSQL 节点(含主/备)创建 /etc/patroni.yml:
yaml
scope: postgres-ha
namespace: /db/
name: node1
restapi:
listen: 0.0.0.0:8008
connect_address: 10.0.0.1:8008
etcd:
host: 10.0.0.1:2379,10.0.0.2:2379
bootstrap:
dcs:
ttl: 30
loop_wait: 10
retry_timeout: 10
maximum_lag_on_failover: 1048576
initdb:
- encoding: UTF8
- data-checksums
pg_hba:
- host replication replicator 0.0.0.0/0 md5
- host all all 0.0.0.0/0 md5
postgresql:
listen: 10.0.0.1:5432
connect_address: 10.0.0.1:5432
data_dir: /var/lib/postgresql/15/main
bin_dir: /usr/lib/postgresql/15/bin
authentication:
superuser_username: postgres
superuser_password: supersecret
replication_username: replicator
replication_password: Rep1!cP@ss
启动 Patroni:
bash
patroni /etc/patroni.yml
通过访问 http://<node-ip>:8008 可查看状态。
第六部分 跨地域复制细节
一、物理流复制 + 延迟容忍
如果地域延迟较高,则 synchronous_commit = remote_apply 可能影响主库写性能。可根据需求选择:
| 参数值 | 行为 |
|---|---|
| local | 仅本地写入确认 |
| remote_write | 等待 WAL 到远程节点 |
| remote_apply | 等待远程节点应用 WAL(最安全但最慢) |
建议在跨地域复制中使用 remote_write,并监控延迟。
二、逻辑复制(表级粒度)
逻辑复制适用于需要跨版本或跨表同步:
- 在发布端:
sql
CREATE PUBLICATION my_pub FOR ALL TABLES;
- 在订阅端:
sql
CREATE SUBSCRIPTION my_sub
CONNECTION 'host=10.0.1.1 port=5432 dbname=mydb user=replicator password=Rep1!cP@ss'
PUBLICATION my_pub;
第七部分 性能与监控
一、性能调优参数示例
在 PostgreSQL 配置中加入:
conf
shared_buffers = 8GB
effective_cache_size = 24GB
work_mem = 50MB
maintenance_work_mem = 2GB
checkpoint_completion_target = 0.9
wal_buffers = 16MB
max_worker_processes = 16
参数解释请参考 PostgreSQL 配置指南。
二、监控方案
建议使用以下组合:
| 工具 | 用途 |
|---|---|
| Prometheus | 指标采集 |
| Grafana | 可视化仪表盘 |
| pg_stat_activity / pg_stat_replication | 内置监控视图 |
| Patroni API | HA 状态监控 |
示例 Grafana 指标:
bash
# Prometheus PostgreSQL Exporter
docker run -d \
--name pg-exporter \
-p 9187:9187 \
-e DATA_SOURCE_URI="postgresql://postgres:supersecret@localhost:5432/postgres?sslmode=disable" \
wrouesnel/postgres_exporter
第八部分 故障演练与恢复
一、主节点故障模拟
- 停止主节点数据库:
bash
sudo systemctl stop postgresql
- Patroni 会自动触发故障切换,选取健康备用。
二、故障恢复
恢复故障节点:
bash
sudo rm -rf /var/lib/postgresql/15/main
patronictl reinit node1
patronictl restart node1
结语
通过本文配置:
- Debian 11 + PostgreSQL 15
- Patroni+etcd 高可用管理
- 跨地域物理复制 + 逻辑复制支持
- 自动故障切换与监控体系
可以构建一个稳定可靠的、具备跨地域容灾能力的 PostgreSQL 集群。
如需进一步扩展:
- 引入备份策略(pgBackRest)
- 更细粒度权限与审计
- 跨云平台复制策略优化
欢迎按需调整参数以满足业务峰值与可用性 SLA 要求。