SAP NetWeaver 与 S/4HANA 应用服务器的高可用

更新时间:
复制 MD 格式

SAP 应用服务器层的高可用核心在于 ASCS(ABAP Central Services)和 ERS(Enqueue Replication Server)的集群化。ASCS 包含 Message Server 和 Enqueue Server,是 SAP 系统中最关键的单点故障组件。


1. 操作系统选型建议

1.1 选型原则

场景

推荐操作系统

说明

SAP HANA 数据库节点

SLES for SAP Applications

SAP HANA 仅支持 SLES for SAP,不支持标准版 SLES。

有高可用需求的核心应用服务器(ASCS/ERS 等)

SLES for SAP Applications

包含 Pacemaker 集群所需的 SAP 专用资源代理和 HA 扩展,且获得 SAP 和 SUSE 的联合支持。

非核心应用服务器(PAS/AAS 等)且无高可用需求

SLES

标准版 SLES 即可满足运行要求,成本较低。

非 HANA 数据库节点(如 MaxDB、ASE 等)

SLES

如无高可用集群需求,标准版 SLES 即可。

说明:SLES for SAP Applications 在标准版 SLES 基础上包含以下关键差异:

  • 预集成 SAP 专用的高可用资源代理包(如 SAPInstance、SAPHanaSR 等)。

  • 享有 SAP 和 SUSE 联合提供的技术支持通道。

  • 与 SAP 软件的兼容性经过 SUSE 和 SAP 联合验证。

1.2 推荐版本

操作系统

推荐版本

最低版本

适用说明

SLES for SAP Applications

15

12

SAP HANA 及核心应用 HA 集群

SLES

15

12

非核心应用及非 HANA 数据库

说明:具体版本请结合 SAP 产品可用性矩阵(PAM)和 SUSE 官方支持声明确认。

1.3 获取方式

阿里云上获取 SLES/SLES for SAP 操作系统有两种方式:

  • 云市场购买订阅:在创建 ECS 实例时,从镜像市场选择 SLES 或 SLES for SAP 镜像。操作系统的订阅费用按需或包年包月计入 ECS 账单,无需单独管理 OS 许可证。适合新上云或希望简化许可证管理的场景。

  • 自带许可证(BYOL):如果已持有 SUSE 有效订阅,可使用自定义镜像方式将现有 OS 许可证用于阿里云 ECS 实例。需自行完成 SUSE 订阅注册和软件源(Repository)配置。适合已有企业级 SUSE 协议或从线下迁移上云的场景。

说明
  • 同一集群的所有节点必须使用相同操作系统版本,不支持混合版本部署。

  • 本文档后续章节中的 Pacemaker 集群配置步骤均基于 SLES for SAP Applications 编写,使用标准版 SLES 的节点不适用这些配置。


2. 可用区与高可用架构设计

阿里云同一地域(Region)内包含多个可用区(Availability Zone,AZ)。可用区之间拥有独立的电力、网络和物理基础设施,但通常通过低延迟网络互联。SAP 应用层 HA 集群的可用区部署方式直接影响共享存储选型、虚拟 IP 漂移方案以及整体性能表现。

重要

总体建议:对于 SAP ASCS/ERS 高可用集群,建议优先部署在同一可用区内。同可用区部署可以最大程度降低共享存储访问延迟,简化网络与存储架构,并获得更好的 failover 确定性。只有在业务对可用区级故障容灾能力有强要求时,才考虑跨可用区部署,且需要接受相应的复杂度和性能权衡。

2.1 同可用区部署(推荐)

在同可用区部署模式下,ASCS 和 ERS 节点位于同一可用区,共享存储(NAS)也部署在同一可用区。

架构特点:

  • 节点间网络延迟最低(通常 < 1ms)

  • 共享存储访问延迟最低,适合对响应时间敏感的 Enqueue 操作

  • 成本较低,无需跨可用区带宽费用

适用场景:

  • 生产环境常规 HA 需求

  • 对 SAP 事务响应时间有较高要求的系统

  • 希望简化运维复杂度的场景

共享存储建议:

  • 推荐使用阿里云 NAS(通用型或极速型) 作为 /sapmnt/<SID>/usr/sap/<SID> 等共享目录的存储后端。

  • 在 Simple Mount 架构下,ASCS 和 ERS 实例目录可共享同一个 NAS 文件系统。

2.2 跨可用区部署

在跨可用区部署模式下,ASCS 和 ERS 节点分别位于不同可用区,以实现可用区级别的故障隔离。

架构特点:

  • 提供可用区级故障容灾能力

  • 节点间网络延迟增加(通常 1-3ms,具体取决于地域)

  • 共享存储访问延迟增加,可能影响 ASCS/ERS 性能

  • 虚拟 IP 漂移必须使用跨可用区方案(如路由表漂移aliyun-vpc-move-ip方案)

  • 架构复杂度和成本均高于同可用区部署

