Corosync + Pacemaker 集群管理完全指南

🎯 Corosync 和 Pacemaker 简介

它们是什么?

Pacemaker
Corosync
提供成员信息
通知隔离指令
📡 通讯层

心跳传输

成员关系管理
🧠 资源管理层

调度决策

故障恢复

组件 职责 生活类比
Corosync 心跳信息传输、成员关系管理 公司的通讯系统和人事考勤系统
Pacemaker 资源调度、故障恢复决策 公司的运营总监和调度中心

官方定义简述 (来源: Corosync / ClusterLabs Pacemaker):

  • Corosync :Group Communication System,为高可用应用提供组通信四类 C API ------法定人数(quorum)通知、配置/统计内存库、可用性管理(进程失败时重启)、虚拟同步的进程组通信(用于复制状态机)。被 Pacemaker、Asterisk 等用作 HA 框架。项目托管于 GitHub corosync/corosync
  • Pacemaker :High-availability cluster resource manager,在多个主机上运行,检测并恢复 节点与服务级故障,支持 Fencing(STONITH) 保证数据一致、多种资源接口(OCF、systemd、LSB、STONITH)、资源间顺序/排列/位置约束、Clone 与 promotable clone 等。配置可在任意节点更新并自动复制到全集群。详见 Pacemaker Explained

历史背景

有趣的事实:Corosync 约 60% 的代码来源于 OpenAIS 项目,就像是同一个家族分家出来的亲兄弟。


🏗️ Corosync 详解

Corosync 的核心功能

Corosync
心跳传输
成员关系管理
消息传递
仲裁机制
UDP 单播/组播/广播
CCM 服务
可靠消息传递
Quorum 投票

Corosync 配置文件结构

Corosync 的主配置文件是 /etc/corosync/corosync.conf,就像公司的规章制度手册。

bash 复制代码
# Corosync 配置文件结构
totem {
    version: 2
    cluster_name: mycluster
    transport: udpu        # UDP 单播模式
    interface {
        ringnumber: 0
        bindnetaddr: 192.168.1.0
        mcastport: 5405
    }
}

nodelist {
    node {
        ring0_addr: 192.168.1.10
        name: node1
        nodeid: 1
    }
    node {
        ring0_addr: 192.168.1.11
        name: node2
        nodeid: 2
    }
}

quorum {
    provider: corosync_votequorum
    expected_votes: 2
    two_node: 1          # 双节点集群特殊处理
}

logging {
    to_logfile: yes
    logfile: /var/log/corosync/corosync.log
}

配置参数解析

参数 说明 生活类比
totem 传递协议配置 通讯工具的设置
transport 传输方式:udpu(单播)/udp(组播) 广播喊话还是单独发消息
ringnumber 环号,支持多路径心跳 主通讯线路和备用线路
nodelist 节点列表 员工通讯录
quorum 法定票数配置 董事会投票规则

生活例子 :Quorum 就像公司重大决策要过半数股东同意------3 个节点时至少 2 票才算「合法集群」;断网后若一边只有 1 个节点,它拿不到过半票数,就不会去动共享资源,避免脑裂。

传输方式对比

传输方式 说明 优点 缺点 生活类比
UDP 广播 向所有节点广播 配置简单 浪费带宽,不支持跨网段 大喇叭喊话,整栋楼都听见
UDP 组播 向组播组发送 效率高 需要交换机支持组播 只给「订阅了频道」的人发消息
UDPU 单播 点对点传输 支持跨网段、无组播依赖 需 nodelist,配置稍复杂 一对一私聊,每人单独发
KNET(Corosync 3) 新一代默认传输 多链路、压缩与加密、性能更好 需 Corosync 3.x 专用内线电话,加密且可冗余

生活例子:单播像「给每个同事单独发微信确认在岗」;组播像「在部门群里发一条:在的扣 1」;广播像「在楼道里喊:谁在?」。跨机房或交换机不支持组播时,常用 UDPU 单播。

心跳机制

