前置准备
本文档承接《Infra 选型》的选型结果清单,完成共享文件系统与 SBD 共享盘的创建挂载、组网配置、STONITH 组件安装、RAM 授权与节点间 SSH 互信。完成本文档后,即可进入《集群初始化》。
按选型结果分轨执行:共享文件系统按可用区部署方式二选一(NAS 或 CPFS);SBD 共享盘仅 STONITH 方案 B(SBD)需要;STONITH 组件安装与 RAM 策略按方案 A/B 区分。
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 自启动服务
安装阿里云专用 VIP 资源代理(aliyun-vpc-move-ip,见本文第 5 章)
STONITH 方案相关前提条件(二者选其一,方案对比见《Infra 选型》第 6 章):
方案 | 前提条件 |
方案 A:fence_aliyun | 安装 |
方案 B:SBD | 一块由两个节点同时挂载的 ESSD 云盘多重挂载共享盘(规格见《Infra 选型》3.4 节,准备步骤见本文第 3 章);初始化前安装 |
无论选择哪种 STONITH 方案,aliyun-vpc-move-ip 资源代理都需要通过阿里云 OpenAPI 操作 VPC 路由表,因此 RAM 角色授权(见本文第 6 章)在两种方案下都是必需的。方案 B 只是不再依赖 OpenAPI 完成节点隔离动作,也不要求 RAM 策略包含 ECS 启停权限。
2. 共享文件系统准备
2.1 同可用区:NAS 创建与挂载
在文件存储 NAS 控制台创建文件系统(创建操作参见文件存储 NAS 产品文档),选型要点见《Infra 选型》3.2 节:
选择 通用型 NAS 或 极速型 NAS(对延迟更敏感的场景选极速型)
NAS 文件系统应与 ECS 节点位于同一可用区
为 ASCS 和 ERS 各创建独立的 NAS 文件系统(Classic Mount 架构),或共享一个 NAS(Simple Mount 架构,推荐)
NAS 挂载参数推荐:
vers=4,minorversion=0,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,_netdev,noresvport
在所有节点的 /etc/fstab 中配置 NFS 挂载(Simple Mount 架构示例):
<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
同可用区部署使用 NAS(NFSv4)。/usr/sap(不含 SID)为各节点本地 ESSD 云盘(XFS),不通过 NFS 共享,无需写入 fstab 的 NAS 条目。
2.2 跨可用区:CPFS 创建与挂载
2.2.1 CPFS 控制台创建
在 NAS 控制台,创建 CPFS SE。

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

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

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

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

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

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


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

