ASCS/ERS 集群资源配置

更新时间:
复制 MD 格式

本文档承接《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 关键参数说明

参数

说明

MINIMAL_PROBE=true

Simple Mount 架构必需。集群 probe(节点加入时的首次 monitor)时仅用 pgrep 检查 sapstartsrv 进程,不自行启动 sapstartsrv、不调用 sapcontrol,将 sapstartsrv 生命周期完全交给 SAPStartSrv 资源,避免启动竞态。

AUTOMATIC_RECOVER=false

禁用 RA 的自动恢复,由集群控制实例重启。

IS_ERS=true

仅 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 个 rsc_fs_*

Classic Mount 下实例目录随实例漂移,必须由集群挂载/卸载

SAPStartSrv 资源

有 rsc_SAPStartSrv_*

无

Classic Mount 下 SAPInstance RA 自己管理 sapstartsrv 生命周期

MINIMAL_PROBE

必需

不需要

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 实例目录由集群管理。


完成集群资源配置后,可参考系列总览页《选型与决策指引》中的关键设计建议,对部署结果进行核对。