共享存储建议:

  • 在跨可用区部署模式下,推荐使用阿里云 CPFS 同城冗余版本(ZRS)作为共享存储。CPFS ZRS 支持跨可用区访问和数据冗余,是跨可用区场景下实现存储层高可用的正确选择。

    注:当前阿里云 CPFS ZRS 处于邀测状态,如需创建,请参考 CPFS 存储冗余官网文档,提交工单进行申请。

  • CPFS 跨可用区方案的优势

    • 真正的跨可用区冗余:CPFS ZRS 文件系统本身具备跨可用区数据冗余能力,任一可用区故障不影响其他可用区对存储的访问。

    • 延迟可控:同一地域内跨可用区访问 CPFS 的延迟通常在 1~3ms,对 SAP Enqueue 和 Message Server 的性能影响在可接受范围内。若将 SAP 实例节点部署在与 CPFS ZRS 交换机所在的可用区内,可进一步降低访问延迟,实现同可用区内 IO 访问的效果。

    • 统一管理:一个 CPFS 文件系统即可覆盖所有集群节点的共享存储需求,无需为每个可用区创建独立的存储实例。

  • CPFS 的关键注意事项

    • NFSv3 协议:CPFS-NFS 当前仅支持 NFSv3,不支持 NFSv4。SAP ASCS/ERS 场景下 NFSv3 完全满足功能需求。

    • CPFS-NFS 客户端:需要安装阿里云专用的 CPFS-NFS 客户端(aliyun-alinas-utils),并通过 mount -t cpfs-nfs 命令挂载。

    • AppArmor 配置:在 SUSE 操作系统上,CPFS-NFS 客户端的 haproxy 代理进程受 AppArmor 限制,需在挂载参数中指定 hp_config_dir 为 AppArmor 放行的路径(详见 4.3.4 节)。

重要

跨可用区部署的核心收益是可用区级故障隔离。使用 CPFS 后,计算层(ASCS/ERS 节点)和存储层均可实现真正的可用区级冗余。

决策建议:

维度

同可用区 + NAS

跨可用区 + CPFS

可用性目标

单节点/单实例故障

可用区级故障

存储延迟

低(< 1ms)

增加(通常 1~3ms,取决于地域)

协议支持

NFSv4

NFSv3(CPFS-NFS)

产品可用性

通用可用

通用可用

共享存储可用性

受单可用区保护

跨可用区冗余,无单点故障

架构复杂度

中(需安装 CPFS-NFS 客户端、配置 AppArmor)

成本

中(CPFS 费用高于 NAS,可能产生跨可用区流量费用)

推荐程度

推荐

跨可用区场景推荐


3. ECS 选型

3.1 ASCS/ERS 节点

ASCS 和 ERS 节点的资源需求相对较低,主要消耗 CPU 和内存用于锁管理和消息路由。

推荐实例族(按代际优先级排序):

实例族

定位

推荐场景

ecs.g9i

通用算力增强型(第9代)

生产环境

ecs.g7

通用型(第7代)

生产环境

ecs.g6e / ecs.g6

通用型(第6代)

生产/非生产环境

ecs.r9i

内存增强型(第9代)

大型系统 ASCS

ecs.r7

内存型(第7代)

大型系统 ASCS

ASCS/ERS 节点典型选型建议:

系统规模

推荐实例

规格

SAPS

小型(< 500 用户)

ecs.g7.xlarge

4 vCPUs, 16 GiB

6,429

中型(500-2000 用户)

ecs.g7.2xlarge

8 vCPUs, 32 GiB

12,858

大型(> 2000 用户)

ecs.g7.4xlarge

16 vCPUs, 64 GiB

25,715

说明

ASCS/ERS 两个节点应选择相同的实例规格,因为任一节点都可能同时运行 ASCS 和 ERS 实例。

3.2 PAS/AAS 节点

PAS(Primary Application Server)和 AAS(Additional Application Server)承载实际的业务负载,选型需根据 SAP Sizing 结果确定。这些节点不需要集群化,通过多实例横向扩展(Adding AAS)来提升处理能力和可用性。

常用实例族包括:

实例族

规格范围

特点

ecs.g9i

2-192 vCPUs, 8-768 GiB

最新一代,性价比高

ecs.r9i

2-192 vCPUs, 16-1536 GiB

内存密集型负载

ecs.g7

2-64 vCPUs, 8-256 GiB

通用均衡型

ecs.r7

2-128 vCPUs, 16-1024 GiB

内存密集型负载


4. 存储选型

4.1 存储用途总览

存储用途

推荐方案(同可用区)

推荐方案(跨可用区)

文件系统

说明

/sapmnt/<SID>

阿里云 NAS(通用型/极速型)

阿里云 CPFS

NFS v4 / v3

所有节点共享,存放 SAP 全局配置和 profile

/usr/sap/<SID>/SYS

阿里云 NAS(通用型/极速型)

阿里云 CPFS

NFS v4 / v3

SAP 系统目录,所有节点共享

/usr/sap/<SID>/ASCS<xx>

阿里云 NAS(通用型/极速型)

阿里云 CPFS

NFS v4 / v3

ASCS 实例目录,Simple Mount 方案下通过共享存储挂载

/usr/sap/<SID>/ERS<xx>

阿里云 NAS(通用型/极速型)

阿里云 CPFS

NFS v4 / v3

ERS 实例目录,Simple Mount 方案下通过共享存储挂载

/usr/sap(本地)

云盘(ESSD)

云盘(ESSD)

XFS

本地目录,包含 sapservices 和 saphostagent

重要

注意:跨可用区部署时,推荐使用阿里云 CPFS 作为共享存储。CPFS 支持跨可用区访问和跨可用区数据冗余,可真正实现存储层的可用区级故障隔离。CPFS 通过 NFSv3 协议挂载,需安装 CPFS-NFS 客户端。同可用区部署推荐使用 NAS(NFSv4)。