至此,完成在阿里云控制台上的 CPFS 创建,下一步可在 ECS 中配置挂载。
当前阿里云 CPFS ZRS 处于邀测状态,如需创建,请参考 CPFS 存储冗余官网文档,提交工单进行申请。
2.2.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 进程监控客户端健康状态。
2.2.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客户端挂载文件系统(推荐)
2.2.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 含 |
3. SBD 共享盘准备(仅同可用区、方案 B)
采用 SBD STONITH 方案时,需要一块被两个集群节点同时挂载的共享块设备。阿里云上通过 ESSD 云盘多重挂载(Multi-Attach) 功能实现。规格建议与关键使用限制见《Infra 选型》3.4 节。若采用 fence_aliyun 方案,则不需要这块盘,本章可跳过。
步骤 1:创建云盘
在块存储控制台手动创建云盘,选择与集群节点相同的地域与可用区。云盘类型选择 ESSD 云盘,性能等级 PL0,容量 1 GiB,计费方式选 按量付费,云盘用途选 数据盘,并勾选 多重挂载 功能。
步骤 2:挂载到两个集群节点
创建完成之后,在块存储控制台找到刚刚创建好的 ESSD 云盘,点击「挂载」,将这块云盘分别挂载到集群的两个 ECS 节点(ASCS 节点与 ERS 节点)上。
挂载完成后,可以在云盘控制台看到已经成功挂载到两台 ECS 的信息。
步骤 3:确认设备识别与稳定路径
在 ECS 操作系统上,通过 lsblk 或 fdisk 命令可以查到已经挂载好的磁盘信息:
# 查看新增的 NVMe 数据盘(本例为 1 GiB 的 nvme1n1)
lsblk -o NAME,SIZE,TYPE,SERIAL,MOUNTPOINT
# 通过 by-id 获取稳定路径(推荐在 SBD 配置中使用此路径)
ls -l /dev/disk/by-id/ | grep -i nvme
# 输出示例:
# nvme-Alibaba_Cloud_Elastic_Block_Storage_<云盘serial> -> ../../nvme1n1
务必确认两节点看到的是同一块盘:在两个节点上对比 lsblk 输出中的 SERIAL 字段,必须完全一致。若不一致,说明挂载的是两块不同的云盘,SBD 将无法工作。建议使用 by-id 稳定路径:/dev/nvme1n1 这类内核命名可能因设备枚举顺序变化而漂移,生产环境应在 /etc/sysconfig/sbd 中使用 /dev/disk/by-id/nvme-Alibaba_Cloud_Elastic_Block_Storage_<云盘serial> 形式的路径。
<云盘serial> 稳定路径需要记录,在《集群初始化》第 2 章使用。
4. 组网配置
4.1 阿里云 OpenAPI 端点
集群 STONITH 设备和 VIP 资源代理需要通过阿里云 OpenAPI 进行操作。在 VPC 内部可以通过内网端点访问,无需配置 NAT 网关:
ECS 端点:
ecs-vpc.<region-id>.aliyuncs.comVPC 端点:
vpc-vpc.<region-id>.aliyuncs.com
4.2 /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 虚拟主机名
IP 规划(含 Overlay IP 的 CIDR 约束)见《Infra 选型》第 4 章。
5. STONITH 组件安装
本章按 STONITH 方案分轨执行:方案 A 需要安装 fence_aliyun 及其依赖;aliyun-vpc-move-ip 为两种方案共用;方案 B 所需的 sbd 软件包安装与 softdog watchdog 模块加载,在《集群初始化》第 2 章执行。
方案 A(fence_aliyun)所需组件
安装相关依赖包(仅方案 A 需要,两个节点都执行):
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(仅方案 A 需要,两个节点都执行):
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(VIP 漂移必需,两个节点都执行):
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
aliyun-vpc-move-ip 依赖 aliyun-python-sdk(core 与 vpc)。方案 A 用户在上一步已一并安装;方案 B 用户只需安装 core 与 vpc 两个 SDK,无需安装 ecs SDK 与 fence-agents 相关依赖。
6. RAM 角色与权限策略
aliyun-vpc-move-ip 需要 RAM 授权才能调用 VPC 路由表 API,因此两种方案都必须绑定 RAM 角色;方案 A 的 fence_aliyun 隔离动作还需要 ECS 启停权限。两种方案所需的权限策略不同,创建与绑定流程相同。
创建 RAM 策略
方案 A(fence_aliyun)创建 RAM 策略 SAP-HA-ROLE-POLICY,包含以下权限(ECS 启停 + VPC 路由):
{
"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": ["*"]
}
]
}
方案 B(SBD)创建 RAM 策略 SAP-HA-ROLE-POLICY,仅需 VPC 路由权限(overlay IP 漂移使用),不需要 ECS 启停权限——节点隔离由 SBD 与 watchdog 完成,不调用 ECS API:
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": [
"vpc:CreateRouteEntry",
"vpc:DeleteRouteEntry",
"vpc:Describe*"
],
"Resource": ["*"]
}
]
}
创建 RAM 角色并绑定
创建 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. 节点间 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"
下一步:《集群初始化》——完成集群初始化与 STONITH 配置、隔离验证后,依次进入《SAP 实例安装与集群接管准备》与《ASCS/ERS 集群资源配置》。