心跳就像员工每隔几分钟说一句"我还在",让公司知道谁在线、谁可能出事了。
节点3 节点2 节点1 节点3 节点2 节点1 超时未收到心跳 = 可能故障 💓 心跳包 (每秒) 💓 心跳包 (每秒) 💓 心跳包 (每秒) 💓 心跳包 (每秒) 💓 心跳包 (每秒) 💓 心跳包 (每秒)

心跳超时设置

bash 复制代码
# token:多长时间没心跳认为超时
token: 10000          # 10000ms = 10秒

# token_retransmits:超时后重试次数
token_retransmits: 5

# join:节点加入集群超时时间
join: 60

# consensus:达成共识超时时间
consensus: 6000

生活类比

  • token:打卡间隔,太久没打卡认为旷工;就像家人约好「每小时在群里发一句」,超过两小时没动静就打电话找人。
  • token_retransmits:最多允许几次忘记打卡;偶尔网络抖一下可以重试,次数用完后才判「失联」。
  • join:新员工入职办理时间;新节点加入集群时,大家等它同步完配置再一起干活。
  • consensus:董事会投票决策时间;所有节点对「谁在、谁不在」达成一致的最长等待时间。

🧠 Pacemaker 详解

Pacemaker 的核心组件

Pacemaker
CRM

集群资源管理器
CIB

集群信息库

XML文档
LRM

本地资源管理器
DC

协调员

主节点
PE

策略引擎
TE

迁移引擎

组件详解

组件 全称 职责 生活类比
CRM Cluster Resource Manager 集群资源管理器 公司运营总监
CIB Cluster Information Base 集群信息库(XML) 公司规章制度文档
LRM Local Resource Manager 本地资源管理器 各部门主管
DC Designated Coordinator 指定协调员 总经理(主节点)
PE Policy Engine 策略引擎 智囊团,分析决策
TE Transition Engine 迁移引擎 调度员,执行决策

DC 选举机制

DC(Designated Coordinator)是集群中的"总经理",负责决策和调度。




集群启动
已有DC?
使用现有DC
开始选举
所有节点投票
节点ID最小者当选
新DC开始工作
DC管理CIB

协调资源调度
DC故障?

选举规则:通常节点 ID 最小的节点当选 DC。

生活类比 :就像公司选举临时负责人------谁工号最小谁当(资历最老);总经理出差了,大家按名单往下排,下一个顶上。DC 挂了会重新选举,不需要人工指定。

CIB 集群信息库

CIB(Cluster Information Base)是集群的"大脑记忆",记录所有资源配置和状态。
从节点2
从节点1
主节点 DC
同步
同步
CIB 主本

✅ 可读写
CIB 副本

👁️ 只读
CIB 副本

👁️ 只读

CIB 的内容结构

xml 复制代码
<cib>
  <configuration>
    <crm_config>      <!-- 集群属性配置 -->
    <nodes>           <!-- 节点定义 -->
    <resources>       <!-- 资源定义 -->
    <constraints>     <!-- 约束定义 -->
  </configuration>
  <status>            <!-- 当前状态 -->
    <node_state>
    <resource_state>
  </status>
</cib>

生活类比:CIB 就像公司的"管理手册",记录了:

  • 公司有什么人(节点)
  • 公司有什么资源(资源)
  • 资源怎么分配(约束)
  • 当前谁在干什么(状态)

📦 资源代理 (RA)

什么是资源代理?