4.2 同可用区场景:NAS

在同可用区部署模式下,推荐使用阿里云 NAS 作为应用层共享存储。

NAS 配置要点:

  • 选择 通用型 NAS极速型 NAS(对延迟更敏感的场景选极速型)

  • NAS 文件系统应与 ECS 节点位于同一可用区

  • 为 ASCS 和 ERS 各创建独立的 NAS 文件系统(传统架构),或共享一个 NAS(Simple Mount 架构)

  • NAS 挂载参数推荐:

vers=4,minorversion=0,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,_netdev,noresvport

4.3 跨可用区场景:CPFS

在跨可用区部署模式下,推荐使用阿里云 CPFS 同城冗余版本(ZRS)作为共享存储。CPFS ZRS 支持跨可用区访问和数据冗余,是跨可用区场景下实现存储层高可用的正确选择。

注:当前阿里云 CPFS ZRS 处于邀测状态,如需创建,请参考 CPFS 存储冗余官网文档,提交工单进行申请。

CPFS 方案核心优势:

  • 跨可用区冗余:CPFS ZRS 文件系统本身具备跨可用区数据冗余能力,多个可用区可同时访问同一文件系统。任一可用区故障不影响其他可用区的存储访问。

  • 统一访问点:不同可用区的 ECS 实例使用相同的 CPFS 挂载地址,无需为每个可用区创建独立的存储实例。

  • 协议支持:CPFS 通过 NFSv3 协议提供文件系统访问,功能上完全满足 SAP ASCS/ERS 的共享存储需求。

CPFS 使用要点:

  • 需要在 ECS 实例上安装阿里云 CPFS-NFS 客户端(aliyun-alinas-utils)。

  • CPFS 使用 cpfs-nfs 文件系统类型挂载,通过 haproxy 进程代理 IO 访问。

  • 在 SUSE 操作系统上,haproxy 受 AppArmor 限制,挂载参数中必须指定 hp_config_dir(详见 4.3.4 节)。

  • ASCS 和 ERS 实例目录可共享同一个 CPFS 文件系统的不同导出目录。

部署建议:

  • 部署前应在目标地域实测 CPFS 跨可用区访问延迟,确保满足 SAP 业务对 Enqueue 和 Message Server 响应时间的要求。

  • 建议在 /etc/fstab 中使用 _netdev 参数防止网络就绪前挂载。

  • hp_config_dir 参数应选择 haproxy 的 AppArmor profile 已放行的路径(推荐 /etc/haproxy/)。

4.3.1 CPFS 部署指引

在 NAS 控制台,创建 CPFS SE。

image.png

创建 CPFSSE,需要指定所在的 VPC,以及三个不同可用区的交换机,确保 CPFS 的同城冗余。

image.png

完成创建后,进入 CPFS 文件系统控制台,点击 Fileset 标签页,创建所需 Fileset。

image.png

按照需要挂载的文件系统,分别创建对应数量的 Fileset。例如/sapmnt等。

image.png

Fileset 完成创建后,从左侧进入协议服务标签,创建协议服务。

image.png

创建时,协议导出选择 Fileset,并在下面选取 VPC 和三个交换机。

image.png

上述协议服务的创建,会默认直接针对所选的 Fileset 创建一个导出目录。如果需要有多个挂载点,则需要针对这个协议服务,添加新的导出目录。在本例中,我们需要两个不同的挂载点:/sapmnt/usr/sap

image.png

image.png

针对第二个要创建的导出目录,选择对应的 Fileset 和 VPC、交换机网络。

image.png

至此,完成在阿里云控制台上的 CPFS 创建,下一步可在 ECS 中配置挂载。

4.3.2 CPFS-NFS 客户端安装

在 SUSE Linux Enterprise Server 15 上安装 CPFS-NFS 客户端:

# 下载 CPFS-NFS 客户端 RPM 包(SUSE 15 专用)
wget https://cpfs-hangzhou-nfs-client.oss-cn-hangzhou.aliyuncs.com/aliyun-alinas-utils-latest.lp15.x86_64.rpm

# 安装客户端
sudo zypper --no-gpg-checks install -y aliyun-alinas-utils-*.rpm

# 验证安装
which mount.cpfs-nfs
# 预期输出:/usr/sbin/mount.cpfs-nfs

安装后会在 ECS 上自动生成以下目录:

目录

用途

/etc/aliyun/cpfs/

CPFS-NFS 客户端配置文件目录

/var/run/cpfs/

CPFS-NFS 运行目录(存放 haproxy 配置文件)

/var/log/aliyun/cpfs/

CPFS-NFS 客户端日志目录

CPFS-NFS 客户端挂载后会启动 haproxy 进程用于 IO 访问,同时启动 watchdog 进程监控客户端健康状态。

4.3.3 fstab 配置

编辑 /etc/fstab,添加 CPFS 挂载条目。必须包含 hp_config_dir_netdev 参数

# /sapmnt - CPFS 跨可用区共享
<cpfs file system id>.region.cpfs.aliyuncs.com:/share/<导出目录>   /sapmnt   cpfs-nfs   vers=3,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,_netdev,noresvport,hp_config_dir=/etc/haproxy/   0   0

