前置准备

更新时间:
复制 MD 格式

本文档承接《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

安装 fence_aliyun 隔离代理及其依赖(见本文第 5 章);为所有集群节点绑定具备 ECS 启停权限的 RAM 角色(见本文第 6 章)

方案 B:SBD

一块由两个节点同时挂载的 ESSD 云盘多重挂载共享盘(规格见《Infra 选型》3.4 节,准备步骤见本文第 3 章);初始化前安装 sbd 软件包并加载 softdog watchdog 内核模块(见《集群初始化》第 2 章);仅同可用区部署可用

说明

无论选择哪种 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。

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 中配置挂载。

说明

当前阿里云 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 上自动生成以下目录:

目录

用途

/etc/aliyun/cpfs/

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

/var/run/cpfs/

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

/var/log/aliyun/cpfs/

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-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客户端挂载文件系统(推荐)

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 示例)

路径

权限

用途

/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 在白名单路径


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.com

  • VPC 端点: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实例:

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. 节点间 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 集群资源配置》。