集群初始化
本文档承接《前置准备》完成后的环境,完成 Pacemaker 集群初始化、STONITH 配置与隔离能力验证。
后续路径:第 1、2 章分别给出方案 A(fence_aliyun)与方案 B(SBD)的完整配置步骤,按《Infra 选型》第 6 章的选型结果二选一执行;第 3 章的隔离验证对两种方案均适用。完成后进入《SAP HANA HSR 配置》——建立并验证主备复制关系,再按资源代理版本完成《集群接管与资源配置》,由集群接管 HANA 实例。
开始前的检查
节点名称解析(《前置准备》4.2 节)与两节点间 root SSH 互信(《前置准备》第 8 章)已完成——
ha-cluster-join的节点加入与集群配置文件同步依赖它们;采用方案 B 时,SBD 共享盘已挂载到两个节点,且两节点上该云盘的
SERIAL一致(《前置准备》第 3 章);SAP HANA 实例的系统级自启动已关闭(由实例 profile 的
Autostart = 0实现,服务保持 enabled;《前置准备》第 1 章)——避免节点重启(含第 3 章的隔离测试)后实例脱离集群控制自行启动。
1. 方案 A:fence_aliyun
方案 A 使用通用集群初始化命令完成集群搭建,STONITH 资源配置在初始化完成后单独进行。
1.1 集群初始化
# 在节点1(hana01)执行
ha-cluster-init -y -i eth0 -u
# 在节点2(hana02)执行
ha-cluster-join -y -c hana01 -i eth0
在云环境中使用 udpu(单播)模式,对应参数 "-u"。
初始化完成后,继续配置 fence_aliyun 的 STONITH 资源(见本文 1.2 节)。
1.2 STONITH 资源配置
fence_aliyun 隔离代理及其 RAM 角色授权的安装步骤见《前置准备》第 5 章与第 7 章。集群资源配置如下(该配置已包含在《集群接管与资源配置(SAPHanaSR-angi)》与《集群接管与资源配置(SAPHanaSR 经典版)》第 3 章的完整集群脚本中):
# === 集群全局属性 ===
property cib-bootstrap-options: \
stonith-enabled="true" \
stonith-action="reboot" \
stonith-timeout="150"
# === STONITH资源(阿里云fence_aliyun) ===
primitive res_ALIYUN_STONITH_1 stonith:fence_aliyun \
op monitor interval=120 timeout=60 \
params filter="InstanceIds=[\"<ECS Id1>\", \"<ECS Id2>\"]" plug=<ECS Id1> ram_role=SAP-HA-ROLE region=<region ID> \
meta target-role=Started
primitive res_ALIYUN_STONITH_2 stonith:fence_aliyun \
op monitor interval=120 timeout=60 \
params filter="InstanceIds=[\"<ECS Id1>\", \"<ECS Id2>\"]" plug=<ECS Id2> ram_role=SAP-HA-ROLE region=<region ID> \
meta target-role=Started
# STONITH位置约束:节点不运行自己的STONITH资源
location loc_stonith1_not_on_hana01 res_ALIYUN_STONITH_1 -inf: hana01
location loc_stonith2_not_on_hana02 res_ALIYUN_STONITH_2 -inf: hana02
可将上述配置保存为文件,通过 crm configure load update <文件> 加载,也可直接粘贴进 crm configure 交互环境执行。《集群接管与资源配置》两篇第 3 章的完整集群脚本包含相同的 STONITH 配置(方案 A 变体),重复加载为幂等更新。
2. 方案 B:SBD
方案 B 在集群初始化时直接将 SBD 设备纳入集群,由 crmsh 自动完成磁盘初始化、服务启用与 STONITH 资源配置。
2.1 集群初始化(推荐)
前置条件:已按《前置准备》第 3 章为两个节点挂载同一块 ESSD 多重挂载云盘,且两节点上该云盘的 SERIAL 一致。以下步骤中共享盘路径以 /dev/disk/by-id/nvme-Alibaba_Cloud_Elastic_Block_Storage_<云盘serial> 为例(即《前置准备》第 3 章记录的 by-id 稳定路径,两个节点一致)。
步骤 1:安装 sbd 软件包并加载 watchdog 模块(两个节点都执行)
zypper install -y sbd
# 加载 softdog watchdog 模块
modprobe softdog
# 配置开机自动加载
echo softdog > /etc/modules-load.d/softdog.conf
# 验证 watchdog 设备已就绪
ls -l /dev/watchdog
sbd query-watchdog
# 预期能看到 /dev/watchdog 对应的 watchdog 驱动信息
云服务器不提供硬件 watchdog 设备,因此使用 Linux 内核提供的软件 watchdog(softdog)。SUSE 的 SBD 支持策略允许在虚拟化/云环境中使用 softdog。
步骤 2:初始化集群并同时配置 SBD(SUSE 推荐方式)
在节点 1(hana01)执行:
ha-cluster-init -y -i eth0 -u -s /dev/disk/by-id/nvme-Alibaba_Cloud_Elastic_Block_Storage_<云盘serial>
在节点 2(hana02)执行(无需再指定 -s,SBD 设备已由节点 1 初始化):
ha-cluster-join -y -c hana01 -i eth0
-s 参数(--sbd)是 SUSE 推荐的 SBD 配置方式。ha-cluster-init -s 会一次性自动完成以下工作:
对设备执行
sbd create初始化磁盘头(watchdog timeout 15s、msgwait 30s);生成两节点一致的
/etc/sysconfig/sbd(含SBD_PACEMAKER=yes、SBD_STARTMODE=always、SBD_DELAY_START自动计算);启用并启动
sbd服务;创建
stonith-sbd(stonith:external/sbd)STONITH 资源并开启stonith-enabled。
节点 2 执行 ha-cluster-join 时会自动同步 SBD 配置、启用本节点的 sbd 服务,并补全隔离配置:为 stonith-sbd 设置 pcmk_delay_max=30s、设置 priority-fencing-delay=60,并将 stonith-timeout 调整为 83s。have-watchdog 属性由集群在检测到 SBD 后自动维护,无需手工配置(手工设置会被忽略)。
步骤 3:验证 SBD 状态(两个节点都执行)
systemctl status sbd
# 磁盘头信息两节点必须一致(UUID 相同)
sbd -d /dev/disk/by-id/nvme-Alibaba_Cloud_Elastic_Block_Storage_<云盘serial> dump
# 预期输出(设备路径即上面指定的 by-id 路径):
# Header version : 2.1
# UUID : <init 时自动生成,两节点须一致>
# Number of slots : 255
# Sector size : 512
# Timeout (watchdog) : 15
# Timeout (allocate) : 2
# Timeout (loop) : 1
# Timeout (msgwait) : 30
# 查看 SBD 消息槽位与集群属性
sbd -d /dev/disk/by-id/nvme-Alibaba_Cloud_Elastic_Block_Storage_<云盘serial> list
# 预期输出:
# 0 hana01 clear
# 1 hana02 clear
crm configure show
# 应包含 stonith-sbd(stonith:external/sbd)资源;have-watchdog 由集群自动置位
若两节点 dump 出的 UUID 不一致,说明两节点看到的并非同一块盘,需回到《前置准备》第 3 章核对云盘 SERIAL。sbd create 会覆盖磁盘上的既有数据,请确认操作的是专用于 SBD 的空白共享盘(由 ha-cluster-init -s 自动执行时同样适用)。
2.2 SBD 超时参数说明
ha-cluster-init -s(配合第二节点 ha-cluster-join)会按 crmsh 默认 profile 自动生成 SBD 超时参数(watchdog 15s、msgwait 30s、SBD_DELAY_START 71s、pcmk_delay_max 30s、stonith-timeout 83s)。SBD 的各项超时参数之间存在硬性约束关系,取值必须相互匹配,否则会出现集群启动失败或误隔离:
参数 | 位置 | 示例值 | 约束关系 |
| 磁盘头( | 15s | watchdog 监控超时,两处取值必须一致 |
| 磁盘头( | 30s | 须 >= 2 × |
| CIB | 150s | 须 >= 1.2 × ( |
|
| 30s | 随机延迟上限,用于降低隔离竞速概率 |
| CIB | 60s | 让高优先级节点在隔离竞速中占先 |
|
| 71s | 须 >= |
以 corosync token=5000ms、consensus=6000ms(ha-cluster-init 默认值)为例,上表取值的校验过程:
1) msgwait >= 2 × watchdog_timeout
30 >= 2 × 15 = 30 ✓
2) stonith-timeout >= 1.2 × (pcmk_delay_max + msgwait)
150 >= 1.2 × (30 + 30) = 72,余量充足(crmsh 自动值 83s) ✓
3) priority-fencing-delay >= 2 × pcmk_delay_max
60 >= 2 × 30 = 60 ✓
4) SBD_DELAY_START >= token + consensus + pcmk_delay_max + msgwait
71 >= 5 + 6 + 30 + 30 = 71 ✓
5) systemd 启动超时必须大于 SBD_DELAY_START
sbd.service TimeoutStartSec 默认 90s > 71s ✓
ha-cluster-init -s(配合第二节点 ha-cluster-join)自动生成的 stonith-timeout 为 83s:crmsh 按 max(1.2 × (pcmk_delay_max + msgwait), 60) + token + consensus 计算(本例 max(1.2 × (30 + 30), 60) + 5 + 6 = 83),已满足 1.2 × (pcmk_delay_max + msgwait) 的约束(72s)。priority-fencing-delay 不占用 stonith-timeout:Pacemaker 2.1 将 fencing delay 叠加在 stonith-timeout 之上计算等待时限(实际等待 = stonith-timeout + delay),两者不存在此消彼长的关系。《集群接管与资源配置(SAPHanaSR-angi)》与《集群接管与资源配置(SAPHanaSR 经典版)》第 3 章的完整集群脚本中显式将 stonith-timeout 设为 150s,是主动加大余量(约束下限 72s,自动值 83s 已满足),而非为了覆盖 fencing delay。
priority-fencing-delay 与 pcmk_delay_max 作用不同:pcmk_delay_max 给隔离动作加上随机延迟,用于降低双向隔离(fencing race)同时发生的概率;priority-fencing-delay 则让承载更高优先级资源的节点在隔离竞速中占先,使幸存者可预测。两者同时配置时须满足 priority-fencing-delay >= 2 × pcmk_delay_max(官方建议该值取到 pcmk_delay_max 上限的两倍)。
若调大 SBD_DELAY_START(例如因为增大了 msgwait),务必同步检查 sbd.service 的 TimeoutStartSec。当 SBD_DELAY_START 超过该值时,sbd.service 会在延迟等待期间被 systemd 判定为启动超时,导致集群栈无法启动。可通过 systemctl show sbd -p TimeoutStartUSec 查询当前值,并使用 drop-in 配置调整。
2.3 手动配置方式(备选)
推荐新部署按本文 2.1 节使用 ha-cluster-init -s 完成 SBD 配置。以下手动方式适用于已有集群追加 SBD(例如集群已按方案 A 初始化后切换)或需要自定义超时参数的场景。
步骤 1:初始化 SBD 磁盘(仅在一个节点执行)
# -1 指定 watchdog timeout(秒),-4 指定 msgwait(秒)
sbd -d /dev/disk/by-id/nvme-Alibaba_Cloud_Elastic_Block_Storage_<云盘serial> -1 15 -4 30 create
在两个节点上确认磁盘头信息一致:
sbd -d /dev/disk/by-id/nvme-Alibaba_Cloud_Elastic_Block_Storage_<云盘serial> dump
预期输出与本文 2.1 节步骤 3 相同,重点核对两节点 UUID 一致。
步骤 2:配置 /etc/sysconfig/sbd(两个节点都执行,内容需一致)
SBD_DEVICE="/dev/disk/by-id/nvme-Alibaba_Cloud_Elastic_Block_Storage_<云盘serial>"
SBD_PACEMAKER="yes"
SBD_STARTMODE="always"
SBD_WATCHDOG_DEV="/dev/watchdog"
SBD_WATCHDOG_TIMEOUT="15"
SBD_TIMEOUT_ACTION="flush,reboot"
SBD_DELAY_START="71"
步骤 3:启用 sbd 服务并重启集群栈(两个节点都执行)
systemctl enable sbd
crm cluster restart
步骤 4:配置 SBD STONITH 资源与集群属性
crm configure
# === 集群全局属性(方案 B)===
property cib-bootstrap-options: \
stonith-enabled="true" \
stonith-action="reboot" \
stonith-timeout="150" \
priority-fencing-delay="60"
# === STONITH资源(SBD) ===
primitive stonith-sbd stonith:external/sbd \
params pcmk_delay_max="30s"
超时参数约束与校验见本文 2.2 节的参数说明。SBD 资源无需位置约束——它由所有节点共同参与,不存在"节点隔离自己"的问题。《集群接管与资源配置(SAPHanaSR-angi)》与《集群接管与资源配置(SAPHanaSR 经典版)》第 3 章的完整集群脚本已包含上述 STONITH 配置,可直接通过脚本加载应用。
3. 验证隔离能力
STONITH 配置完成后,建议在业务上线前验证隔离能力。该操作会重启目标节点,请在业务窗口外执行:
# 触发一次隔离测试(以对端节点名为参数)
crm node fence <对端节点名>
# 查看隔离记录与集群状态
crm status
预期结果:方案 A 下目标节点被 fence_aliyun 通过 OpenAPI 重启;方案 B 下目标节点在 msgwait 时间内被 watchdog 重启。被隔离节点重启后自动重新加入集群,crm status 中两节点恢复为 online,且无残留的 STONITH 失败记录。
完成集群初始化与隔离验证后,进入《SAP HANA HSR 配置》:先建立并验证主备复制关系,再按资源代理版本完成《集群接管与资源配置》,由集群接管 HANA 实例。