在Ubuntu上学习PostgreSQL高可用性,能否掌握构建企业级数据库集群的终极秘诀?
- 内容介绍
- 文章标签
- 相关推荐
为什么在Ubuntu上实现PostgreSQL高可用如此让人头疼?
许多 DBA 和开发者在尝试搭建公司级 PostgreSQL 集群时常遇到以下痛点: • 方案众多却不知哪种最适合自己的业务场景;• 配置文件繁琐,稍有差错就导致故障转移失效;不过,• 自动化程度不足,手动干预频繁增加运维负担;• 对成本敏感又担心稳定性不达标。怎么说呢,
一、常见的 PostgreSQL 高可用方案概览
- Patroni + etcd基于复制栈的全自动化方案。适合对可用性要求极高的生产环境。
- pg_repmgr轻量级复制管理工具。配合守护进程实现半自动切换,上手门槛低。
- 主从 + Keepalived VIP: 最简洁的 VIP 漂移方案,成本最低但功能相对单一。按理说,
二、Patroni + etcd 方案详细说明
1. 方案原理
Patroni 负责集群控制面与故障检测;etcd 作为分布式锁存储,确保只有一个节点成为首领。这样即使网络抖动或节点宕机,也能在秒级完成故障转移。
2. 关键配置要点
- etcd 集群地址必须保持一致;选举失败由否则会导致,按理说,
- 数据目录需提前创建并授予 postgres 使用者权限。
-
Patroni 配置文件中
restapi.listen_address必须绑定到所有节点可达的 IP,否则健康检查无法通过。 -
开启
ttl和loop_wait参数调节心跳频率,以适应不同网络延迟场景。
3. 自动故障转移演示
- 在三台 Ubuntu 主机别安装 PostgreSQL 14、etcd 3.5、patroni。
-
初始化 etcd 集群:
/usr/local/bin/etcd --name infra0 --initial-advertise-peer-urls http://10.0.0.1:2380 --listen-peer-urls http://10.0.0.1:2380 --listen-client-urls http://10.0.0.1:2379,http://127.0.0.1:2379 --advertise-client-urls http://10.0.0.1:2379 --initial-cluster-token etcd-cluster-1 --initial-cluster infra0=http://10.0.0.1:2380,infra1=http://10.0.0.2:2380,infra2=http://10.0.0.xx:2380 --initial-cluster-state new" -
/etc/patroni.yml 配置示例:
// 全局 scope这方面,postgres namespace: /service/ restapi: listen这方面,10.0.{{ node_id }}.1:8088 # 必须保证互通 connect_address: 10.{{ node_id }}.1:8 bootstrap: 说到dcs。ttl: 30 loop_wait: 15 retry_timeout: 5 maximum_lag_on_failover: 16777646 postgresql: use_pg_rewind: true parameters: max_connections: "456" shared_buffers:"5GB" effective_cache_size:"6GB" maintenance_work_mem:"5MB" checkpoint_completion_target:"9" wal_buffers:"6MB" default_statistics_target:"55" random_page_cost:"4" effective_io_concurrency:"4" work_mem:"5MB" use_slots:true restore_command:'' postgresql: 从listen来看,*::*:* # 本机所有 IP ... // 其他同步复制等参数按需添加 preferred_node: ... replication: username:pgrestreamer password:'' network:'*' // replication 使用者名/密码 parameters: ... 从tags来看,nofailover:false noload:false clonefrom:false nosync:false reload:true
提示:若出现 “etcd connection refused”,请检查防火墙是否放行了 -p tcp -m multiport --dports=8447 -j ACCEPT
Keepalived VIP 配合实现无感知访问
Pain Point: 应用层感知切换会导致短暂断连或事务回滚。话说回来,通过 Keepalived 漂移虚拟 IP,做到对应用透明。说到配置要点如下,
- VIP 地址需与业务网段同层且未被占用;
-
Keepalived 的
中 priority 主库设为较高值,备库依次降低; - 检测脚本 建议调用 patroni 的 rest API,返回 JSON 中的 “state” 是否为 “running”。 此方式比单纯 ping 数据库更准确反映 Patroni 主从状态。
pg_repmgr 轻量方案快速上手
Pain Point : strong> 想要快速验证 HA 概念却不愿投入大量时间学习复杂组件。pgrepmgr 提供了简洁的命令行工具和日志监控模式。按理说,再看关键步骤,
- 安装 pgrepmgr 并在所有节点创建同名 replication 使用者并授予 REPLICATION 、 SUPERUSER。,
- 在主库执行 pgrepmgr standby clone -D $PGDATA -Fp -U replicator -h primaryhost -W;其实,此命令会基于流复制克隆一份完整数据目录;
-
在备库注册为 standby : pgrepmgr standby register …,
- 配置 systemd service 启动 pg
repmond daemon,实时监控主备状态并在检测到主库不可达时触发 failover 脚本; - 结合 keepalived 或 haproxy 再做 VIP 漂移以实现零感知切换。
主从 + Keepalived VIP 最小成本方案
Pain Point : strong> 预算有限却仍需要基本的读写分离和故障切换能力。此方案仅依赖 PostgreSQL 原生流复制 + Keepalived 的 VRRP 漂移 Vip,部署时间通常不到半小时。说到步骤概述,
*以上表格仅供参考,实际选型还需结合业务峰值 QPS 、 数据一致性要求及团队熟悉度。不过,*
apt-get update && apt-get install -y postgresql-14 postgresql-client-14 \
etcd patreon keepalived
export HOSTNAME=$
export NODEID=${HOSTNAME##*-}
ETCDINITIALCLUSTER="infra-$)=$${HOSTNAME%%.*}:$${NODEID}"
/usr/local/bin/etcd \
--name infra${NODEID} \
--data-dir /var/lib/etcd \
--listen-peer-urls http://${LOCALIP}:{PEERPORT} \
--listen-client-urls http://${LOCALIP}:{CLIENTPORT}。http://{LOCALIP}:{CLIENTPORT} \
--advertise-client-urls http://${LOCALIP}:{CLIENTPORT} \
--initial-advertise-peer-urls http://${LOCALIP}:{PEERPORT} \
--initial-cluster ${ETCDINITIAL_CLUSTER} \
--initial-cluster-token etdc-cluster-grpc-demo \
--initial-cluster-state new &
cat>/etc/patroni.yml <'EOF'
scope : postgres
namespace : /service/
restapi :
listen : ${LOCALIP}:8$${NODEID} # 每個節點使用不同端口防止衝突
connectaddress : ${LOCALIP}:8$${NODEID}
bootstrap :
dcs :
ttl : {{ ETCDTTL|default|int }}
loopwait : {{ ETCDLOOPWAIT|default|int }}
retrytimeout : {{ ETCDRETRYTIMEOUT|default|int }}
maximumlagonfailover : {{ MAXLAG|default(
systemctl enable patroni && systemctl start patroni
curl -s http://localhost:${RESTAPI_PORT}/restapi/cluster/
echo "Patroni 已啟動,請根據業務需求調整同步複制參數與監控告警。"
EOF chmod +x /opt/deploypatroni.sh && /opt/deploypatrani.sh
version:'""'
services:
patron
...
架构对比表 & 决策教程
维度 Patroni+etcd pg_repmgr 主流+Keepalived Vip
自动化程度 完全自动 半自动 仅VIP漂移自动
部署复杂度 中等 低 最低
运维开销 较低
成本
适用场景
一键落地脚本示例
// 注意:请先确保三台机器能够相互 SSH 無密碼登錄。// 下面以 root 身份執行作為範例,// 生產環境請改為專用運維帳號並啟用 sudo。
为什么在Ubuntu上实现PostgreSQL高可用如此让人头疼?
许多 DBA 和开发者在尝试搭建公司级 PostgreSQL 集群时常遇到以下痛点: • 方案众多却不知哪种最适合自己的业务场景;• 配置文件繁琐,稍有差错就导致故障转移失效;不过,• 自动化程度不足,手动干预频繁增加运维负担;• 对成本敏感又担心稳定性不达标。怎么说呢,
一、常见的 PostgreSQL 高可用方案概览
- Patroni + etcd基于复制栈的全自动化方案。适合对可用性要求极高的生产环境。
- pg_repmgr轻量级复制管理工具。配合守护进程实现半自动切换,上手门槛低。
- 主从 + Keepalived VIP: 最简洁的 VIP 漂移方案,成本最低但功能相对单一。按理说,
二、Patroni + etcd 方案详细说明
1. 方案原理
Patroni 负责集群控制面与故障检测;etcd 作为分布式锁存储,确保只有一个节点成为首领。这样即使网络抖动或节点宕机,也能在秒级完成故障转移。
2. 关键配置要点
- etcd 集群地址必须保持一致;选举失败由否则会导致,按理说,
- 数据目录需提前创建并授予 postgres 使用者权限。
-
Patroni 配置文件中
restapi.listen_address必须绑定到所有节点可达的 IP,否则健康检查无法通过。 -
开启
ttl和loop_wait参数调节心跳频率,以适应不同网络延迟场景。
3. 自动故障转移演示
- 在三台 Ubuntu 主机别安装 PostgreSQL 14、etcd 3.5、patroni。
-
初始化 etcd 集群:
/usr/local/bin/etcd --name infra0 --initial-advertise-peer-urls http://10.0.0.1:2380 --listen-peer-urls http://10.0.0.1:2380 --listen-client-urls http://10.0.0.1:2379,http://127.0.0.1:2379 --advertise-client-urls http://10.0.0.1:2379 --initial-cluster-token etcd-cluster-1 --initial-cluster infra0=http://10.0.0.1:2380,infra1=http://10.0.0.2:2380,infra2=http://10.0.0.xx:2380 --initial-cluster-state new" -
/etc/patroni.yml 配置示例:
// 全局 scope这方面,postgres namespace: /service/ restapi: listen这方面,10.0.{{ node_id }}.1:8088 # 必须保证互通 connect_address: 10.{{ node_id }}.1:8 bootstrap: 说到dcs。ttl: 30 loop_wait: 15 retry_timeout: 5 maximum_lag_on_failover: 16777646 postgresql: use_pg_rewind: true parameters: max_connections: "456" shared_buffers:"5GB" effective_cache_size:"6GB" maintenance_work_mem:"5MB" checkpoint_completion_target:"9" wal_buffers:"6MB" default_statistics_target:"55" random_page_cost:"4" effective_io_concurrency:"4" work_mem:"5MB" use_slots:true restore_command:'' postgresql: 从listen来看,*::*:* # 本机所有 IP ... // 其他同步复制等参数按需添加 preferred_node: ... replication: username:pgrestreamer password:'' network:'*' // replication 使用者名/密码 parameters: ... 从tags来看,nofailover:false noload:false clonefrom:false nosync:false reload:true
提示:若出现 “etcd connection refused”,请检查防火墙是否放行了 -p tcp -m multiport --dports=8447 -j ACCEPT
Keepalived VIP 配合实现无感知访问
Pain Point: 应用层感知切换会导致短暂断连或事务回滚。话说回来,通过 Keepalived 漂移虚拟 IP,做到对应用透明。说到配置要点如下,
- VIP 地址需与业务网段同层且未被占用;
-
Keepalived 的
中 priority 主库设为较高值,备库依次降低; - 检测脚本 建议调用 patroni 的 rest API,返回 JSON 中的 “state” 是否为 “running”。 此方式比单纯 ping 数据库更准确反映 Patroni 主从状态。
pg_repmgr 轻量方案快速上手
Pain Point : strong> 想要快速验证 HA 概念却不愿投入大量时间学习复杂组件。pgrepmgr 提供了简洁的命令行工具和日志监控模式。按理说,再看关键步骤,
- 安装 pgrepmgr 并在所有节点创建同名 replication 使用者并授予 REPLICATION 、 SUPERUSER。,
- 在主库执行 pgrepmgr standby clone -D $PGDATA -Fp -U replicator -h primaryhost -W;其实,此命令会基于流复制克隆一份完整数据目录;
-
在备库注册为 standby : pgrepmgr standby register …,
- 配置 systemd service 启动 pg
repmond daemon,实时监控主备状态并在检测到主库不可达时触发 failover 脚本; - 结合 keepalived 或 haproxy 再做 VIP 漂移以实现零感知切换。
主从 + Keepalived VIP 最小成本方案
Pain Point : strong> 预算有限却仍需要基本的读写分离和故障切换能力。此方案仅依赖 PostgreSQL 原生流复制 + Keepalived 的 VRRP 漂移 Vip,部署时间通常不到半小时。说到步骤概述,
*以上表格仅供参考,实际选型还需结合业务峰值 QPS 、 数据一致性要求及团队熟悉度。不过,*
apt-get update && apt-get install -y postgresql-14 postgresql-client-14 \
etcd patreon keepalived
export HOSTNAME=$
export NODEID=${HOSTNAME##*-}
ETCDINITIALCLUSTER="infra-$)=$${HOSTNAME%%.*}:$${NODEID}"
/usr/local/bin/etcd \
--name infra${NODEID} \
--data-dir /var/lib/etcd \
--listen-peer-urls http://${LOCALIP}:{PEERPORT} \
--listen-client-urls http://${LOCALIP}:{CLIENTPORT}。http://{LOCALIP}:{CLIENTPORT} \
--advertise-client-urls http://${LOCALIP}:{CLIENTPORT} \
--initial-advertise-peer-urls http://${LOCALIP}:{PEERPORT} \
--initial-cluster ${ETCDINITIAL_CLUSTER} \
--initial-cluster-token etdc-cluster-grpc-demo \
--initial-cluster-state new &
cat>/etc/patroni.yml <'EOF'
scope : postgres
namespace : /service/
restapi :
listen : ${LOCALIP}:8$${NODEID} # 每個節點使用不同端口防止衝突
connectaddress : ${LOCALIP}:8$${NODEID}
bootstrap :
dcs :
ttl : {{ ETCDTTL|default|int }}
loopwait : {{ ETCDLOOPWAIT|default|int }}
retrytimeout : {{ ETCDRETRYTIMEOUT|default|int }}
maximumlagonfailover : {{ MAXLAG|default(
systemctl enable patroni && systemctl start patroni
curl -s http://localhost:${RESTAPI_PORT}/restapi/cluster/
echo "Patroni 已啟動,請根據業務需求調整同步複制參數與監控告警。"
EOF chmod +x /opt/deploypatroni.sh && /opt/deploypatrani.sh
version:'""'
services:
patron
...
架构对比表 & 决策教程
维度 Patroni+etcd pg_repmgr 主流+Keepalived Vip
自动化程度 完全自动 半自动 仅VIP漂移自动
部署复杂度 中等 低 最低
运维开销 较低
成本
适用场景
一键落地脚本示例
// 注意:请先确保三台机器能够相互 SSH 無密碼登錄。// 下面以 root 身份執行作為範例,// 生產環境請改為專用運維帳號並啟用 sudo。