# /usr/sap - CPFS 跨可用区共享
<cpfs file system id>.region.cpfs.aliyuncs.com:/share/<导出目录>   /usr/sap   cpfs-nfs   vers=3,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,_netdev,noresvport,hp_config_dir=/etc/haproxy/   0   0

fstab 各参数说明:

参数

说明

文件系统类型

cpfs-nfs

CPFS 专用挂载类型

vers

3

CPFS-NFS 仅支持 NFSv3

rsize / wsize

1048576

读写块大小,建议设置为最大值 1MB

hard

必须使用 hard 挂载,soft 有数据一致性风险

timeo

600(60秒)

重试前等待时间,单位 0.1 秒

retrans

2

重试次数

_netdev

必须,防止网络就绪前挂载,避免开机挂载失败

noresvport

网络重连时使用新 TCP 端口

hp_config_dir

/etc/haproxy/

必须显式指定,haproxy 配置文件存放路径

CPFS 的挂载,可参考官方文档:CPFS-NFS客户端挂载文件系统(推荐)

4.3.4 hp_config_dir 参数与 AppArmor 路径查询

hp_config_dir 参数的作用

hp_config_dir 是 CPFS-NFS 客户端的挂载选项,用于显式指定 haproxy 配置文件所在的目录。CPFS-NFS 客户端通过 haproxy 进程代理文件系统 IO,挂载时需要将 haproxy 的配置文件写入指定目录。

不指定 hp_config_dir 时,mount.cpfs-nfs 会尝试自动解析安全策略白名单,若解析失败则回退到默认路径 /var/run/cpfs/。但在实际环境中,自动解析可能错误回退到 /sys/devices/system/node/(只读 sysfs 目录),导致挂载失败。因此必须显式指定此参数

为什么要关注 AppArmor

在 SUSE Linux Enterprise Server 上,AppArmor 默认启用并对 haproxy 进程实施安全策略限制。haproxy 的 AppArmor profile 位于:

/etc/apparmor.d/usr.sbin.haproxy

此 profile 限制了 haproxy 进程可以读写的文件路径。如果 hp_config_dir 指定的路径不在 profile 的白名单中,haproxy 启动时会报 Permission denied for reading configuration file 错误。

如何查看 haproxy 的 AppArmor 允许路径

# 查看 haproxy 的完整 AppArmor profile
cat /etc/apparmor.d/usr.sbin.haproxy

# 快速提取所有路径白名单规则
grep -E '^\s*/' /etc/apparmor.d/usr.sbin.haproxy

# 查看 AppArmor 状态(确认 haproxy profile 处于 enforce 模式)
aa-status | grep haproxy

# 查看 /var/log/aliyun/cpfs/mount.log 获取挂载失败时的详细错误信息
tail -50 /var/log/aliyun/cpfs/mount.log

haproxy AppArmor profile 中已放行的关键路径(SLES 15 示例)

路径

权限

用途

