ASCS/ERS 实例安装与集群接管准备

更新时间:
复制 MD 格式

本文档承接《集群初始化》完成后的集群环境,先初始化 ASCS/ERS 虚拟主机名,再完成 SAP 实例安装与集群接管准备。

后续路径:完成本文档后进入《ASCS/ERS 集群资源配置》。新系统使用 ENSA2 Simple Mount(推荐);SAP NetWeaver 7.40/7.50 等老系统使用 ENSA1 Classic Mount(备选)。


1. 虚拟主机名初始化

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
说明

可将脚本保存为文件后按《ASCS/ERS 集群资源配置》第 1.2 节的维护模式 + crm configure load update 方式应用;直接粘贴进 crm configure 交互环境亦可。以上两个 VIP 资源也会出现在《ASCS/ERS 集群资源配置》第 1 / 2 章的完整集群脚本中,重复加载为幂等更新。

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

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

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

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


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

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

安装时,参考本文第 1 章,需要将 ASCS 和 ERS 实例安装在虚拟主机名上,因此在执行 SWPM 时需要提供虚拟主机名参数。

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

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

2.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 工作进程。两步都执行能确保完全停止。

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

2.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:

服务

作用

时机

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)分别执行,且结果应一致。

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

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

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

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


完成本阶段的 SAP 实例安装与集群接管准备后,进入《ASCS/ERS 集群资源配置》:新系统按 ENSA2 Simple Mount(推荐)加载集群脚本,NetWeaver 7.40/7.50 老系统按 ENSA1 Classic Mount(备选)加载。