物理服务器高可用方案选型:Corosync+Pacemaker的优势
企业核心业务对服务器可用性的要求通常是99.99%以上,单机部署根本无法满足。硬件故障、操作系统崩溃、网络中断——任何单点故障都会导致业务中断。高可用集群(HA Cluster)通过冗余和自动故障切换解决这个问题。
Corosync负责集群节点间的消息传递和成员管理,Pacemaker负责资源调度和故障恢复。两者配合是Linux上最成熟的高可用方案,支持Active/Passive和Active/Active两种模式。
集群环境规划与基础配置
以两节点Active/Passive集群为例。两台物理服务器分别作为主节点和备节点,共享存储通过iSCSI提供,浮动IP对外提供服务。
# 节点规划
# node1: 192.168.1.11 (主节点)
# node2: 192.168.1.12 (备节点)
# 浮动VIP: 192.168.1.100
# 1. 配置主机名和DNS解析(两节点都执行)
hostnamectl set-hostname node1 # node2上设为node2
# /etc/hosts 添加
192.168.1.11 node1
192.168.1.12 node2
# 2. 安装HA组件
yum install -y pacemaker corosync pcs resource-agents
# 3. 启动pcs守护进程并设置hacluster密码
systemctl enable --now pcsd
echo "hacluster:YourStr0ngPass" | chpasswd hacluster
# 4. 节点认证(在node1执行)
pcs cluster auth node1 node2 -u hacluster -p YourStr0ngPass
Corosync集群通信配置与仲裁机制
集群节点间需要可靠的心跳通信。Corosync支持UDP多播和UDP单播两种模式。在云环境或不支持多播的网络中,必须使用单播模式。
# 创建并启动集群
pcs cluster setup mycluster node1 node2 --transport udpu \
--addr0 192.168.1.11 --addr1 192.168.1.12
pcs cluster start --all
pcs cluster enable --all
# 配置仲裁(两节点集群需要禁用stonith或使用仲裁盘)
pcs property set stonith-enabled=false
pcs property set no-quorum-policy=ignore
# 生产环境强烈建议配置STONITH
# pcs stonith create ipmi_fence fence_ipmilan \
# pcmk_hostlist="node1 node2" \
# ipaddr=192.168.1.101 login=admin passwd=password \
# op monitor interval=60s
仲裁配置的关键决策点:三节点以上的集群建议启用仲裁投票,两节点集群只能选择忽略仲裁或外接仲裁设备。生产环境中,如果物理服务器支持IPMI,务必配置STONITH设备。
Pacemaker资源配置:浮动IP与业务服务
资源是Pacemaker管理的最小单元。一个完整的业务切换需要浮动IP、文件系统挂载、服务进程三个资源协同工作。
# 创建浮动IP资源
pcs resource create VirtualIP ocf:heartbeat:IPaddr2 \
ip=192.168.1.100 cidr_netmask=24 \
op monitor interval=30s
# 创建文件系统资源(假设共享iSCSI存储)
pcs resource create WebFS ocf:heartbeat:Filesystem \
device="/dev/mapper/vg0-lv_web" directory="/var/www" fstype="xfs" \
op monitor interval=20s
# 创建Nginx服务资源
pcs resource create WebServer systemd:nginx \
op monitor interval=15s timeout=10s \
op start timeout=30s \
op stop timeout=30s
# 创建资源组
pcs resource group add WebGroup VirtualIP WebFS WebServer
# 配置资源粘性
pcs resource defaults resource-stickiness=100
# 查看集群状态
pcs status
资源组的优势:所有资源在同一节点启动,启动顺序按添加顺序执行,停止顺序相反。避免手动编排资源间的依赖关系。
故障切换测试与监控告警集成
集群搭建完成后,故障切换测试是验证高可用的唯一方式。模拟三种故障场景:节点宕机、服务进程崩溃、网络分区。
# 场景1:模拟节点宕机(在node1上执行)
echo c > /proc/sysrq-trigger
# 观察node2是否在预期时间内接管资源
pcs status
# 场景2:模拟服务进程崩溃
ssh node1 "kill -9 $(pgrep nginx)"
# Pacemaker应在15秒内检测到并重启服务
# 场景3:模拟网络分区
iptables -A INPUT -p udp --dport 5405 -j DROP
iptables -A OUTPUT -p udp --dport 5405 -j DROP
# 观察集群行为,确认不会发生脑裂
监控告警方面,Pacemaker的CRM Mon工具可以实时监控集群状态。结合Zabbix或Prometheus的HA Exporter,将集群事件推送到告警平台。
# crm_mon的XML输出可被监控系统解析
crm_mon --output-as xml | python3 -c "
import sys, xml.etree.ElementTree as ET
tree = ET.parse(sys.stdin)
root = tree.getroot()
summary = root.find('summary')
nodes = summary.find('nodes_configured').get('number')
resources = summary.find('resources_configured').get('number')
print(f'集群节点数: {nodes}, 资源数: {resources}')
for node in root.findall('.//node'):
name = node.get('name')
online = node.get('online') == 'true'
standby = node.get('standby') == 'true'
status = '在线' if online and not standby else '离线/待机'
print(f' {name}: {status}')
"
生产环境调优与常见坑
高可用集群上线前还需要处理几个常见问题。第一,时钟同步——所有节点必须配置NTP,时间偏差超过几秒会导致Corosync心跳异常。第二,防火墙规则——Corosync默认使用UDP 5405-5406端口,Pacemaker远程使用TCP 3121端口,必须放行。第三,共享存储的并发访问——Active/Passive模式下同一时刻只有一个节点挂载文件系统,但Active/Active场景需要使用OCFS2或GFS2等集群文件系统。
日志排查时重点关注/var/log/pacemaker.log和/var/log/corosync.log。资源切换失败的常见原因是资源代理脚本的monitor操作超时——将monitor timeout调大到实际启动时间的1.5倍通常能解决。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-wu-li-fu-wu-qi-gao-ke-yong-ji-qun-da-jian/