/etc/haproxy/*

r

配置文件读取 ✅ 推荐用于 hp_config_dir

/var/lib/haproxy/stats

rwl

统计文件

/var/run/haproxy.pid

rw

PID 文件

/sys/devices/system/node/

r

NUMA 节点信息(只读)

/usr/sbin/haproxy

rmix

可执行文件

说明

最佳实践:推荐将 hp_config_dir 设置为 /etc/haproxy/,此路径已在 AppArmor profile 白名单中,无需修改任何 AppArmor 配置,简单可靠。

故障排查速查

报错

原因

解决方案

Permission denied: '/sys/devices/system/node/...'

未指定 hp_config_dir,自动解析错误回退

在 fstab 中加上 hp_config_dir=/etc/haproxy/

Permission denied for reading configuration file

hp_config_dir 路径不在 AppArmor 白名单

改用 /etc/haproxy/ 或修改 AppArmor profile

重启后未自动挂载

缺少 _netdev 或 AppArmor 规则未持久化

确认 fstab 含 _netdev,确认 hp_config_dir 在白名单路径


5. 组网设计

5.1 可用区与 IP 地址规划

IP 地址规划需结合可用区部署方式。以下为示例规划:

同可用区部署示例:

用途

IP 地址(示例)

说明

ASCS 节点物理 IP

10.0.1.10

sapapp1,与 ERS 节点同可用区

ERS 节点物理 IP

10.0.1.11

sapapp2,与 ASCS 节点同可用区

ASCS 虚拟 IP

10.0.100.11

Overlay IP,由集群管理

ERS 虚拟 IP

10.0.100.12

Overlay IP,由集群管理

跨可用区部署示例:

用途

IP 地址(示例)

说明

ASCS 节点物理 IP

10.0.1.10

sapapp1,可用区 A

ERS 节点物理 IP

10.0.2.10

sapapp2,可用区 B

ASCS 虚拟 IP

10.0.100.11

Overlay IP,由集群管理,需跨可用区漂移

ERS 虚拟 IP

10.0.100.12

Overlay IP,由集群管理,需跨可用区漂移

说明

阿里云上的虚拟 IP 使用 Overlay IP 方案(通过路由表实现),由 aliyun-vpc-move-ip 资源代理管理。这些 VIP 必须从集群节点 ECS 所在的 VPC 网段内选择一个未被占用的独立地址,否则会在 aliyun-vpc-move-ip 资源代理调用 openapi 创建 VPC 路由条目时报错。

5.2 阿里云 OpenAPI 端点

集群 STONITH 设备和 VIP 资源代理需要通过阿里云 OpenAPI 进行操作。在 VPC 内部可以通过内网端点访问,无需配置 NAT 网关:

  • ECS 端点:ecs-vpc.<region-id>.aliyuncs.com

  • VPC 端点:vpc-vpc.<region-id>.aliyuncs.com

5.3 /etc/hosts 配置

所有集群节点的 /etc/hosts 必须包含完整的名称解析(示例):

10.0.1.10      sapapp1          # ASCS 节点
10.0.1.11      sapapp2          # ERS 节点(同可用区)
# 或 10.0.2.10  sapapp2          # ERS 节点(跨可用区)
10.0.100.11    vsapascs         # ASCS 虚拟主机名
10.0.100.12    vsapers          # ERS 虚拟主机名

6. 文件系统设计

SAP 应用层有两种文件系统架构可选,当前推荐使用 Simple Mount 架构

6.1 Simple Mount 架构(推荐)

Simple Mount 架构通过 NFS 共享替代集群控制的文件系统资源,大幅简化集群配置和维护。

同可用区部署 - NFS Server (阿里云 NAS):
├── /sapmnt/<SID>             ──  所有节点 NFSv4 挂载
└── /usr/sap/<SID>            ──  所有集群节点 NFSv4 挂载
    ├── ASCS<xx>/             ──  ASCS 实例目录
    ├── ERS<xx>/              ──  ERS 实例目录
    └── SYS/                  ──  系统目录

跨可用区部署 - NFS Server (阿里云 CPFS):
├── /share/sapmnt             ──  所有节点 CPFS-NFS (NFSv3) 挂载
└── /share/usrsap             ──  所有集群节点 CPFS-NFS (NFSv3) 挂载
    ├── ASCS<xx>/             ──  ASCS 实例目录
    ├── ERS<xx>/              ──  ERS 实例目录
    └── SYS/                  ──  系统目录

各节点本地文件系统:
/usr/sap/                     ──  本地 XFS(包含 sapservices, saphostagent)

同可用区部署(NAS),在各节点的 /etc/fstab 中配置 NFS 挂载:

<nas-endpoint>:/sapmnt/<SID>     /sapmnt/<SID>     nfs     vers=4,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,_netdev,noresvport  0 0
<nas-endpoint>:/usr/sap/<SID>    /usr/sap/<SID>    nfs     vers=4,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,_netdev,noresvport  0 0

跨可用区部署(CPFS),在各节点的 /etc/fstab 中配置 CPFS-NFS 挂载:

<cpfs-endpoint>:/share/sapmnt    /sapmnt           cpfs-nfs vers=3,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,_netdev,noresvport,hp_config_dir=/etc/haproxy/  0 0
<cpfs-endpoint>:/share/usrsap    /usr/sap           cpfs-nfs vers=3,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,_netdev,noresvport,hp_config_dir=/etc/haproxy/  0 0
说明

注意:同可用区部署使用 NAS(NFSv4),跨可用区部署使用 CPFS(NFSv3 + cpfs-nfs 挂载类型)。CPFS 的 hp_config_dir 参数为必填项,详见 4.3.4 节。

6.2 Classic Mount 架构

Classic Mount 架构为 ASCS 和 ERS 各使用独立的 NAS 文件系统,通过 Pacemaker 的 Filesystem 资源代理控制挂载/卸载:

NAS 文件系统 1 --> /usr/sap/<SID>/ASCS<xx>  (由集群控制挂载)
NAS 文件系统 2 --> /usr/sap/<SID>/ERS<xx>   (由集群控制挂载)
NFS 共享       --> /sapmnt                   (OS 层面挂载)
NFS 共享       --> /usr/sap/<SID>/SYS        (OS 层面挂载)
说明

Classic Mount 架构下,ASCS 与 ERS 实例的文件系统需要由集群控制挂载,因此不能将这两个挂载点写入 /etc/fstab 中。

重要

由于 Pacemaker 的 Filesystem 资源代理不支持 CPFS 的挂载模式,因此在 Classic Mount 架构下,并不能采用 CPFS 的方案。这种情况下,跨可用区部署只能继续采用阿里云 NAS 的方案。由于 NAS 是单可用区级别的文件存储产品,因此在跨可用区高可用的架构下,NAS 文件系统本身将成为可用区级别的单点故障。此外,至少会有一个节点会跨可用区访问 NAS 存储,会引入额外的 IO 延时。

因此,我们不建议做跨可用区的 Classic Mount 架构高可用。


7. Pacemaker 集群配置

7.1 前提条件

  • 操作系统:SUSE Linux Enterprise Server for SAP Applications 15 SP1 或更高版本

  • 软件包:sap-suse-cluster-connector >= 3.1.0,sapstartsrv-resource-agents >= 0.9.1,resource-agents >= 4.x

  • 禁用 ASCS 和 ERS 的 systemd 自启动服务

  • 安装阿里云专用 STONITH 设备(fence_aliyun)和 VIP 资源代理(aliyun-vpc-move-ip)

7.2 阿里云专用组件安装

安装相关依赖包:

zypper install libcurl-devel fence-agents
pip3 install pycurl pexpect
pip install aliyun-python-sdk-core aliyun-python-sdk-vpc aliyun-python-sdk-ecs

安装 fence_aliyun:

curl https://raw.githubusercontent.com/ClusterLabs/fence-agents/refs/heads/main/agents/aliyun/fence\_aliyun.py \
  -o /usr/sbin/fence_aliyun
chmod 755 /usr/sbin/fence_aliyun
chown root:root /usr/sbin/fence_aliyun
sed -i "s|@PYTHON@|$(which python3 2>/dev/null || which python 2>/dev/null)|" /usr/sbin/fence_aliyun
sed -i "s|@FENCEAGENTSLIBDIR@|/usr/share/fence|" /usr/sbin/fence_aliyun

安装 aliyun-vpc-move-ip:

mkdir -p /usr/lib/ocf/resource.d/aliyun
curl https://raw.githubusercontent.com/ClusterLabs/resource-agents/refs/heads/main/heartbeat/aliyun-vpc-move-ip \
  -o /usr/lib/ocf/resource.d/aliyun/vpc-move-ip
chmod 755 /usr/lib/ocf/resource.d/aliyun/vpc-move-ip
chown root:root /usr/lib/ocf/resource.d/aliyun/vpc-move-ip

配置 RAM 角色认证:

创建 RAM 策略 SAP-HA-ROLE-POLICY,包含以下权限:

{
    "Version": "1",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ecs:StartInstance",
                "ecs:StopInstance",
                "ecs:RebootInstance",
                "ecs:Describe*"
            ],
            "Resource": ["*"]
        },
        {
            "Effect": "Allow",
            "Action": [
                "vpc:CreateRouteEntry",
                "vpc:DeleteRouteEntry",
                "vpc:Describe*"
            ],
            "Resource": ["*"]
        }
    ]
}

创建 RAM 角色 SAP-HA-ROLE 并绑定该策略,然后将此RAM角色绑定到所有集群ECS实例:

RAM授权

在控制台选择对应的 ECS 实例,在"全部操作"中点击"授予 / 收回 RAM 角色"。

RAM授权-2

在弹出的对话框中,RAM 角色选择在前置步骤中创建的"SAP-HA-ROLE",并完成授予。

针对 HANA 集群的 ECS 节点,同样执行上述动作。

阿里云 CLI 授权:

在 ECS 上安装阿里云 CLI:

/bin/bash -c "$(curl -fsSL https://aliyuncli.alicdn.com/install.sh)"

配置阿里云 CLI 授权:

# aliyun configure --profile ecsRamRoleProfile --mode EcsRamRole
Configuring profile 'ecsRamRoleProfile' in 'EcsRamRole' authenticate mode...
Ecs Ram Role []:
Default Region Id []:
Default Output Format [json]: json (Only support json)
Default Language [zh|en] en: 
Saving profile[ecsRamRoleProfile] ...Done.
  • Ecs Ram Role: SAP-HA-ROLE

  • Default Region Id: 输入 ECS 所在的 region id,如 cn-shanghai

7.3 配置节点间 SSH 互信

分别在两个节点上以 root 用户生成密钥并交换公钥:

ssh-keygen -t rsa -b 4096 -N "" -f /root/.ssh/id_rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub root@<对端节点>

验证:

ssh root@<对端节点> "hostname"

7.4 集群初始化

# 在节点1执行
ha-cluster-init -y -i eth0 -u

# 在节点2执行
ha-cluster-join -y -c <节点1的 node 名称或 ip 地址> -i eth0
说明

在阿里云环境中使用 udpu(单播)模式,对应参数 "-u"。

虚拟主机名的初始化

SAP 应用层高可用架构下,要将 ASCS 与 ERS 实例分别安装在对应的虚拟主机名下。但在 Pacemaker 集群控制的 aliyun-vpc-move-ip 资源正常运行之前,ECS 的虚拟 IP 地址是不生效的,对应的虚拟主机名也无法正确解析。因此在 ASCS 与 ERS 实例安装之前,建议先在已经初始化的集群中,配置好 aliyun-vpc-move-ip 资源。

以 ENSA2 Simple Mount 架构在阿里云上的资源配置(SID=EN2,ASCS实例号=00,ERS实例号=10)为例,对应的 aliyun-vpc-move-ip 集群脚本如下:

# 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

# 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

完成上述配置后,确保 aliyun-vpc-move-ip 资源正常运行,虚拟 IP 地址能够被 Ping 通,虚拟主机名能够被正确解析和访问,之后即可进行 ASCS 与 ERS 实例的安装动作。

实例安装时,需要为 SWPM 提供对应的启动参数,确保实例安装在虚拟主机名上。

./sapinst SAPINST_USE_HOSTNAME=<虚拟主机名>

实例成功安装后,继续集群资源的配置。

7.5 SAP 实例安装与集群接管准备

分别在节点一(本例为 sapapp1)通过 SAP SWPM 安装 ASCS 实例,在节点二(本例为 sapapp2)安装 ERS 实例。

安装时,参考 7.4 集群初始化章节,需要将 ASCS 和 ERS 实例安装在虚拟主机名上,因此在执行 SWPM 时需要提供虚拟主机名参数。

关于使用 SWPM 执行 ASCS 与 ERS 实例的安装步骤,请参考 SAP 官方安装 Guide。

安装完成后,需要进行一系列后处理操作,将实例的控制权从默认的 systemd 自启动机制移交给 Pacemaker 集群。

7.5.1 停止 ASCS 和 ERS

安装完成后,SAP 实例处于运行状态。在配置集群接管之前,需要先停止:

# 在 ASCS 节点
su - <sid>adm
sapcontrol -nr 00 -function Stop
sapcontrol -nr 00 -function StopService

# 在 ERS 节点
su - <sid>adm
sapcontrol -nr 10 -function Stop
sapcontrol -nr 10 -function StopService
说明

StopService 会停止 sapstartsrv 框架进程;Stop 会停止 SAP 工作进程。两步都执行能确保完全停止。

7.5.2 交叉注册 ASCS 和 ERS

重要

关键步骤,遗漏会导致集群 failover 失败。sapinst 安装时仅在当前节点注册对应实例(ASCS 只在 ASCS 节点注册,ERS 只在 ERS 节点注册)。集群 failover 后 ASCS/ERS 可能运行在任一节点上,因此必须在两个节点上都注册两个实例

# 在 ASCS 节点注册 ERS:
LD_LIBRARY_PATH=/usr/sap/hostctrl/exe:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH
/usr/sap/hostctrl/exe/sapstartsrv pf=/usr/sap/<SID>/SYS/profile/<SID>_ERS<xx>_<ers-virtual-hostname> -reg

# 在 ERS 节点注册 ASCS:
LD_LIBRARY_PATH=/usr/sap/hostctrl/exe:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH
/usr/sap/hostctrl/exe/sapstartsrv pf=/usr/sap/<SID>/SYS/profile/<SID>_ASCS<xx>_<ascs-virtual-hostname> -reg

注册完成后,两个节点的 systemd 输出应一致:

systemctl list-unit-files | grep SAP
# 预期输出(两个节点相同):
# SAP<SID>_00.service   disabled   disabled
# SAP<SID>_10.service   disabled   disabled

7.5.3 禁用 systemd 服务

重要

集群接管的关键要求。SUSE 官方文档明确指出:"This is mandatory for giving control over the instance to the HA cluster." 参见 ocf_suse_SAPStartSrv(7)SAPStartSrv_basic_Cluster(7)

systemctl disable SAP<SID>_00.service
systemctl stop SAP<SID>_00.service
systemctl disable SAP<SID>_10.service
systemctl stop SAP<SID>_10.service

验证禁用状态:

systemctl list-unit-files | grep SAP
# SAP<SID>_00.service   disabled   disabled
# SAP<SID>_10.service   disabled   disabled

systemctl list-unit-files | grep sap
# saphostagent.service   enabled   enabled
# saptune.service        enabled   enabled
说明
  • systemctl disable 后,OS 启动时不再自动拉起 ASCS/ERS 实例,由 SAPStartSrv 资源代理通过集群控制。

  • saphostagent.servicesaptune.service 应保持 enabled,不受影响。

  • /usr/sap/sapservices 文件依然存在(兼容性),内容为 systemctl --no-ask-password start SAP<SID>_<instance> 格式的一行一条记录。

启用 sapping / sappong 服务(Simple Mount 架构必需)

除禁用实例自启动外,还必须启用 sappingsappong 两个辅助服务。这两个服务的作用是在开机时临时隐藏 /usr/sap/sapservices 文件,防止 sapinit 在开机时批量拉起所有 SAP 实例的 sapstartsrv:

服务

作用

时机

sapping

隐藏 /usr/sap/sapservices 文件

sapinit 启动之前

sappong

恢复 /usr/sap/sapservices 文件

sapinit 启动之后

说明

为什么必需:Simple Mount 架构下,所有集群节点共享同一实例工作目录。开机时 sapinit 会读取 sapservices 文件,为每个实例都启动 sapstartsrv——这会导致实例的 sapstartsrv 在两个节点上同时运行,可能损坏正在运行实例的工作目录内容(跨节点副作用)。隐藏 sapservices 文件后,sapstartsrv 的启动完全交给 SAPStartSrv 资源代理按实例控制。

# SUSE:安装包名 sapstartsrv-resource-agents
zypper install sapstartsrv-resource-agents

# 两个节点上都启用
systemctl enable sapping.service sappong.service

# 验证
systemctl list-unit-files sapping.service sappong.service
# sapping.service   enabled   disabled
# sappong.service   enabled   disabled
重要

注意:这两个服务仅供开机时序使用,运行期间不要手动执行 sapinit 或这两个服务,否则会触发同样的跨节点干扰。

配置 systemd 实例单元 Restart=no(systemd 集成环境必需)

SAP Kernel 788 及以上版本的 sapstartsrv -reg 注册实例时,生成的 systemd unit 文件(/etc/systemd/system/SAP<SID>_<nr>.service)默认带有 Restart=on-failure。这意味着 sapstartsrv 进程崩溃时,systemd 会绕过集群自动重启它——集群将失去对实例状态的真实控制。

说明

适用条件:仅当实例采用 systemd 集成(SAP Kernel 788+)时需要。可通过 systemctl cat SAP<SID>_<nr>.service 查看 unit 中是否有 Restart= 行来确认。如果实例走 SystemV 风格(旧内核),此配置不需要。

通过 systemd drop-in 文件覆盖 Restart 参数,确保只有集群(SAPStartSrv RA)能控制 sapstartsrv 的生命周期:

# 为 ASCS 和 ERS 实例各创建 drop-in 目录和配置文件
# 重复执行,替换 <instance> 为 ASCS 和 ERS 的实例号
mkdir -p /etc/systemd/system/SAP<SID>_<instance>.service.d
cat << EOF > /etc/systemd/system/SAP<SID>_<instance>.service.d/HA.conf
[Service]
Restart=no
EOF

# 重载 systemd 使配置生效
systemctl daemon-reload
说明

为什么用 drop-in 而不是直接改 unit 文件:SAP 内核升级或重新执行 sapstartsrv -reg 会重写 unit 文件,drop-in 目录(.service.d/)下的配置可以持久生效,不会被覆盖。

验证 drop-in 是否生效:

# 查看 drop-in 已被加载
systemd-delta | grep SAP
# [EXTENDED] /etc/systemd/system/SAPS4H_20.service /etc/systemd/system/SAPS4H_20.service.d/HA.conf

# 确认最终 Restart 值为 no
systemctl show SAP<SID>_<instance>.service | grep ^Restart=
# Restart=no
重要

注意:此配置必须在所有集群节点上为每个集群管理的实例(ASCS、ERS)分别执行,且结果应一致。

7.5.4 修改 SAP Profile(Restart_Program → Start_Program)

SAP 实例 profile 中默认使用 Restart_Program 指令,使 sapstartsrv 在进程崩溃时自动重启 enqueue server / enqueue replication server。在 HA 集群中,进程重启必须由集群控制,否则会产生控制权冲突。

修改 ASCS 实例 profile(位于 /sapmnt/<SID>/profile/<SID>_ASCS<xx>_<virtual-host>):

# Enqueue Server(通常为 Program_01)
# 将 Restart_Program_01 改为 Start_Program_01
sed -i 's/Restart_Program_01/Start_Program_01/' /sapmnt/<SID>/profile/<SID>_ASCS<xx>_<virtual-host>

修改 ERS 实例 profile(位于 /sapmnt/<SID>/profile/<SID>_ERS<xx>_<virtual-host>):

# Enqueue Replicator(通常为 Program_00)
# 将 Restart_Program_00 改为 Start_Program_00
sed -i 's/Restart_Program_00/Start_Program_00/' /sapmnt/<SID>/profile/<SID>_ERS<xx>_<virtual-host>

7.5.5 集成 sap-suse-cluster-connector

安装集群连接器,使 SAP 实例能够通过 HA 脚本接口与 Pacemaker 集群交互:

zypper install sap-suse-cluster-connector
usermod -a -G haclient <sid>adm

在 ASCS 和 ERS 的 instance profile 中添加 HA 集成参数:

service/halib = $(DIR_EXECUTABLE)/saphascriptco.so
service/halib_cluster_connector = /usr/bin/sap_suse_cluster_connector

7.5.6 重新启动 ASCS 和 ERS

完成以上所有配置后,手动启动实例验证一切正常:

# 在 ERS 节点
su - <sid>adm
sapcontrol -nr 10 -function StartService <SID>
sapcontrol -nr 10 -function Start

# 在 ASCS 节点
su - <sid>adm
sapcontrol -nr 00 -function StartService <SID>
sapcontrol -nr 00 -function Start

验证实例状态正常后,再次停止实例(参考 7.5.3 节),后续交由集群接管。

7.6 ENSA2 Simple Mount 集群资源配置(推荐)

7.6.1 SLES操作系统

前置条件检查

Simple Mount资源配置下,sapstartsrv服务也将作为集群资源被集群独立管理,控制ASCSERS对应的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

完整集群脚本示例

以下是基于 ENSA2 Simple Mount 架构在阿里云上的完整 Pacemaker 资源配置示例(SID=EN2,ASCS实例号=00,ERS实例号=10):

# === 集群全局属性 ===
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=60 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=60 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

SAPInstance 关键参数说明:

参数

说明

MINIMAL_PROBE=true

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

AUTOMATIC_RECOVER=false

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

IS_ERS=true

仅 ERS 实例设置,标识该资源为 ERS。

7.7 ENSA1 Classic Mount 集群资源配置

对于仍在使用SAP NetWeaver 7.40/7.50的场景,使用ENSA1架构。与ENSA2相比,主要区别在于:

  • 使用Filesystem资源代理控制ASCSERS的文件系统挂载/卸载

  • 不使用SAPStartSrv资源代理

  • 资源组中包含Filesystem资源

  • SAPInstance资源中不需要MINIMAL_PROBE=true参数

# === 集群全局属性(与 7.6 相同,同一集群) ===
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 资源(与 7.6 相同) ===
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=60 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=60 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

Simple Mount架构的差异说明

差异点

7.6 Simple Mount

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

8. 关键设计建议总结

设计维度

建议

操作系统

优先使用 SLES for SAP Applications 15 SP1 或更高版本

可用区部署

优先同可用区部署,降低延迟和复杂度

同可用区共享存储

使用阿里云 NAS(通用型/极速型)

跨可用区共享存储

使用阿里云 CPFS,实现存储层的可用区级冗余

文件系统架构

新部署使用 Simple Mount 架构

VIP 漂移

使用 aliyun-vpc-move-ip 路由表漂移方案

ENSA 版本

新系统使用 ENSA2;旧系统使用 ENSA1