🎯 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(先把「疑似挂了」的那边断电,再接管)。
解决方案:
- 配置多个心跳路径
- 启用 STONITH
- 设置合理的超时时间
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:像集团运营中心,管多机房、多服务、谁先启谁后停、故障了谁接管、还要拉闸隔离,功能全但学习成本高。
📚 官方文档与资源
以下为 Corosync 与 Pacemaker 的官方或常用文档,便于查阅与排错。
| 项目 | 说明 | 链接 |
|---|---|---|
| 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 高可用与集群文档,与上述社区文档在概念上一致,部分配置路径或包名可能因发行版而略有不同。
💡 最佳实践
配置建议
-
永远启用 STONITH:生产环境必须配置
bashpcs property set stonith-enabled=true -
设置资源粘性:避免资源频繁迁移
bashpcs property set default-resource-stickiness=100生活例子 :粘性像「不想随便搬家」------节点恢复后,资源不会立刻被拉回去,而是倾向于留在当前节点,避免网络抖一下就在两节点间来回迁,服务来回重启。
-
配置资源监控:及时发现问题
bashop monitor interval=30s timeout=20s -
使用奇数节点:便于法定票数决策
-
多心跳路径:网络 + 磁盘心跳
-
定期测试:故障切换演练
配置模板
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!就像开车要系安全带一样重要!