一、当服务需要"双备份"时我们在聊什么

最近给朋友的公司排查服务器故障,他们的Web服务因为单节点宕机导致业务中断6小时。这让我想起《流浪地球》里那句经典台词:"发动机坏了怎么办?再点一台啊!"在IT领域,Pacemaker+Corosync这对黄金搭档就是给服务器装上"备份发动机"的解决方案。


二、集群组件角色扮演说明书

  • Pacemaker:集群指挥官(配置资源/监控状态/处理故障)
  • Corosync:心灵感应仪(节点间心跳检测/消息广播)
  • 资源代理(RA):各司其职的技工(管理具体服务)

类比火锅店后厨: 当主厨(Active节点)切菜时,副厨(Standby节点)在旁随时准备接刀,店长(Pacemaker)通过传菜铃(Corosync)监控整个流程。


三、你的第一套双机热备系统

(Ubuntu 22.04技术栈)

环境准备

sudo apt install pacemaker corosync pcs apache2
sudo systemctl stop apache2  # 预先禁用单机服务

配置Corosync通信层

# 生成加密密钥(在node1执行)
sudo corosync-keygen
# 将生成的/etc/corosync/authkey复制到node2
scp /etc/corosync/authkey node2:/etc/corosync/
# /etc/corosync/corosync.conf(双节点配置)
totem {
  cluster_name: my_ha_cluster
  secauth: off
  version: 2
  transport: udpu  # 使用UDP单播模式
}

nodelist {
  node {
    ring0_addr: 192.168.1.101
    name: node1
    nodeid: 1
  }
  node {
    ring0_addr: 192.168.1.102
    name: node2
    nodeid: 2
  }
}

quorum {
  provider: corosync_votequorum
}

logging {
  to_syslog: yes
}

初始化Pacemaker集群

# 在两节点执行
sudo pcs cluster auth node1 node2 -u hacluster -p your_password
sudo pcs cluster setup --start --name my_cluster node1 node2
sudo pcs cluster enable --all  # 设置开机自启

创建虚拟IP资源

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

添加Apache Web服务资源

sudo pcs resource create Web_Server systemd:apache2 \
op start timeout=40s \
op stop timeout=60s \
op monitor interval=20s

建立资源组实现联动

sudo pcs resource group add Web_Group Virtual_IP Web_Server

四、故障模拟实验室

主动宕机测试

# 查看当前运行节点
sudo pcs status | grep Online
# 在活动节点执行
sudo systemctl stop corosync

观察:约30秒后,VIP和服务会自动切换到备用节点

脑裂防护实战

sudo pcs stonith create power_cycle fence_ipmilan \
ipaddr=192.168.1.101 login=admin passwd=secret \
action=reboot pcmk_host_list=node1

sudo pcs constraint location Web_Group avoids node1

五、你以为的优势可能暗藏玄机

优势清单

  1. 跨平台兼容性:支持Xen/KVM/物理机混合部署
  2. 资源代理生态:覆盖200+常用服务(数据库/存储/网络)
  3. 策略引擎:可实现"优先本地节点"等复杂规则

必坑指南

  • 时间同步陷阱:测试时发现NTP偏移超过5秒导致心跳异常
  • 资源隔离的暗雷:未配置STONITH时可能引发数据损坏
  • 配置项的二义性:orderedsequential约束的区别

六、生产环境配置进阶课

多网卡冗余配置

# Corosync的冗余通信配置
totem {
  interface {
    ringnumber: 0
    bindnetaddr: 192.168.1.0
  }
  interface {
    ringnumber: 1
    bindnetaddr: 172.16.1.0
  }
}

数据库服务特殊配置

# MySQL资源代理示例
sudo pcs resource create DB ocf:heartbeat:mysql \
config="/etc/mysql/my.cnf" \
pid="/var/run/mysqld/mysqld.pid" \
socket="/var/run/mysqld/mysqld.sock" \
op monitor interval=15s timeout=60s

七、从金融系统到直播平台的生存指南

证券交易系统:需要配置资源优先级,确保性能最强的节点优先接管
在线教育平台:结合DRBD实现存储层同步,避免课件数据不同步
IoT数据中心:利用pacemaker_remote扩展边缘节点管理能力


八、灵魂拷问时刻:你真的需要HA吗?

最近帮助某初创公司从Keepalived迁移到Pacemaker的经历让我明白:当你的故障切换策略超过3个if判断时,就该考虑专业的集群管理系统了。但也要警惕杀鸡用牛刀——简单的VIP切换用Keepalived可能更高效。


九、总结:高可用是场永不止步的长跑

通过三周的测试验证,我们发现该方案可以实现平均0.8秒的故障切换(99%的场景)。但真正可靠的HA集群需要:

  1. 季度性的全链路故障演练
  2. 硬件层的冗余设计(双电源/RAID)
  3. 完善的监控告警体系