You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于使用Pacemaker为双PostgreSQL双向复制VM配置虚拟IP及仲裁节点数量的技术咨询

使用Pacemaker为双PostgreSQL双向复制VM配置虚拟IP及仲裁节点数量的技术咨询

嗨,我来帮你拆解这两个问题,一步步给你讲清楚:

关于是否需要3台VM来维持Pacemaker仲裁

首先得明白Pacemaker的核心仲裁逻辑:集群默认需要多数节点在线才能正常运行(也就是quorum机制)。如果只有2台VM,quorum的阈值是2——只要其中一台宕机,剩下的那台就达不到“多数”标准,集群会自动停止服务,这是为了避免脑裂风险。

那有没有办法不用第三台VM?有两种方案,但各有取舍:

  • 方案1:修改仲裁策略
    可以设置no-quorum-policy=ignore,让单节点在失去quorum时仍能继续运行。执行命令:

    pcs property set no-quorum-policy=ignore
    

    但要注意:这种情况下如果两台VM之间的网络断了,会直接触发脑裂——两台都认为自己是集群唯一节点,同时持有VIP并对外提供服务,对你的双向PostgreSQL复制来说,很可能会出现数据冲突。所以这个方案适合对脑裂风险容忍度较高的场景,或者你已经在应用层做了冲突检测与处理。

  • 方案2:使用外部仲裁设备
    可以配置一个外部仲裁设备(比如qdisk、SBD或者共享存储),让集群通过这个设备来判断quorum。这种方式不需要第三台VM,但需要额外的共享资源,配置相对复杂。

如果追求生产级别的稳定性,最稳妥的方式还是加一台轻量VM作为仲裁节点——不用给它分配太多资源(1核1G内存足够),它只需要参与集群的quorum投票,不运行Postgres服务。这样哪怕其中一台Postgres VM宕机,剩下的Postgres VM+仲裁节点仍然能达到“多数”,集群可以正常运行,同时有效避免脑裂。

如何为双向PostgreSQL复制的VM配置Pacemaker虚拟IP

假设你已经在两台VM上完成PostgreSQL安装和双向复制配置,接下来按以下步骤操作(以CentOS/RHEL为例,Debian/Ubuntu类似,包名略有差异):

  1. 安装Pacemaker及配套工具

    yum install pacemaker pcs fence-agents-all -y
    # Debian/Ubuntu环境执行:apt install pacemaker pcs fence-agents -y
    
  2. 初始化集群基础配置

    • 两台VM都启动并启用pcsd服务:
      systemctl enable --now pcsd
      
    • 设置hacluster用户的密码(两台VM必须设相同密码):
      passwd hacluster
      
    • 在其中一台VM上执行,完成两台节点的互相认证:
      pcs host auth node1 node2  # 替换成你的VM主机名或IP
      
    • 创建集群:
      pcs cluster setup --name postgres_cluster node1 node2
      
    • 启动集群(两台VM都会启动):
      pcs cluster start --all
      
  3. 调整集群属性(适配双节点场景)

    • 暂时禁用STONITH(如果还没配置 fencing设备,生产环境建议后续补上):
      pcs property set stonith-enabled=false
      
    • 如果采用双节点+忽略quorum的方案,执行:
      pcs property set no-quorum-policy=ignore
      
  4. 添加虚拟IP资源
    执行以下命令创建VIP资源(替换成你需要的IP和子网掩码):

    pcs resource create postgres_vip ocf:heartbeat:IPaddr2 ip=192.168.1.100 cidr_netmask=24 op monitor interval=30s
    

    这个VIP会在两台VM之间自动漂移——如果当前持有VIP的节点宕机,VIP会自动切换到另一台正常运行的节点。

  5. (可选)关联PostgreSQL服务与VIP
    如果你希望VIP只在PostgreSQL服务正常运行的节点上生效,可以添加资源约束:

    # 先创建PostgreSQL服务资源(假设你的PostgreSQL服务名是postgresql)
    pcs resource create postgres_service systemd:postgresql op monitor interval=10s
    # 添加关联约束,让VIP与PostgreSQL服务绑定
    pcs constraint colocation add postgres_vip with postgres_service INFINITY
    

    这样当某台VM的PostgreSQL服务停止时,VIP会自动漂移到另一台运行着PostgreSQL的节点。

最后提醒:因为你用的是双向PostgreSQL复制,当VIP切换到不同节点时,应用连接VIP后的读写操作需要确保数据一致性——比如可以在应用层处理写入冲突,或者结合Pacemaker的主从资源配置,指定其中一台作为主节点负责写入,另一台作为只读副本,让VIP只漂移到主节点,从根源上避免冲突。

备注:内容来源于stack exchange,提问作者user3924427

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 09:39:37