在Ubuntu上学习PostgreSQL高可用性,能否掌握构建企业级数据库集群的终极秘诀?

更新于
2026-09-29 07:00:33
2阅读来源:SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

为什么在Ubuntu上实现PostgreSQL高可用如此让人头疼?

许多 DBA 和开发者在尝试搭建公司级 PostgreSQL 集群时常遇到以下痛点: • 方案众多却不知哪种最适合自己的业务场景;• 配置文件繁琐,稍有差错就导致故障转移失效;不过,• 自动化程度不足,手动干预频繁增加运维负担;• 对成本敏感又担心稳定性不达标。怎么说呢,

一、常见的 PostgreSQL 高可用方案概览

  • Patroni + etcd基于复制栈的全自动化方案。适合对可用性要求极高的生产环境。
  • pg_repmgr轻量级复制管理工具。配合守护进程实现半自动切换,上手门槛低。
  • 主从 + Keepalived VIP: 最简洁的 VIP 漂移方案,成本最低但功能相对单一。按理说,

二、Patroni + etcd 方案详细说明

1. 方案原理

Patroni 负责集群控制面与故障检测;etcd 作为分布式锁存储,确保只有一个节点成为首领。这样即使网络抖动或节点宕机,也能在秒级完成故障转移。

在Ubuntu上学习PostgreSQL高可用性,能否掌握构建企业级数据库集群的终极秘诀?

2. 关键配置要点

  • etcd 集群地址必须保持一致;选举失败由否则会导致,按理说,
  • 数据目录需提前创建并授予 postgres 使用者权限。
  • Patroni 配置文件中 restapi.listen_address 必须绑定到所有节点可达的 IP,否则健康检查无法通过。
  • 开启 ttl 和 loop_wait 参数调节心跳频率,以适应不同网络延迟场景。

3. 自动故障转移演示

  1. 在三台 Ubuntu 主机别安装 PostgreSQL 14、etcd 3.5、patroni。
  2. 初始化 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"
  3. /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

在Ubuntu上学习PostgreSQL高可用性,能否掌握构建企业级数据库集群的终极秘诀?

Keepalived VIP 配合实现无感知访问

Pain Point: 应用层感知切换会导致短暂断连或事务回滚。话说回来,通过 Keepalived 漂移虚拟 IP,做到对应用透明。说到配置要点如下,

  • VIP 地址需与业务网段同层且未被占用;
  • Keepalived 的 中 priority 主库设为较高值,备库依次降低;
  • 检测脚本 建议调用 patroni 的 rest API,返回 JSON 中的 “state” 是否为 “running”。 此方式比单纯 ping 数据库更准确反映 Patroni 主从状态。

pg_repmgr 轻量方案快速上手

Pain Point : strong> 想要快速验证 HA 概念却不愿投入大量时间学习复杂组件。pgrepmgr 提供了简洁的命令行工具和日志监控模式。按理说,再看关键步骤,

  1. 安装 pgrepmgr 并在所有节点创建同名 replication 使用者并授予 REPLICATION 、 SUPERUSER。,
  2. 在主库执行 pgrepmgr standby clone -D $PGDATA -Fp -U replicator -h primaryhost -W;其实,此命令会基于流复制克隆一份完整数据目录;
  3. 在备库注册为 standby : pgrepmgr standby register …,
  4. 配置 systemd service 启动 pg
  5. repmond daemon,实时监控主备状态并在检测到主库不可达时触发 failover 脚本;
  6. 结合 keepalived 或 haproxy 再做 VIP 漂移以实现零感知切换。

主从 + Keepalived VIP 最小成本方案

Pain Point : strong> 预算有限却仍需要基本的读写分离和故障切换能力。此方案仅依赖 PostgreSQL 原生流复制 + Keepalived 的 VRRP 漂移 Vip,部署时间通常不到半小时。说到步骤概述,

  • 在两台 Ubuntu 别安装 postgresql‑xx 、 配置 postgresql.conf 还有 pg_hba.conf 添加复制使用者;
  • 在主库执行基础备份 得到备库数据目录;怎么说呢,
  • 在备库启动 postgres。确认流同步正常,
  • 安装 keepalived,编辑 keepalived.conf :定义 vrrp_instance VI_① virtual_ipaddress { x.x.x.x/yy } 、 track_script { chk_pgsql };脚本检测 postgres 是否接受连接及是否处于 recovery 模式;
  • launch keepalived.service;验证 VIP 因为主备状态漂移。

架构对比表 & 决策教程

适用场景金融交易 、电商主要订单等零容忍丢失场景中小型 SaaS 、内部报表程序演示环境 、临时批处理任务 tr table tbody table tr td td td tr td td tr td tr td table table tr td tr table table tr tr tbody tbody ttable ttable

*以上表格仅供参考,实际选型还需结合业务峰值 QPS 、 数据一致性要求及团队熟悉度。不过,*

一键落地脚本示例

// 注意:请先确保三台机器能够相互 SSH 無密碼登錄。// 下面以 root 身份執行作為範例,// 生產環境請改為專用運維帳號並啟用 sudo。

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(|int }} EOF

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+etcdpg_repmgr主流+Keepalive​d Vip
自动化程度完全自动半自动仅VIP漂移自动
部署复杂度中等低最低
运维开销较低
成本略高最低

