SAP NetWeaver 与 S/4HANA 应用服务器的高可用
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 存储用途总览
存储用途 | 推荐方案(同可用区) | 推荐方案(跨可用区) | 文件系统 | 说明 |
| 阿里云 NAS(通用型/极速型) | 阿里云 CPFS | NFS v4 / v3 | 所有节点共享,存放 SAP 全局配置和 profile |
| 阿里云 NAS(通用型/极速型) | 阿里云 CPFS | NFS v4 / v3 | SAP 系统目录,所有节点共享 |
| 阿里云 NAS(通用型/极速型) | 阿里云 CPFS | NFS v4 / v3 | ASCS 实例目录,Simple Mount 方案下通过共享存储挂载 |
| 阿里云 NAS(通用型/极速型) | 阿里云 CPFS | NFS v4 / v3 | ERS 实例目录,Simple Mount 方案下通过共享存储挂载 |
| 云盘(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。

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

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

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

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

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

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


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

至此,完成在阿里云控制台上的 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 上自动生成以下目录:
目录 | 用途 |
| CPFS-NFS 客户端配置文件目录 |
| CPFS-NFS 运行目录(存放 haproxy 配置文件) |
| 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 专用挂载类型 |
|
| CPFS-NFS 仅支持 NFSv3 |
|
| 读写块大小,建议设置为最大值 1MB |
| — | 必须使用 hard 挂载,soft 有数据一致性风险 |
|
| 重试前等待时间,单位 0.1 秒 |
|
| 重试次数 |
| — | 必须,防止网络就绪前挂载,避免开机挂载失败 |
| — | 网络重连时使用新 TCP 端口 |
|
| 必须显式指定,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 示例)
路径 | 权限 | 用途 |
|
| 配置文件读取 ✅ 推荐用于 |
|
| 统计文件 |
|
| PID 文件 |
|
| NUMA 节点信息(只读) |
|
| 可执行文件 |
最佳实践:推荐将 hp_config_dir 设置为 /etc/haproxy/,此路径已在 AppArmor profile 白名单中,无需修改任何 AppArmor 配置,简单可靠。
故障排查速查
报错 | 原因 | 解决方案 |
| 未指定 | 在 fstab 中加上 |
|
| 改用 |
重启后未自动挂载 | 缺少 | 确认 fstab 含 |
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.comVPC 端点:
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实例:

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

在弹出的对话框中,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.service和saptune.service应保持enabled,不受影响。/usr/sap/sapservices文件依然存在(兼容性),内容为systemctl --no-ask-password start SAP<SID>_<instance>格式的一行一条记录。
启用 sapping / sappong 服务(Simple Mount 架构必需)
除禁用实例自启动外,还必须启用 sapping 和 sappong 两个辅助服务。这两个服务的作用是在开机时临时隐藏 /usr/sap/sapservices 文件,防止 sapinit 在开机时批量拉起所有 SAP 实例的 sapstartsrv:
服务 | 作用 | 时机 |
| 隐藏 |
|
| 恢复 |
|
为什么必需: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服务也将作为集群资源被集群独立管理,控制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完整集群脚本示例
以下是基于 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=falseSAPInstance 关键参数说明:
参数 | 说明 |
| Simple Mount 架构必需。集群 probe(节点加入时的首次 monitor)时仅用 |
| 禁用 RA 的自动恢复,由集群控制实例重启。 |
| 仅 ERS 实例设置,标识该资源为 ERS。 |
7.7 ENSA1 Classic Mount 集群资源配置
对于仍在使用SAP NetWeaver 7.40/7.50的场景,使用ENSA1架构。与ENSA2相比,主要区别在于:
使用Filesystem资源代理控制ASCS和ERS的文件系统挂载/卸载
不使用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 个 | 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 实例目录由集群管理。
8. 关键设计建议总结
设计维度 | 建议 |
操作系统 | 优先使用 SLES for SAP Applications 15 SP1 或更高版本 |
可用区部署 | 优先同可用区部署,降低延迟和复杂度 |
同可用区共享存储 | 使用阿里云 NAS(通用型/极速型) |
跨可用区共享存储 | 使用阿里云 CPFS,实现存储层的可用区级冗余 |
文件系统架构 | 新部署使用 Simple Mount 架构 |
VIP 漂移 | 使用 |
ENSA 版本 | 新系统使用 ENSA2;旧系统使用 ENSA1 |