ASCS/ERS 集群资源配置
本文档承接《ASCS/ERS 实例安装与集群接管准备》完成后的集群环境,按 ENSA2 Simple Mount(推荐)或 ENSA1 Classic Mount(备选)架构,将 ASCS 与 ERS 实例配置为 Pacemaker 集群资源。
两条互斥的配置路径:新系统使用 ENSA2 Simple Mount(第 1 章,推荐);SAP NetWeaver 7.40/7.50 等老系统使用 ENSA1 Classic Mount(第 2 章,备选)。STONITH 方案 A(fence_aliyun)/ B(SBD)的差异体现在各章脚本的全局属性与 STONITH 资源部分,与 ENSA 版本无关。
1. ENSA2 Simple Mount 集群资源配置(推荐)
1.1 前置条件检查
在Simple Mount资源配置下,sapstartsrv服务也将作为集群资源被集群独立管理,控制ASCS和ERS对应的sapstartsrv服务在哪个节点上运行。
因此需要检查当前操作系统中已经包含资源代理:sapstartsrv-resource-agents。
ENSA2 Simple Mount集群配置方案需要操作系统版本不低于SUSE Linux Enterprise Server for SAP 15 SP1。
# 检查系统中是否已经安装sapstartsrv-resource-agents资源代理
ls /usr/lib/ocf/resource.d/suse/SAPStartSrv
# 如系统中无法找到上述文件,执行下面的命令进行安装
zypper install sapstartsrv-resource-agents
这个包来自 SLE-Module-SAP-Applications 模块。如果 zypper 找不到这个包,检查以下模块是否启用:
SUSEConnect --list-extensions | grep SAP
如果模块未激活,执行以下操作来激活模块:
SUSEConnect -p sle-module-sap-applications/<版本号>/x86_64
1.2 应用集群配置脚本(维护模式 + load update)
以下各小节给出两种方案对应的完整集群脚本。推荐将所选方案的脚本保存为本地文件(如 /root/cluster_config.txt,将其中 <...> 占位符替换为实际值),然后按以下方式应用:
# 1) 集群进入维护模式:加载期间集群不会对资源执行任何启停动作
crm configure property maintenance-mode=true
# 2) 增量加载集群配置脚本(update 模式:只新增/修改脚本中出现的对象,脚本之外的对象不受影响)
crm configure load update /root/cluster_config.txt
# 3) 校验配置无误后退出维护模式
crm configure verify
crm configure property maintenance-mode=false
# 4) 观察资源按新配置启动
crm status
先进入维护模式再加载:
load update逐条应用配置时,新资源定义与参数变更可能触发集群立即执行启停动作。维护模式会抑制所有资源动作(含 monitor),加载完成后统一退出,避免加载过程中的中间状态引起资源来回漂移。update 与 replace 的区别:
load update为增量合并;load replace会用文件内容整体替换 CIB 配置。日常更新请使用update。幂等性:脚本中的 STONITH 资源已在《集群初始化》配置,
load update会按脚本内容更新同名资源,重复加载无副作用。若脚本加载失败,请检查占位符是否全部替换、查看
crm configure verify的报错信息,修正后(仍在维护模式下)重新加载。
1.3 完整集群脚本示例(方案 A:fence_aliyun)
以下是基于 ENSA2 Simple Mount 架构在阿里云上的完整 Pacemaker 资源配置示例(SID=EN2,ASCS实例号=00,ERS实例号=10),STONITH 部分对应方案 A(fence_aliyun)。方案 B 的脚本见 1.4 节。
# === 集群全局属性 ===
property cib-bootstrap-options: \
stonith-enabled="true" \
stonith-action="reboot" \
stonith-timeout="150"
rsc_defaults rsc-options: \
resource-stickiness="1" \
migration-threshold="3"
op_defaults op-options: \
timeout="600" \
record-pending=true
# === 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_sapapp1 res_ALIYUN_STONITH_1 -inf: sapapp1
location loc_stonith2_not_on_sapapp2 res_ALIYUN_STONITH_2 -inf: sapapp2
# === ASCS资源 ===
# ASCS虚拟IP(使用阿里云vpc-move-ip)
# routing_table参数的值为ECS所在VPC对应的默认路由表ID
primitive rsc_ip_EN2_ASCS00 ocf:aliyun:vpc-move-ip \
params address=<ascs-vip> \
routing_table=<routing-table-id> \
endpoint=vpc-vpc.<region-id>.aliyuncs.com \
interface=eth0 \
op monitor interval=10s timeout=20s
# ASCS SAPStartSrv资源(Simple Mount架构专用)
primitive rsc_SAPStartSrv_EN2_ASCS00 ocf:suse:SAPStartSrv \
params InstanceName=EN2_ASCS00_sapen2as
# ASCS SAPInstance资源
primitive rsc_sap_EN2_ASCS00 SAPInstance \
op monitor interval=11 timeout=90 on-fail=restart \
params InstanceName=EN2_ASCS00_sapen2as \
START_PROFILE="/sapmnt/EN2/profile/EN2_ASCS00_sapen2as" \
AUTOMATIC_RECOVER=false MINIMAL_PROBE=true \
meta resource-stickiness=5000
# === ERS资源 ===
# ERS虚拟IP
# routing_table参数的值为ECS所在VPC对应的默认路由表ID
primitive rsc_ip_EN2_ERS10 ocf:aliyun:vpc-move-ip \
params address=<ers-vip> \
routing_table=<routing-table-id> \
endpoint=vpc-vpc.<region-id>.aliyuncs.com \
interface=eth0 \
op monitor interval=10s timeout=20s
# ERS SAPStartSrv资源
primitive rsc_SAPStartSrv_EN2_ERS10 ocf:suse:SAPStartSrv \
params InstanceName=EN2_ERS10_sapen2er
# ERS SAPInstance资源
primitive rsc_sap_EN2_ERS10 SAPInstance \
op monitor interval=11 timeout=90 on-fail=restart \
params InstanceName=EN2_ERS10_sapen2er \
START_PROFILE="/sapmnt/EN2/profile/EN2_ERS10_sapen2er" \
AUTOMATIC_RECOVER=false MINIMAL_PROBE=true IS_ERS=true \
meta priority=1000
# === 资源组 ===
group grp_EN2_ASCS00 rsc_ip_EN2_ASCS00 rsc_SAPStartSrv_EN2_ASCS00 rsc_sap_EN2_ASCS00 \
meta resource-stickiness=3000
group grp_EN2_ERS10 rsc_ip_EN2_ERS10 rsc_SAPStartSrv_EN2_ERS10 rsc_sap_EN2_ERS10
# === 约束 ===
# ASCS和ERS不能运行在同一节点
colocation col_sap_EN2_not_both -5000: grp_EN2_ERS10 grp_EN2_ASCS00
# ASCS优先在ERS所在节点启动(故障切换后)
location loc_sap_EN2_failover_to_ers rsc_sap_EN2_ASCS00 \
rule 2000: runs_ers_EN2 eq 1
# ASCS先于ERS启动
order ord_sap_EN2_first_ascs Optional: rsc_sap_EN2_ASCS00:start rsc_sap_EN2_ERS10:stop symmetrical=false
1.4 完整集群脚本示例(方案 B:SBD)
方案 B 的脚本与方案 A 仅有两处差异:集群全局属性中补充 priority-fencing-delay;STONITH 部分替换为 stonith-sbd 资源(无位置约束)。其余部分(VIP、SAPStartSrv、SAPInstance、资源组与约束)完全相同:
# === 集群全局属性(方案 B:SBD) ===
property cib-bootstrap-options: \
stonith-enabled="true" \
stonith-action="reboot" \
stonith-timeout="150" \
priority-fencing-delay="60"
rsc_defaults rsc-options: \
resource-stickiness="1" \
migration-threshold="3"
op_defaults op-options: \
timeout="600" \
record-pending=true
# === STONITH资源(SBD) ===
primitive stonith-sbd stonith:external/sbd \
params pcmk_delay_max="30s"
# === ASCS资源 ===
# ASCS虚拟IP(使用阿里云vpc-move-ip)
# routing_table参数的值为ECS所在VPC对应的默认路由表ID
primitive rsc_ip_EN2_ASCS00 ocf:aliyun:vpc-move-ip \
params address=<ascs-vip> \
routing_table=<routing-table-id> \
endpoint=vpc-vpc.<region-id>.aliyuncs.com \
interface=eth0 \
op monitor interval=10s timeout=20s
# ASCS SAPStartSrv资源(Simple Mount架构专用)
primitive rsc_SAPStartSrv_EN2_ASCS00 ocf:suse:SAPStartSrv \
params InstanceName=EN2_ASCS00_sapen2as
# ASCS SAPInstance资源
primitive rsc_sap_EN2_ASCS00 SAPInstance \
op monitor interval=11 timeout=90 on-fail=restart \
params InstanceName=EN2_ASCS00_sapen2as \
START_PROFILE="/sapmnt/EN2/profile/EN2_ASCS00_sapen2as" \
AUTOMATIC_RECOVER=false MINIMAL_PROBE=true \
meta resource-stickiness=5000
# === ERS资源 ===
# ERS虚拟IP
# routing_table参数的值为ECS所在VPC对应的默认路由表ID
primitive rsc_ip_EN2_ERS10 ocf:aliyun:vpc-move-ip \
params address=<ers-vip> \
routing_table=<routing-table-id> \
endpoint=vpc-vpc.<region-id>.aliyuncs.com \
interface=eth0 \
op monitor interval=10s timeout=20s
# ERS SAPStartSrv资源
primitive rsc_SAPStartSrv_EN2_ERS10 ocf:suse:SAPStartSrv \
params InstanceName=EN2_ERS10_sapen2er
# ERS SAPInstance资源
primitive rsc_sap_EN2_ERS10 SAPInstance \
op monitor interval=11 timeout=90 on-fail=restart \
params InstanceName=EN2_ERS10_sapen2er \
START_PROFILE="/sapmnt/EN2/profile/EN2_ERS10_sapen2er" \
AUTOMATIC_RECOVER=false MINIMAL_PROBE=true IS_ERS=true \
meta priority=1000
# === 资源组 ===
group grp_EN2_ASCS00 rsc_ip_EN2_ASCS00 rsc_SAPStartSrv_EN2_ASCS00 rsc_sap_EN2_ASCS00 \
meta resource-stickiness=3000
group grp_EN2_ERS10 rsc_ip_EN2_ERS10 rsc_SAPStartSrv_EN2_ERS10 rsc_sap_EN2_ERS10
# === 约束 ===
# ASCS和ERS不能运行在同一节点
colocation col_sap_EN2_not_both -5000: grp_EN2_ERS10 grp_EN2_ASCS00
# ASCS优先在ERS所在节点启动(故障切换后)
location loc_sap_EN2_failover_to_ers rsc_sap_EN2_ASCS00 \
rule 2000: runs_ers_EN2 eq 1
# ASCS先于ERS启动
order ord_sap_EN2_first_ascs Optional: rsc_sap_EN2_ASCS00:start rsc_sap_EN2_ERS10:stop symmetrical=false
1.5 SAPInstance 关键参数说明
参数 | 说明 |
| Simple Mount 架构必需。集群 probe(节点加入时的首次 monitor)时仅用 |
| 禁用 RA 的自动恢复,由集群控制实例重启。 |
| 仅 ERS 实例设置,标识该资源为 ERS。 |
2. ENSA1 Classic Mount 集群资源配置(备选)
对于仍在使用SAP NetWeaver 7.40/7.50的场景,使用ENSA1架构。与ENSA2相比,主要区别在于:
使用Filesystem资源代理控制ASCS和ERS的文件系统挂载/卸载
不使用SAPStartSrv资源代理
资源组中包含Filesystem资源
SAPInstance资源中不需要
MINIMAL_PROBE=true参数
STONITH 方案的选择与 ENSA 版本、挂载架构无关。下面按方案 A / 方案 B 分别给出完整脚本,加载方式同样见本文 1.2 节。
2.1 完整集群脚本示例(方案 A:fence_aliyun)
# === 集群全局属性(与第 1 章相同,同一集群) ===
property cib-bootstrap-options: \
stonith-enabled="true" \
stonith-action="reboot" \
stonith-timeout="150"
rsc_defaults rsc-options: \
resource-stickiness="1" \
migration-threshold="3"
op_defaults op-options: \
timeout="600" \
record-pending=true
# === 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
location loc_stonith1_not_on_sapapp1 res_ALIYUN_STONITH_1 -inf: sapapp1
location loc_stonith2_not_on_sapapp2 res_ALIYUN_STONITH_2 -inf: sapapp2
# === ASCS VIP ===
primitive rsc_ip_<SID>_ASCS00 ocf:aliyun:vpc-move-ip \
params address=<ascs-vip> \
routing_table=<routing-table-id> \
endpoint=vpc-vpc.<region-id>.aliyuncs.com \
interface=eth0 \
op monitor interval=10s timeout=20s
# === ASCS Filesystem(Classic Mount:实例目录由集群管理挂载) ===
primitive rsc_fs_<SID>_ASCS00 Filesystem \
params device="<nfs-server>:/<path-to-ascs-dir>" \
directory="/usr/sap/<SID>/ASCS<xx>" \
fstype=nfs4 \
op start timeout=60s interval=0 \
op stop timeout=60s interval=0 \
op monitor interval=20s timeout=40s
# === ASCS SAPInstance(无 SAPStartSrv、无 MINIMAL_PROBE) ===
primitive rsc_sap_<SID>_ASCS00 SAPInstance \
op monitor interval=11 timeout=90 on-fail=restart \
params InstanceName=<SID>_ASCS00_<virtual-host> \
START_PROFILE="/sapmnt/<SID>/profile/<SID>_ASCS00_<virtual-host>" \
AUTOMATIC_RECOVER=false \
meta resource-stickiness=5000 failure-timeout=60 \
migration-threshold=1 priority=10
# === ERS VIP ===
primitive rsc_ip_<SID>_ERS10 ocf:aliyun:vpc-move-ip \
params address=<ers-vip> \
routing_table=<routing-table-id> \
endpoint=vpc-vpc.<region-id>.aliyuncs.com \
interface=eth0 \
op monitor interval=10s timeout=20s
# === ERS Filesystem ===
primitive rsc_fs_<SID>_ERS10 Filesystem \
params device="<nfs-server>:/<path-to-ers-dir>" \
directory="/usr/sap/<SID>/ERS<xx>" \
fstype=nfs4 \
op start timeout=60s interval=0 \
op stop timeout=60s interval=0 \
op monitor interval=20s timeout=40s
# === ERS SAPInstance ===
primitive rsc_sap_<SID>_ERS10 SAPInstance \
op monitor interval=11 timeout=90 on-fail=restart \
params InstanceName=<SID>_ERS10_<virtual-host> \
START_PROFILE="/sapmnt/<SID>/profile/<SID>_ERS10_<virtual-host>" \
AUTOMATIC_RECOVER=false IS_ERS=true \
meta priority=1000
# === 资源组 ===
group grp_<SID>_ASCS00 rsc_ip_<SID>_ASCS00 rsc_fs_<SID>_ASCS00 rsc_sap_<SID>_ASCS00 \
meta resource-stickiness=3000
group grp_<SID>_ERS10 rsc_ip_<SID>_ERS10 rsc_fs_<SID>_ERS10 rsc_sap_<SID>_ERS10
# === 约束 ===
colocation col_sap_<SID>_not_both -5000: grp_<SID>_ERS10 grp_<SID>_ASCS00
location loc_sap_<SID>_failover_to_ers rsc_sap_<SID>_ASCS00 \
rule 2000: runs_ers_<SID> eq 1
order ord_sap_<SID>_first_ascs Optional: rsc_sap_<SID>_ASCS00:start rsc_sap_<SID>_ERS10:stop symmetrical=false
2.2 完整集群脚本示例(方案 B:SBD)
与方案 A 的差异同 1.4 节:集群全局属性补充priority-fencing-delay,STONITH 部分替换为 stonith-sbd 资源:
# === 集群全局属性(方案 B:SBD) ===
property cib-bootstrap-options: \
stonith-enabled="true" \
stonith-action="reboot" \
stonith-timeout="150" \
priority-fencing-delay="60"
rsc_defaults rsc-options: \
resource-stickiness="1" \
migration-threshold="3"
op_defaults op-options: \
timeout="600" \
record-pending=true
# === STONITH资源(SBD) ===
primitive stonith-sbd stonith:external/sbd \
params pcmk_delay_max="30s"
# === ASCS VIP ===
primitive rsc_ip_<SID>_ASCS00 ocf:aliyun:vpc-move-ip \
params address=<ascs-vip> \
routing_table=<routing-table-id> \
endpoint=vpc-vpc.<region-id>.aliyuncs.com \
interface=eth0 \
op monitor interval=10s timeout=20s
# === ASCS Filesystem(Classic Mount:实例目录由集群管理挂载) ===
primitive rsc_fs_<SID>_ASCS00 Filesystem \
params device="<nfs-server>:/<path-to-ascs-dir>" \
directory="/usr/sap/<SID>/ASCS<xx>" \
fstype=nfs4 \
op start timeout=60s interval=0 \
op stop timeout=60s interval=0 \
op monitor interval=20s timeout=40s
# === ASCS SAPInstance(无 SAPStartSrv、无 MINIMAL_PROBE) ===
primitive rsc_sap_<SID>_ASCS00 SAPInstance \
op monitor interval=11 timeout=90 on-fail=restart \
params InstanceName=<SID>_ASCS00_<virtual-host> \
START_PROFILE="/sapmnt/<SID>/profile/<SID>_ASCS00_<virtual-host>" \
AUTOMATIC_RECOVER=false \
meta resource-stickiness=5000 failure-timeout=60 \
migration-threshold=1 priority=10
# === ERS VIP ===
primitive rsc_ip_<SID>_ERS10 ocf:aliyun:vpc-move-ip \
params address=<ers-vip> \
routing_table=<routing-table-id> \
endpoint=vpc-vpc.<region-id>.aliyuncs.com \
interface=eth0 \
op monitor interval=10s timeout=20s
# === ERS Filesystem ===
primitive rsc_fs_<SID>_ERS10 Filesystem \
params device="<nfs-server>:/<path-to-ers-dir>" \
directory="/usr/sap/<SID>/ERS<xx>" \
fstype=nfs4 \
op start timeout=60s interval=0 \
op stop timeout=60s interval=0 \
op monitor interval=20s timeout=40s
# === ERS SAPInstance ===
primitive rsc_sap_<SID>_ERS10 SAPInstance \
op monitor interval=11 timeout=90 on-fail=restart \
params InstanceName=<SID>_ERS10_<virtual-host> \
START_PROFILE="/sapmnt/<SID>/profile/<SID>_ERS10_<virtual-host>" \
AUTOMATIC_RECOVER=false IS_ERS=true \
meta priority=1000
# === 资源组 ===
group grp_<SID>_ASCS00 rsc_ip_<SID>_ASCS00 rsc_fs_<SID>_ASCS00 rsc_sap_<SID>_ASCS00 \
meta resource-stickiness=3000
group grp_<SID>_ERS10 rsc_ip_<SID>_ERS10 rsc_fs_<SID>_ERS10 rsc_sap_<SID>_ERS10
# === 约束 ===
colocation col_sap_<SID>_not_both -5000: grp_<SID>_ERS10 grp_<SID>_ASCS00
location loc_sap_<SID>_failover_to_ers rsc_sap_<SID>_ASCS00 \
rule 2000: runs_ers_<SID> eq 1
order ord_sap_<SID>_first_ascs Optional: rsc_sap_<SID>_ASCS00:start rsc_sap_<SID>_ERS10:stop symmetrical=false
2.3 与 Simple Mount 架构的差异说明
差异点 | 第 1 章 Simple Mount | 第 2 章 Classic Mount | 原因 |
Filesystem 资源 | 无(目录在 OS 层静态挂载) | 每个实例 1 个 | Classic Mount 下实例目录随实例漂移,必须由集群挂载/卸载 |
SAPStartSrv 资源 | 有 | 无 | Classic Mount 下 SAPInstance RA 自己管理 sapstartsrv 生命周期 |
| 必需 | 不需要 | Simple Mount 特有参数,避免 probe 启动竞态 |
约束 | 三者相同 | 三者相同 | colocation/location/order 在 ENSA1/ENSA2 一致 |
Filesystem 资源注意事项
fstype=nfs4:NAS 挂载适用。该RA支持的fstype参数并不包含CPFS,因此在Classic Mount方案中,仅可使用NAS作为SAP Instance的共享文件系统,且采用nfsv4版本进行挂载。此情况下,不建议采用跨可用区的高可用架构部署。SAPInstance 的 timeout 必须高于 Filesystem 的 timeout(官方要求),上面
monitor timeout=60 > 40s满足此约束;文件系统 timeout 建议平衡"快速恢复"与"NFS 偶发抖动的容错"。Classic Mount 下
/sapmnt/<SID>和/usr/sap/<SID>/SYS仍在 OS 层静态挂载(两节点共享),仅 ASCS/ERS 实例目录由集群管理。
完成集群资源配置后,可参考系列总览页《选型与决策指引》中的关键设计建议,对部署结果进行核对。