资源代理(Resource Agent)是实际干活的"工人脚本",负责启动、停止、监控资源。
渲染错误: Mermaid 渲染失败: Lexical error on line 7. Unrecognized text. ...--> B1[/etc/init.d/*] C --> C1[增强功能] -----------------------^

RA 类型对比

类型 路径 功能 生活类比
LSB /etc/init.d/ start/stop 基础操作员
OCF /usr/lib/ocf/resource.d/ start/stop/monitor 高级技师,带监控
STONITH /usr/sbin/fence_* 隔离操作 保安/断电操作员
Systemd systemd 单元 systemd 管理 现代化管理员

STONITH 生活类比 :STONITH(Shoot The Other Node In The Head)就像保安拉闸 ------某台机器「看起来」死了(心跳没了),但可能只是网络断了,它自己还在写共享存储。若不等它真停就接管,两边同时写会乱。所以集群会先通过断电/重启/关电源把那台机器「物理上停掉」,确认它不会再写盘,再让别的节点接管。就像发现有人疑似失控,先把他请出房间再开会,避免双主。

OCF 资源代理规范

OCF(Open Clustering Framework)是最常用的资源代理类型。

bash 复制代码
# OCF 脚本的基本结构
#!/bin/bash
# 资源代理必须实现的操作:
# start   - 启动资源
# stop    - 停止资源
# monitor - 监控资源状态
# status  - 检查资源状态
# validate-all - 验证配置

# OCF 退出码
# 0 - 成功
# 1 - 错误
# 2 - 参数错误
# 3 - 未找到
# 7 - 资源正在运行

OCF 退出码含义

退出码 含义 生活类比
0 成功 任务完成 ✓
1 一般错误 出问题了,需要检查
2 参数错误 指令理解有误
3 未找到 找不到指定的东西
7 正在运行 任务进行中,请等待

常用资源代理示例

bash 复制代码
# IPaddr2 - VIP 资源代理
pcs resource create vip ocf:heartbeat:IPaddr2 \
    ip=192.168.1.100 cidr_netmask=24 \
    op monitor interval=30s

# mysql - 数据库资源代理
pcs resource create mysql ocf:heartbeat:mysql \
    binary=/usr/bin/mysqld_safe \
    config=/etc/mysql/my.cnf \
    datadir=/var/lib/mysql \
    user=mysql \
    group=mysql \
    op start timeout=60s \
    op stop timeout=120s \
    op monitor interval=20s timeout=30s

# Filesystem - 文件系统资源代理
pcs resource create fs ocf:heartbeat:Filesystem \
    device="/dev/sdb1" \
    directory="/data" \
    fstype="ext4" \
    op monitor interval=20s

🎯 Pacemaker 资源管理

资源类型

资源类型
Primitive

基本资源
Clone

克隆资源
Group

资源组
Master/Slave

主从资源
单实例运行
多副本运行
一起迁移
主从切换

资源类型对比一览

类型 同一时刻运行副本 典型用途 生活类比
Primitive 1 个 VIP、数据库、单实例服务 一把钥匙只能一个人拿;公司只有一枚公章
Clone 多个(每节点可多份) 无状态服务、监控代理 传单每人一份;每个分店都有一份同样的菜单
Group 组内资源同节点、同起同停 VIP+FS+MySQL 等绑在一起 一个小组一起出差,一起出发一起回来
Master/Slave 1 主 + 多从 数据库主从、DRBD 一个主厨带多个帮厨;主库写、从库读

1. Primitive(基本资源)

最基本的资源类型,同一时刻只能在一个节点运行。

bash 复制代码
# 创建基本资源
pcs resource create vip ocf:heartbeat:IPaddr2 ip=192.168.1.100
pcs resource create mysql ocf:heartbeat:mysql

生活类比:一把钥匙,只能一个人用。

2. Clone(克隆资源)

可以同时运行在多个节点的资源副本。

bash 复制代码
# 创建克隆资源
pcs resource create web ocf:heartbeat:apache \
    op monitor interval=30s \
    clone clone-web

# 克隆模式
pcs resource create web ocf:heartbeat:apache \
    op monitor interval=30s \
    clone clone-web \
    meta clone-max=3 clone-node-max=2

Clone 元数据参数

参数 说明 示例
clone-max 总副本数 3
clone-node-max 每节点最大副本数 1
clone-state 启动状态 Started/Stopped

生活类比:复印件,每人一份;或者传单,发给每个人。

3. Group(资源组)

多个资源捆绑在一起,总是迁移到同一个节点。

bash 复制代码
# 创建资源组
pcs resource create vip ocf:heartbeat:IPaddr2 ip=192.168.1.100
pcs resource create mysql ocf:heartbeat:mysql
pcs resource group add mysql-group vip mysql

# 或者直接创建组
pcs resource create vip ocf:heartbeat:IPaddr2 ip=192.168.1.100 \
    --group mysql-group
pcs resource create mysql ocf:heartbeat:mysql \
    --group mysql-group

资源组特点

  • 按顺序启动(组内顺序)
  • 按逆序停止
  • 一起迁移

生活类比:像一个团队,成员总是待在一起,要么一起出动,要么一起休息。

4. Master/Slave(主从资源)

一主多从的资源类型,从节点可以提供只读服务。

bash 复制代码
# 创建主从资源
pcs resource create ms ocf:heartbeat:mysql \
    master meta master-max=1 master-node-max=1 \
    clone-max=3 clone-node-max=1 \
    notify=true

Master/Slave 参数

参数 说明
master-max 最大主节点数(通常为1)
master-node-max 每节点最大主节点数
clone-max 总副本数
notify 启用主从切换通知

生活类比

  • 主从复制:经理和助理,经理做决策,助理辅助工作
  • 数据库主从:主库写数据,从库读数据

⚙️ Pacemaker 操作约束

约束定义了资源之间、资源与节点之间的关系。

约束类型总览

约束类型
Order

顺序约束
Colocation

排列约束
Location

位置约束
定义启动顺序
定义资源共存
定义运行位置

三种约束对比

约束 回答的问题 生活例子
Order 谁先启动、谁先停? 先穿袜子再穿鞋;关门前先关空调
Colocation 谁必须和谁在一起 / 谁不能和谁在一起? 钥匙和门禁卡要放一起;两个冤家不能排同一班
Location 更想(或更不想)在哪个节点跑? 你喜欢在 A 区办公;某台机器太老,不想把重要服务放上去

1. Order 约束(顺序约束)

定义资源的启动和停止顺序。

bash 复制代码
# 顺序约束语法
pcs constraint order [action] resource1 then [action] resource2 [options]

# 示例:先启动 fs,再启动 mysql
pcs constraint order start fs then start mysql

# 示例:停止时顺序相反
pcs constraint order stop mysql then stop fs

# 示例:强制执行
pcs constraint order start fs then start mysql \
    kind=Mandatory    # 必须顺序

# 示例:可选顺序
pcs constraint order start fs then start mysql \
    kind=Optional     # 尽量按顺序

# 示例:序列启动
pcs constraint order start A then B then C

Order kind 类型

Kind 说明 生活类比
Mandatory 必须按顺序(默认) 必须先穿内衣再穿外衣
Optional 尽量按顺序 最好按顺序,但不是强制
Serialize 串行执行,不能同时 一个一个来,不要抢

分数值 (Score)

bash 复制代码
# 使用分数值
pcs constraint order start fs then start mysql score=0
pcs constraint order start fs then start mysql score=INFINITY
分数 含义 口诀
0 无强制 随意安排
正数 倾向于此顺序 建议这样
INFINITY 必须如此 雷打不动

2. Colocation 约束(排列约束)

定义资源是否能运行在同一节点。

bash 复制代码
# 排列约束语法
pcs constraint colocation add [source] with [target] [score]

# 示例:MySQL 和 VIP 必须在一起
pcs constraint colocation add mysql with vip INFINITY

# 示例:Apache 和 Nginx 不能在一起
pcs constraint colocation add apache with nginx -INFINITY

# 示例:倾向在一起
pcs constraint colocation add app-a with app-b 100

分数值含义

分数 含义 生活口诀
+INFINITY 必须在一起 梁山伯与祝英台,生死不离
负数 尽量不在一起 相敬如宾,保持距离
-INFINITY 绝不能在一起 冤家路窄,有我没你
0 无偏好 随遇而安

生活类比

  • 正无穷:连体婴,必须在一起
  • 负数:猫和狗,最好分开养
  • 负无穷:火和油,绝对不能碰面

3. Location 约束(位置约束)

定义资源优先运行在哪些节点。

bash 复制代码
# 位置约束语法
pcs constraint location [resource] prefers [node] [=score]
pcs constraint location [resource] avoids [node] [=score]

# 示例:MySQL 倾向运行在 node1
pcs constraint location mysql prefers node1=100

# 示例:避免 VIP 运行在 node3
pcs constraint location vip avoids node3

# 示例:使用规则
pcs constraint location vip prefers rule score=100 #uname eq node1

位置约束方式

方式 说明 示例
prefers 倾向于某节点 prefers node1=100
avoids 避免某节点 avoids node3
rule 使用规则表达式 rule #uname eq node1

生活类比

  • prefers:你喜欢在家办公
  • avoids:你绝对不去某家餐厅
  • rule:如果下雨,就在家办公

🔧 Pacemaker 常用命令

集群状态查看

bash 复制代码
# 查看集群状态
pcs status

# 输出示例:
# Cluster name: mycluster
# Stack: corosync
# Current DC: node1 (version 1.1.20) - partition with quorum
# Last updated: Fri Jan 15 10:30:00 2025
# Last change: Fri Jan 15 10:00:00 2025 by root via cibadmin on node1
#
# 2 nodes configured
# 5 resources configured
#
# Online: [ node1 node2 ]
#
# Full list of resources:
#
#  vip    (ocf::heartbeat:IPaddr2):       Started node1
#  fs     (ocf::heartbeat:Filesystem):    Started node1
#  mysql  (ocf::heartbeat:mysql):        Started node1
#  web    (ocf::heartbeat:apache):       Started node2

# 查看资源配置
pcs resource show

# 查看资源状态(带 XML)
pcs resource show --full

# 查看约束配置
pcs constraint show

# 查看集群属性
pcs property show

资源操作

bash 复制代码
# 创建资源
pcs resource create <resource-id> <resource-type> <options>

# 示例:创建 VIP 资源
pcs resource create vip ocf:heartbeat:IPaddr2 \
    ip=192.168.1.100 \
    cidr_netmask=24 \
    nic=eth0 \
    op monitor interval=30s timeout=20s

# 启动/停止资源
pcs resource start <resource-id>
pcs resource stop <resource-id>

# 清理资源状态
pcs resource cleanup <resource-id>

# 删除资源
pcs resource delete <resource-id>

# 移动资源到指定节点
pcs resource move <resource-id> <node>

# 禁用/启用资源
pcs resource disable <resource-id>
pcs resource enable <resource-id>

生活例子pcs resource move给员工调岗 ------把 MySQL 从 node1 调到 node2,Pacemaker 会在目标节点启、在源节点停。cleanup清零考勤异常,让集群重新根据当前状态决策,不带着「上次失败」的旧账。

资源监控操作

bash 复制代码
# Op(操作)参数
op monitor interval=30s      # 每 30 秒检查一次
op start timeout=60s         # 启动超时 60 秒
op stop timeout=120s         # 停止超时 120 秒

# 完整示例
pcs resource create mysql ocf:heartbeat:mysql \
    config=/etc/mysql/my.cnf \
    datadir=/var/lib/mysql \
    user=mysql \
    op start timeout=120s \
    op stop timeout=120s \
    op monitor interval=30s timeout=30s

# 添加多个监控操作
pcs resource create mysql ocf:heartbeat:mysql \
    ... \
    op monitor interval=20s role=Started \
    op monitor interval=30s role=Slave \
    op monitor interval=10s role=Master

约束操作

bash 复制代码
# 添加顺序约束
pcs constraint order start fs then start mysql
pcs constraint order stop mysql then stop fs

# 添加排列约束
pcs constraint colocation add mysql with vip
pcs constraint colocation add apache with nginx -100

# 添加位置约束
pcs constraint location mysql prefers node1=100
pcs constraint location mysql avoids node3

# 删除约束
pcs constraint remove order-fs-mysql-start-mandatory
pcs constraint remove colocation-mysql-vip-INFINITY

# 清除所有约束
pcs constraint remove --all

集群属性配置

bash 复制代码
# 查看集群属性
pcs property show

# 设置集群属性
pcs property set stonith-enabled=true
pcs property set no-quorum-policy=stop
pcs property set default-resource-stickiness=100

# 重要属性
stonith-enabled=true          # 启用 STONITH(必须!)
no-quorum-policy=stop         # 丢失法定票数时的策略
default-resource-stickiness=100  # 默认资源粘性
symmetric-cluster=true        # 集群资源可以运行在任何节点
maintenance-mode=false        # 维护模式

法定票数策略

策略 说明 生活类比
stop 丢失 quorum 时停止资源(默认) 董事会凑不齐人数就不开会,今天的决议先不执行
ignore 忽略 quorum,继续运行 人没到齐也先干活(有脑裂风险,慎用)
freeze 冻结资源,不做任何变更 保持现状,既不启动新资源也不停旧的,等 quorum 恢复再说
suicide 丢失 quorum 时本节点自我隔离 「我们这边人不够,我们全体退出,让对面那一半继续」

生活例子:Quorum 就像「公司重大决策要过半数股东同意」。双节点时各 1 票,断网后两边都只有 1 票、都不到半数,默认 stop 下两边都不动,避免两边都以为自己是「合法集群」同时改数据。


🚨 故障排查

常见问题

1. 脑裂 (Split-Brain)

现象:多个节点都认为自己是主节点,可能同时写共享存储,导致数据错乱。

原因:心跳中断、网络分区(例如交换机故障、网线被拔),两边收不到对方心跳,各自认为对方挂了。

生活例子 :像两个值班经理同时收到「对方今天请假」的误报 ,都以为只有自己在岗,都去开保险柜、改账本,结果两份修改对不上。避免脑裂要靠:quorum (不到半数不干活)、STONITH(先把「疑似挂了」的那边断电,再接管)。

解决方案

  1. 配置多个心跳路径
  2. 启用 STONITH
  3. 设置合理的超时时间
bash 复制代码
# 检查心跳状态
crm_mon -1

# 查看节点状态
pcs status nodes

# 手动隔离节点
pcs stonith fence <node>
2. 资源无法启动

现象:资源一直处于 Failed 状态

排查步骤

bash 复制代码
# 1. 查看资源状态
pcs resource show

# 2. 查看资源日志
grep -i error /var/log/pacemaker/pacemaker.log

# 3. 手动测试资源代理
ocf-tester -o -n -v /usr/lib/ocf/resource.d/heartbeat/IPaddr2

# 4. 清理资源状态
pcs resource cleanup <resource-id>

# 5. 查看详细配置
pcs config show
3. 法定票数问题

现象:集群停止服务,提示 "Loss of Quorum"

解决方案

bash 复制代码
# 双节点集群忽略法定票数
pcs property set no-quorum-policy=ignore

# 或设置两个节点为一个"投票单元"
pcs property set no-quorum-policy=suicide

日志查看

bash 复制代码
# Pacemaker 日志
tail -f /var/log/pacemaker/pacemaker.log

# Corosync 日志
tail -f /var/log/corosync/corosync.log

# 系统日志
journalctl -u pacemaker -f
journalctl -u corosync -f

# 查看集群事件
crm_simulate -Ls

📊 与其他 HA 方案对比

Keepalived
Heartbeat
Corosync+Pacemaker
对比维度
复杂度
功能
灵活性
学习曲线
⭐⭐⭐⭐ 高
⭐⭐⭐⭐⭐ 很强
⭐⭐⭐⭐⭐ 很高
⭐⭐⭐⭐ 陡峭
⭐⭐ 中
⭐⭐⭐ 中
⭐⭐ 低
⭐⭐ 平缓
⭐ 低
⭐⭐ 简单
⭐ 低
⭐ 很平

特性 Corosync+Pacemaker Heartbeat Keepalived
复杂度
功能 很强 简单(主要是 VIP)
灵活性 很高
适用场景 复杂集群 传统 HA 简单 VIP 漂移

选择建议

  • 简单 VIP 漂移:Keepalived 足够
  • 中等复杂度:Heartbeat
  • 复杂多资源管理:Corosync + Pacemaker

生活类比选型

  • Keepalived:像小区门卫,只管「大门钥匙(VIP)」谁拿着,简单够用。
  • Heartbeat:像小公司行政,管几把钥匙、几台打印机,配置不复杂。
  • Corosync + Pacemaker:像集团运营中心,管多机房、多服务、谁先启谁后停、故障了谁接管、还要拉闸隔离,功能全但学习成本高。

📚 官方文档与资源

以下为 CorosyncPacemaker 的官方或常用文档,便于查阅与排错。

项目 说明 链接
Corosync 项目首页、四类 API(quorum、配置库、可用性管理、组通信) corosync.github.io
Corosync 源码/发布 源码与发布包 GitHub corosync/corosync
Pacemaker 文档中心 官方文档入口 clusterlabs.org/pacemaker/doc
Pacemaker Explained 配置与 CIB 详解(资源、约束、Fencing、Clone、规则等) Pacemaker Explained 3.0
Clusters from Scratch 从零搭建集群的步骤指南 Clusters from Scratch
Pacemaker Administration 日常管理与运维 Pacemaker Administration
ClusterLabs 社区与项目总站 clusterlabs.org

RHEL/CentOS 用户还可参考 Red Hat 高可用与集群文档,与上述社区文档在概念上一致,部分配置路径或包名可能因发行版而略有不同。


💡 最佳实践

配置建议

  1. 永远启用 STONITH:生产环境必须配置

    bash 复制代码
    pcs property set stonith-enabled=true
  2. 设置资源粘性:避免资源频繁迁移

    bash 复制代码
    pcs property set default-resource-stickiness=100

    生活例子 :粘性像「不想随便搬家」------节点恢复后,资源不会立刻被拉回去,而是倾向于留在当前节点,避免网络抖一下就在两节点间来回迁,服务来回重启。

  3. 配置资源监控:及时发现问题

    bash 复制代码
    op monitor interval=30s timeout=20s
  4. 使用奇数节点:便于法定票数决策

  5. 多心跳路径:网络 + 磁盘心跳

  6. 定期测试:故障切换演练

配置模板

bash 复制代码
# 完整的 MySQL HA 配置示例
#!/bin/bash

# 1. 配置 STONITH
pcs stonith create ipmi-fence fence_ipmilan \
    ipaddr=192.168.1.200 login=admin passwd=secret \
    pcmk_hostlist="node1 node2"

# 2. 创建资源
pcs resource create vip ocf:heartbeat:IPaddr2 \
    ip=192.168.1.100 cidr_netmask=24 \
    op monitor interval=30s

pcs resource create fs ocf:heartbeat:Filesystem \
    device="/dev/sdb1" directory="/data" fstype="ext4" \
    op monitor interval=20s

pcs resource create mysql ocf:heartbeat:mysql \
    config="/etc/mysql/my.cnf" \
    datadir="/data/mysql" \
    user=mysql group=mysql \
    op start timeout=120s \
    op stop timeout=120s \
    op monitor interval=30s timeout=30s

# 3. 配置资源组
pcs resource group add mysql-group vip fs mysql

# 4. 配置约束
pcs constraint order start fs then start mysql
pcs constraint colocation add mysql with vip INFINITY

# 5. 配置集群属性
pcs property set stonith-enabled=true
pcs property set default-resource-stickiness=100

🎯 总结

Corosync + Pacemaker 是 Linux 集群管理的黄金搭档,提供了强大的高可用解决方案。

核心要点记忆口诀

  • Corosync 传心跳,Pacemaker 管资源
  • CIB 是大脑,LRM 是手脚
  • 约束有三:顺序、排列、位置
  • STONITH 必须开,脑裂不再来
  • 资源要监控,粘性要设置

生活类比总结

  • Corosync = 公司的通讯系统
  • Pacemaker = 公司的运营总监
  • DC = 总经理
  • CIB = 管理手册
  • LRM = 各部门主管
  • RA = 一线工人

最后提醒:配置集群时,永远不要跳过 STONITH!就像开车要系安全带一样重要!