标签:Ubuntu

为什么在Ubuntu上实现PostgreSQL高可用如此让人头疼?

许多 DBA 和开发者在尝试搭建公司级 PostgreSQL 集群时常遇到以下痛点: • 方案众多却不知哪种最适合自己的业务场景;• 配置文件繁琐,稍有差错就导致故障转移失效;不过,• 自动化程度不足,手动干预频繁增加运维负担;• 对成本敏感又担心稳定性不达标。怎么说呢,

一、常见的 PostgreSQL 高可用方案概览

  • Patroni + etcd基于复制栈的全自动化方案。适合对可用性要求极高的生产环境。
  • pg_repmgr轻量级复制管理工具。配合守护进程实现半自动切换,上手门槛低。
  • 主从 + Keepalived VIP: 最简洁的 VIP 漂移方案,成本最低但功能相对单一。按理说,

二、Patroni + etcd 方案详细说明

1. 方案原理

Patroni 负责集群控制面与故障检测;etcd 作为分布式锁存储,确保只有一个节点成为首领。这样即使网络抖动或节点宕机,也能在秒级完成故障转移。

在Ubuntu上学习PostgreSQL高可用性,能否掌握构建企业级数据库集群的终极秘诀?

2. 关键配置要点

  • etcd 集群地址必须保持一致;选举失败由否则会导致,按理说,
  • 数据目录需提前创建并授予 postgres 使用者权限。
  • Patroni 配置文件中 restapi.listen_address 必须绑定到所有节点可达的 IP,否则健康检查无法通过。
  • 开启 ttl 和 loop_wait 参数调节心跳频率,以适应不同网络延迟场景。

3. 自动故障转移演示

  1. 在三台 Ubuntu 主机别安装 PostgreSQL 14、etcd 3.5、patroni。
  2. 初始化 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"
  3. /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

在Ubuntu上学习PostgreSQL高可用性,能否掌握构建企业级数据库集群的终极秘诀?

Keepalived VIP 配合实现无感知访问

Pain Point: 应用层感知切换会导致短暂断连或事务回滚。话说回来,通过 Keepalived 漂移虚拟 IP,做到对应用透明。说到配置要点如下,

  • VIP 地址需与业务网段同层且未被占用;
  • Keepalived 的 中 priority 主库设为较高值,备库依次降低;
  • 检测脚本 建议调用 patroni 的 rest API,返回 JSON 中的 “state” 是否为 “running”。 此方式比单纯 ping 数据库更准确反映 Patroni 主从状态。

pg_repmgr 轻量方案快速上手

Pain Point : strong> 想要快速验证 HA 概念却不愿投入大量时间学习复杂组件。pgrepmgr 提供了简洁的命令行工具和日志监控模式。按理说,再看关键步骤,

  1. 安装 pgrepmgr 并在所有节点创建同名 replication 使用者并授予 REPLICATION 、 SUPERUSER。,
  2. 在主库执行 pgrepmgr standby clone -D $PGDATA -Fp -U replicator -h primaryhost -W;其实,此命令会基于流复制克隆一份完整数据目录;
  3. 在备库注册为 standby : pgrepmgr standby register …,
  4. 配置 systemd service 启动 pg
  5. repmond daemon,实时监控主备状态并在检测到主库不可达时触发 failover 脚本;
  6. 结合 keepalived 或 haproxy 再做 VIP 漂移以实现零感知切换。

主从 + Keepalived VIP 最小成本方案

Pain Point : strong> 预算有限却仍需要基本的读写分离和故障切换能力。此方案仅依赖 PostgreSQL 原生流复制 + Keepalived 的 VRRP 漂移 Vip,部署时间通常不到半小时。说到步骤概述,

  • 在两台 Ubuntu 别安装 postgresql‑xx 、 配置 postgresql.conf 还有 pg_hba.conf 添加复制使用者;
  • 在主库执行基础备份 得到备库数据目录;怎么说呢,
  • 在备库启动 postgres。确认流同步正常,
  • 安装 keepalived,编辑 keepalived.conf :定义 vrrp_instance VI_① virtual_ipaddress { x.x.x.x/yy } 、 track_script { chk_pgsql };脚本检测 postgres 是否接受连接及是否处于 recovery 模式;
  • launch keepalived.service;验证 VIP 因为主备状态漂移。

架构对比表 & 决策教程

适用场景金融交易 、电商主要订单等零容忍丢失场景中小型 SaaS 、内部报表程序演示环境 、临时批处理任务 tr table tbody table tr td td td tr td td tr td tr td table table tr td tr table table tr tr tbody tbody ttable ttable

*以上表格仅供参考,实际选型还需结合业务峰值 QPS 、 数据一致性要求及团队熟悉度。不过,*

一键落地脚本示例

// 注意:请先确保三台机器能够相互 SSH 無密碼登錄。// 下面以 root 身份執行作為範例,// 生產環境請改為專用運維帳號並啟用 sudo。

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(|int }} EOF

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+etcdpg_repmgr主流+Keepalive​d Vip
自动化程度完全自动半自动仅VIP漂移自动
部署复杂度中等低最低
运维开销较低
成本略高最低

标签:Ubuntu