

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# SAP HANA 在使用 Pacemaker 的 Red Hat Enterprise Linux（RHEL）上的高可用性
<a name="sap-hana-on-aws-rhel-pacemaker"></a>

**Topics**
+ [规划](sap-hana-pacemaker-rhel-planning.md)
+ [先决条件](sap-hana-pacemaker-rhel-prerequisites.md)
+ [SAP HANA 和集群设置](sap-hana-pacemaker-rhel-deployment-cluster.md)
+ [操作](sap-hana-pacemaker-rhel-operations.md)
+ [测试](sap-hana-pacemaker-rhel-testing.md)

# 规划
<a name="sap-hana-pacemaker-rhel-planning"></a>

在启动高可用性集群的部署之前，请仔细查看以下先决条件，确保满足对基础设施、操作系统和访问权限的所有要求。熟悉链接的参考资料、支持的配置和本解决方案中使用的核心概念。

**Topics**
+ [设置概述](sap-hana-pacemaker-rhel-setup-overview.md)
+ [供应商支持](sap-hana-pacemaker-rhel-references.md)
+ [概念](sap-hana-pacemaker-rhel-concepts.md)
+ [自动部署](sap-hana-pacemaker-rhel-automation.md)
+ [参数参考](sap-hana-pacemaker-rhel-parameters.md)
+ [架构图](sap-hana-pacemaker-rhel-arch-diagrams.md)

# 设置概述
<a name="sap-hana-pacemaker-rhel-setup-overview"></a>

## 已部署集群基础设施
<a name="_deployed_cluster_infrastructure"></a>

确保您的AWS联网要求和安装了 SAP 工作负载的 Amazon EC2 实例已正确配置为 SAP。

以下特定与 SAP HANA 集群的要求必须满足：
+ 在同一 Amazon VPC 和AWS区域内不同可用区的私有子网中创建的两个集群节点。
+ 与所选子网关联的路由表的访问权限。有关更多信息，请参阅[重叠 IP](sap-hana-pacemaker-rhel-concepts.md#overlay-ip-rhel)。
+ 目标亚马逊 EC2 实例必须通过互联网或亚马逊 VPC EC2 终端节点连接到亚马逊终端节点。

## 支持的操作系统
<a name="_supported_operating_system"></a>

使用 pacemaker 集群保护 SAP HANA 数据库需要红帽提供的软件包，包括适用于 SAP 的集群资源代理AWS，这些软件包在标准存储库中不可用。

要在 Red Hat 上部署 SAP HANA，则需要“RHEL for SAP 解决方案”（BYOS）或“具有高可用性和更新服务的 RHEL for SAP”（PAYG）。

## 进行设置所需的访问权限
<a name="_required_access_for_setup"></a>

设置集群需要以下访问权限：

具有以下权限的 IAM 用户：
+ 修改 Amazon VPC 路由表
+ 修改 Amazon EC2 实例属性
+ 创建 IAM 策略和角色
+ 创建 Amazon EFS 文件系统

其他必需的访问权限：
+ 对两个集群节点的操作系统的根访问权限
+ SAP HANA 管理用户访问权限：<sid>adm
+ SAP HANA SystemDB 管理访问权限，用于更改配置和备份管理。

**Example**  
这些访问要求特定于集群设置流程，可以进行限制，不能用于正在执行的集群操作和维护。

## 已定义可靠性要求
<a name="_reliability_requirements_defined"></a>

您可以利用 Well-Architected Framework 的 SAP Lens，尤其是可靠性支柱，来了解 SAP 工作负载的可靠性要求。

在高可用性架构中，SAP HANA 应用程序是单点故障。您必须根据恢复点目标（RPO）、恢复时间目标（RTO）、成本和操作复杂性等因素来评估此组件中断会造成的影响。有关更多信息，请参阅 [SAP Lens 中的可靠性——Well-Architect AWS ed Framework。](https://docs.aws.amazon.com/wellarchitected/latest/sap-lens/reliability.html)

# 供应商支持
<a name="sap-hana-pacemaker-rhel-references"></a>

## SAP 和 Red Hat 参考资料
<a name="_sap_and_red_hat_references"></a>

除本指南外，还可以参考以下参考资料来获取更多详细信息：
+ Red Hat 文档：[Automating SAP HANA Scale-Up System Replication using the RHEL HA Add-On - Red Hat Enterprise Linux for SAP Solutions 9](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux_for_sap_solutions/9/html/automating_sap_hana_scale-up_system_replication_using_the_rhel_ha_add-on/index) 
+ Red Hat 文档：[Deploying SAP HANA Scale-Up System Replication High Availability - Advanced Next Generation Interface](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux_for_sap_solutions/9/html/deploying_sap_hana_scale-up_system_replication_high_availability/index) 
+ Red Hat 文档：[Automating SAP HANA Scale-Out System Replication using the RHEL HA Add-On - Red Hat Enterprise Linux for SAP Solutions 9](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux_for_sap_solutions/9/html/automating_sap_hana_scale-out_system_replication_using_the_rhel_ha_add-on) 
+ SAP 注意：[1656099-SAP 应用程序开启AWS：支持的产品和 DB/OS 亚马逊](https://me.sap.com/notes/1656099)产品 EC2 
+ SAP Note：[2777782 - SAP HANA DB: Recommended OS Settings for RHEL 8](https://me.sap.com/notes/2777782) 
+ SAP Note：[3108302 - SAP HANA DB: Recommended OS Settings for RHEL 9](https://me.sap.com/notes/3108302) 

**注意**  
访问 SAP Notes 需要 SAP 门户访问权限。

## 部署指南
<a name="deployments-rhel"></a>

AWS与红帽合作，支持 SAP HANA 在上的部署AWS。AWS提供了有关配置 EC2 实例和AWS特定资源以满足 SAP HANA 要求的详细指导。虽然我们努力整合文档以简化用户体验，但 Pacemaker 拥有的底层软件组件和资源仍由软件供应商负责开发和支持。


| SAP HANA 部署类型 | 支持状态 | 注意 | AWS配置模式 | 
| --- | --- | --- | --- | 
|  SAP HANA 纵向扩展标准版  |  AWS记录在案并受支持  |  包含在AWS SAP HANA 指南中  |  SAPHANAScaleUp-Classic，up-angi SAPHANAScale  | 
|  SAP HANA 纵向扩展辅助系统只读已启用  |  供应商提供文档和支持  |  遵循 SAP 文档  |  | 
|  SAP HANA 纵向扩展多层复制  |  供应商提供文档和支持  |  遵循 SAP 文档  |  | 
|  SAP HANA 纵向扩展多目标复制  |  供应商提供文档和支持  |  遵循 SAP 文档  |  | 
|  SAP HANA 横向扩展标准版  |  AWS记录在案并受支持  |  包含在AWS SAP HANA 指南中  |  SAPHANAScaleOut-Classic，up-angi SAPHANAScale  | 
|  SAP HANA 横向扩展辅助系统只读已启用  |  供应商提供文档和支持  |  遵循 SAP 文档  |  | 
|  SAP HANA 横向扩展多层复制  |  供应商提供文档和支持  |  遵循 SAP 文档  |  | 
|  SAP HANA 横向扩展多目标复制  |  供应商提供文档和支持  |  遵循 SAP 文档  |  | 

**注意**  
AWS配置模式表示已针对特定用例进行验证的标准化部署模板。在文档中，我们将重点介绍相比配置模式的指令变化。

**什么是 Angi？**  
SAPHanaSR-angi（SAP HANA SR-高级下一代接口）是用于管理 Pacemaker 集群中的 SAP HANA 系统复制的最新统一高可用性解决方案，在 RHEL 9.6 及更高版本上支持。该解决方案将纵向扩展和横向扩展部署的管理整合到一个软件包中，并引入了技术改进，例如针对文件系统故障、HANA 实例无响应以及横向扩展配置中的节点故障，缩短了接管时间。

本文档介绍了使用 SAPHana SR-angi 的新实现。有关从现有 SAPHana SR 或 SR ScaleOut 安装到 SAPHana S SAPHana R-angi 的迁移，请参阅红帽文档。

# 概念
<a name="sap-hana-pacemaker-rhel-concepts"></a>

## SAP – SAP HANA 和 Hana 系统复制
<a name="_sap_sap_hana_and_hana_system_replication"></a>

SAP HANA 是内存中面向列的关系数据库管理系统，由 SAP 开发。它使用 HANA 系统复制（HSR），将数据和更改从主系统复制到一个或多个辅助系统。在横向扩展部署中，这种复制发生在主系统和辅助系统的对应节点之间，每项服务在辅助系统中都有对应的服务。HSR 确保持续复制更改，从而最大限度地减少恢复点目标（RPO）。虽然您可以使用 HANA 工具手动触发接管，但添加 Pacemaker 集群后，可通过监控、编排以及与用于硬件连接和管理的资源代理集成，来实现失效转移过程的自动化。

## AWS— 可用区
<a name="shared_aws_availability_zones"></a>

可用区是一个或多个独立的数据中心，在一个AWS区域内具有冗余电源、网络和连接。有关更多信息，请参阅区域和可用区。

对于以最小化恢复时间目标 (RTO) 为目标的 SAP 关键任务部署，我们建议将单点故障分散到可用区。AWS与单实例或单可用区部署相比，这可以增强韧性，实现更好的隔离，可以防范包括自然灾害在内的各种故障场景和问题。

各个可用区之间相隔合理的距离（数千米）。一个AWS区域中的所有可用区域通过完全冗余的专用城域光纤与高带宽、低延迟的网络重新互连。这样可以实现同步复制。可用区之间的所有流量都是加密的。

## AWS— 覆盖 IP
<a name="overlay-ip-rhel"></a>

重叠 IP 用于实现与应用程序的连接，无论活动主节点包含在哪个可用区（和子网）中。

在中部署 Amazon EC2 实例时AWS，IP 地址是从所分配子网的 CIDR 范围中分配的。子网不能跨越多个可用区，因此在出现故障后（包括网络连接或硬件问题），子网 IP 地址可能不可用，需要失效转移到不同可用区中的复制目标。

为了解决这个问题，我们建议您配置重叠 IP，并在应用程序的连接参数中使用它。此 IP 地址是来自 VPC CIDR 块之外的非重叠 RFC1918 私有 IP 地址，被配置为一个或多个路由表中的一个条目。该路由将连接定向到活动的节点，并在失效转移期间由集群软件更新。

您可以为叠加 IP 地址选择以下任意一个 RFC1918 私有 IP 地址：
+ 10.0.0.0 - 10.255.255.255（10/8 前缀）
+ 172.16.0.0 - 172.31.255.255（172.16/12 前缀）
+ 192.168.0.0 - 192.168.255.255（192.168/16 前缀）

例如，如果您在 SAP VPC 中使用 10/8 前缀，则可以选择 172 或 192 IP 地址来区分重叠 IP。考虑使用诸如 Amazon VPC IP 地址管理器之类的 IP 地址管理 (IPAM) 工具来规划、跟踪和监控工作负载的 IP 地址。AWS有关更多信息，请参阅[什么是 IPAM？](https://docs.aws.amazon.com/vpc/latest/ipam/what-it-is-ipam.html) 

在子网关联或连接有需要时，您也可以对集群中的重叠 IP 代理进行配置，来更新包含重叠 IP 条目的多个路由表。

### 访问重叠 IP
<a name="_access_to_the_overlay_ip"></a>

叠加 IP 不在 VPC 的范围内，因此无法从与路由表无关的地点（包括本地和其他位置）到达 VPCs。

使用 T AWS ransit Gateway 作为中心枢纽，使用 Di AWS rect Connect 或 C AWS lient VPN，便于从多个位置（包括亚马逊 VPCs、其他AWS地区和本地）连接到叠加 IP 地址。

如果您未将 T AWS ransit Gateway 设置为网络交通枢纽，或者在您的首选AWS区域不可用，则可以使用网络负载均衡器来启用对叠加 IP 的网络访问。

有关更多信息，请参阅 [SAP 关于 AWS 高可用性设置](sap-oip-sap-on-aws-high-availability-setup.md)。

## AWS— 共享 VPC
<a name="shared_aws_shared_vpc"></a>

企业登录区设置或安全要求可能需要使用单独的集群账户，将对重叠 IP 所需的路由表访问权限限制为隔离账户。有关更多信息，请参阅[与其他账户共享 VPC](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-sharing.html)。

在设置共享 VPC 之前，请评估该操作对安全态势的影响。

## Pacemaker – STONITH 隔离代理
<a name="fencing-rhel"></a>

在 SAP HANA 部署中，无论是在纵向扩展配置（双节点）还是横向扩展配置（每个站点两个或更多节点）中，通过确保在任何给定时间只有指定的一个或多个主节点才能处理写入操作来保持数据一致性，这一点至关重要。当节点变成无响应或无法通信时，为了保持数据一致性，可能需要在集群开始其他操作（例如提升新的主节点）之前关闭故障节点的电源，将其隔离。此仲裁是隔离代理的职责。

在双节点纵向扩展场景中，需要考虑隔离竞赛问题。当通信故障导致两个节点均认为另一个节点已经出现故障并同时尝试隔离（断电）对方时，就会发生这种情况。隔离代理通过提供外部见证方来应对这种风险。在横向扩展部署中，虽然由于有多个节点可以参与仲裁决策，因此出现隔离竞赛的可能性较小，但在大型节点集中，妥善的隔离机制对于保持数据一致性仍然至关重要。

红帽支持多种屏蔽代理，包括推荐用于亚马逊 EC2 实例的屏蔽代理 (fence\$1aws)。

# 自动部署
<a name="sap-hana-pacemaker-rhel-automation"></a>

您可以按照此处提供的说明手动设置集群。您还可以自动化此流程的某些部分，以确保部署的一致性和可重复性。

使用AWS Launch Wizard for SAP 自动部署 SAP Hana 平台、SAP NetWeaver、SAP S/4 HANA、SAP BW/4HANA 和解决方案管理器。Launch Wizard 使用AWS CloudFormation 模板和高级脚本来快速配置所需的资源。自动化流程可处理 SAP HANA 安装、HANA 系统复制和 Pacemaker 设置，只需要在部署后进行验证和测试。有关更多信息，请参阅 [AWS Launch Wizard for SAP](https://docs.aws.amazon.com/launchwizard/latest/userguide/launch-wizard-sap.html)。

**重要**  
无论采用何种设置方法，为了实现可靠的集群操作，都要对系统进行全面的测试。测试有助于发现系统异常，验证不断变化的需求，并建立对操作的了解。有关更多详细信息，请参阅[测试](sap-hana-pacemaker-rhel-testing.md)。

# 参数参考
<a name="sap-hana-pacemaker-rhel-parameters"></a>

集群设置使用您的环境所独有的参数，包括 SID 和系统编号。按照以下示例和指导来预先确定值会很有用。

**Topics**
+ [全局AWS参数](#global_shared_aws_parameters)
+ [Amazon EC2 实例参数](#_amazon_ec2_instance_parameters)
+ [SAP 和 Pacemaker 资源参数](#_sap_and_pacemaker_resource_parameters)
+ [Red Hat 集群参数](#_red_hat_cluster_parameters)

## 全局AWS参数
<a name="global_shared_aws_parameters"></a>


| Name | 参数 | 示例 | 
| --- | --- | --- | 
|  AWS账号  |   `<account_id>`   |   `123456789100`   | 
|  AWS区域  |   `<region>`   |   `us-east-1`   | 
+ AWS账户 — 有关更多详情，请参阅[您的AWS账户 ID 及其别名](https://docs.aws.amazon.com/IAM/latest/UserGuide/console-account-alias.html)。
+ AWS区域-有关更多详细信息，请参阅[描述您的区域](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-availability-zones)。

## Amazon EC2 实例参数
<a name="_amazon_ec2_instance_parameters"></a>


| Name | 参数 | 主系统示例 | 辅助系统示例 | 
| --- | --- | --- | --- | 
|  亚马逊 EC2 实例 ID  |   `<instance_id_x>`   |   `i-xxxxinstidforhost1`   |   `i-xxxxinstidforhost2`   | 
|  主机名  |   `<hostname_x>`   |   `hanahost01`   |   `hanahost02`   | 
|  主机 IP  |   `<host_ip_x>`   |   `10.1.20.1`   |   `10.2.20.1`   | 
|  主机其他 IP  |   `<host_additional_ip_x>`   |   `10.1.20.2`   |   `10.2.20.2`   | 
|  配置的子网  |   `<subnet_id>`   |   `subnet-xxxxxxxxxxsubnet1`   |   `subnet-xxxxxxxxxxsubnet2`   | 
+ 主机名必须符合 [SAP Note 611361 - Hostnames of SAP ABAP Platform servers](https://me.sap.com/notes/611361)（需要 SAP 门户访问权限）中概述的 SAP 要求。
+ 在实例上运行以下命令以检索主机名：

  ```
  $ hostname
  ```
+ Amazon EC2 实例 ID — 在您的实例上运行以下命令（IMDSv2 兼容）以检索实例元数据：

  ```
  $ /usr/bin/curl --noproxy '*' -w "\n" -s -H "X-aws-ec2-metadata-token: $(curl --noproxy '*' -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")" http://169.254.169.254/latest/meta-data/instance-id
  ```

  有关更多详细信息，请参阅[检索实例元数据](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html)和[实例身份文档](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-identity-documents.html)。

 **对于横向扩展部署** 


|  角色 | 主协调程序 | 主 Worker | 主 Worker | 辅助协调程序 | 辅助 Worker | 辅助 Worker | 仲裁生成器 | 
| --- | --- | --- | --- | --- | --- | --- | --- | 
|  主机名  |   `hanahost01`   |   `hanahostworker01a`   |   `hanahostworker01b`   |   `hanahost02`   |   `hanahostworker02a`   |   `hanahostworker02b`   |   `hanamm`   | 
|  子网  |   `subnet-xxxxxxxxxxsubnet1`   |   `subnet-xxxxxxxxxxsubnet1`   |   `subnet-xxxxxxxxxxsubnet1`   |   `subnet-xxxxxxxxxxsubnet2`   |   `subnet-xxxxxxxxxxsubnet2`   |   `subnet-xxxxxxxxxxsubnet2`   |   `subnet-xxxxxxxxxxsubnet3`   | 
+ 具有仲裁生成器的 6 节点集群的示例
+ 仲裁生成器可以使用最少的资源，因为它只提供集群仲裁功能

## SAP 和 Pacemaker 资源参数
<a name="_sap_and_pacemaker_resource_parameters"></a>


| Name | 参数 | 示例 | 
| --- | --- | --- | 
|  SAP HANA SID  |   `<SID>` 或 `<sid>`   |   `HDB`   | 
|  SAP HANA 系统编号  |   `<hana_sys_nr>`   |   `00`   | 
|  SAP HANA 虚拟主机名  |   `<hana_virt_hostname>`   |   `hanahdb`   | 
|  SAP HANA 重叠 IP  |   `<hana_overlayip>`   |   `172.16.52.1`   | 
|  SAP HANA 只读已启用重叠 IP（可选）  |   `<readenabled_overlayip>`   |   `172.16.52.2`   | 
|  VPC 路由表  |   `<routetable_id>`   |   `rtb-xxxxxroutetable1`   | 
+ SAP 详细信息 – 包括 SID 和实例编号在内的 SAP 参数必须遵守 SAP 和软件预调配管理器的指导和限制。有关更多详细信息，请参阅 [SAP Note 1979280 - Reserved SAP System Identifiers (SAPSID) with Software Provisioning Manager](https://me.sap.com/notes/1979280)。
+ 安装后，使用以下命令查找主机上运行的实例的详细信息：

  ```
  $ sudo /usr/sap/hostctrl/exe/saphostctrl -function ListInstances
  ```
+ 重叠 IP：此值由您定义。有关更多信息，请参阅[重叠 IP](sap-hana-pacemaker-rhel-concepts.md#overlay-ip-rhel)。

## Red Hat 集群参数
<a name="_red_hat_cluster_parameters"></a>


| Name | 参数 | 示例 | 
| --- | --- | --- | 
|  集群用户  |   `<cluster_user>`   |   `hacluster`   | 
|  集群密码  |   `<cluster_password>`   |  | 
|  集群名称  |   `<cluster_name>`   |   `myCluster`   | 
|  AWS CLI 集群配置文件  |   `<cli_cluster_profile>`   |   `cluster`   | 
+ 集群用户 – 安装集群软件包将创建用户 hacluster，为该账户设置密码以确保集群可以执行不需要根访问权限的任务。

# 架构图
<a name="sap-hana-pacemaker-rhel-arch-diagrams"></a>

## Pacemaker – 纵向扩展架构
<a name="_pacemaker_scale_up_architecture"></a>

![\[SAP Hana Pacemaker Red Hat Enterprise Linux 纵向扩展\]](http://docs.aws.amazon.com/zh_cn/sap/latest/sap-hana/images/sap-hana-pacemaker-rhel-scaleup.png)


# 先决条件
<a name="sap-hana-pacemaker-rhel-prerequisites"></a>

**Topics**
+ [AWS 基础架构设置](sap-hana-pacemaker-rhel-infra-setup.md)
+ [EC2 实例配置](sap-hana-pacemaker-rhel-ec2-configuration.md)
+ [操作系统要求](sap-hana-pacemaker-rhel-os-settings.md)

# AWS 基础架构设置
<a name="sap-hana-pacemaker-rhel-infra-setup"></a>

本节介绍为集群部署准备 AWS 环境所需的一次性设置任务：

**Topics**
+ [为 Pacemaker 创建 IAM 角色和策略](#iam_roles_rhel)
+ [修改集群通信的安全组](#sg-rhel)
+ [为叠加层添加 VPC 路由表条目 IPs](#rt-rhel)

## 为 Pacemaker 创建 IAM 角色和策略
<a name="iam_roles_rhel"></a>

除了标准 SAP 操作所需的权限外，集群还需要两个 IAM 策略来控制 AWS 资源。必须使用 IAM 角色将这些策略分配给您的 Amazon EC2 实例。这使得 Amazon EC2 实例和集群能够调用 AWS 服务。

**注意**  
创建具有最低权限的策略，仅授予对集群内必需的特定资源的访问权限。对于多个集群，您可能需要创建多个策略。

有关更多信息，请参阅适用于 A [mazon 的 IAM 角色 EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#ec2-instance-profile)。

### STONITH 策略
<a name="stonith_policy"></a>

Red Hat STONITH 资源代理（`fence_aws`）需要权限才能启动和停止集群的两个节点。创建策略，如以下示例所示。将此策略附加到分配给集群中两个 Amazon EC2 实例的 IAM 角色。

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:DescribeInstances",
        "ec2:DescribeTags"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "ec2:StartInstances",
        "ec2:StopInstances"
      ],
      "Resource": [
        "arn:aws:ec2:us-east-1:123456789012:instance/arn:aws:ec2:us-east-1:123456789012:instance/i-1234567890abcdef0",
        "arn:aws:ec2:us-east-1:123456789012:instance/arn:aws:ec2:us-east-1:123456789012:instance/i-1234567890abcdef0"
      ]
    }
  ]
}
```

### AWS 覆盖 IP 政策
<a name="overlay_policy"></a>

Red Hat 重叠 IP 资源代理（`aws-vpc-move-ip`）需要修改路由表中路由条目的权限。创建策略，如以下示例所示。将此策略附加到分配给集群中两个 Amazon EC2 实例的 IAM 角色。

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ec2:ReplaceRoute",
            "Resource": [
                 "arn:aws:ec2:us-east-1:123456789012:route-table/rtb-0123456789abcdef0",
                 "arn:aws:ec2:us-east-1:123456789012:route-table/rtb-0123456789abcdef0"
                        ]
        },
        {
            "Effect": "Allow",
            "Action": "ec2:DescribeRouteTables",
            "Resource": "*"
        }
    ]
}
```

### 共享 VPC（可选）
<a name="_shared_vpc_optional"></a>

**注意**  
只有包含共享 VPC 的设置才需要按照以下说明操作。

Amazon VPC 共享允许您与同一 Organization AWS s 中的其他账户共享子网 AWS 。可以使用共享 Amazon VPC 的子网来部署亚马逊 EC2 实例。

在 pacemaker 群集中， aws-vpc-move-ip资源代理已得到增强，可支持共享 VPC 设置，同时保持与先前现有功能的向后兼容性。

这需要进行下列检查和更改：我们将拥有 Amazon VPC 的账户称为共享 VPC 账户，将要部署集群节点的使用者账户称为集群账户。 AWS 

**IAM 角色和策略**  
在共享 Amazon VPC 上使用叠加 IP 代理需要向两个 AWS 账户（共享 VPC 账户和集群账户）授予一组不同的 IAM 权限。

**共享 VPC 账户**  
在共享 VPC 账户中，创建一个 IAM 角色以向将成为集群一部分的 EC2 实例委派权限。在创建 IAM 角色期间，选择 “另一个 AWS 账户” 作为可信实体的类型，然后输入 EC2 实例所在的 AWS 账户 ID。 deployed/running 

创建 IAM 角色后，在共享 VPC 账户上创建以下 IAM 策略，并将其附加到 IAM 角色。根据需要添加或删除路由表条目。

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": "ec2:ReplaceRoute",
      "Resource": [
        "arn:aws:ec2:us-east-1:123456789012:route-table/rtb-0123456789abcdef0",
        "arn:aws:ec2:us-east-1:123456789012:route-table/rtb-0123456789abcdef0"
      ]
    },
    {
      "Sid": "VisualEditor1",
      "Effect": "Allow",
      "Action": "ec2:DescribeRouteTables",
      "Resource": "*"
    }
  ]
}
```

接下来，编辑，移至 IAM 角色中的 “信任关系” 选项卡，并确保已正确添加您在创建角色时输入的 AWS 账户。

在集群账户中，创建以下 IAM 策略，并将其附加到 IAM 角色。这是要附加到 EC2 实例的 IAM 角色。

 **STS 策略** 

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": "sts:AssumeRole",
      "Resource": "arn:aws:iam::123456789012:role/sharing-vpc-account-cluster-role"
    }
  ]
}
```

 **STONITH 策略** 

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "VisualEditor0",
      "Effect": "Allow",
      "Action": [
        "ec2:StartInstances",
        "ec2:StopInstances"
      ],
      "Resource": [
        "arn:aws:ec2:us-east-1:123456789012:instance/arn:aws:ec2:us-east-1:123456789012:instance/i-1234567890abcdef0",
        "arn:aws:ec2:us-east-1:123456789012:instance/arn:aws:ec2:us-east-1:123456789012:instance/i-1234567890abcdef0"
      ]
    },
    {
      "Sid": "VisualEditor1",
      "Effect": "Allow",
      "Action": "ec2:DescribeInstances",
      "Resource": "*"
    }
  ]
}
```

## 修改集群通信的安全组
<a name="sg-rhel"></a>

安全组控制允许到达和离开与其关联资源的流量。有关更多信息，请参阅[使用安全组控制 AWS 资源流量](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-security-groups.html)。

除了访问 SAP 和管理功能所需的标准端口外，还必须将以下规则应用于分配给集群中所有 Amazon EC2 实例的安全组。


| 来源 | 协议 | 端口范围 | 描述 | 
| --- | --- | --- | --- | 
|  安全组 ID（其自己的资源 ID）  |  UDP  |  5405  |  允许集群资源之间的 UDP 流量以进行 corosync 通信  | 
+ 请注意此处使用 `UDP` 协议。
+ 如果您运行的是本地防火墙（例如 iptables），请确保允许在两个 Amazon EC2 实例之间通过上述端口进行通信。

## 为叠加层添加 VPC 路由表条目 IPs
<a name="rt-rhel"></a>

您需要为重叠 IP 添加初始路由表条目。有关重叠 IP 的更多信息，请参阅[重叠 IP 概念](sap-hana-pacemaker-rhel-concepts.md#overlay-ip-rhel) 

向 VPC 路由表或与集群的 Amazon EC2 实例子网关联的表中添加条目。必须为 SAP HANA 主数据库模式手动添加目标（覆盖 IP CIDR）和目标（Amazon EC2 实例或 ENI）的条目。这样可以确保集群资源有路由可供修改。它还支持在配置集群之前，使用与重叠 IP 关联的虚拟名称安装 SAP。

使用 Amazon VPC 控制台或 AWS CLI 命令向叠加 IP 的表或表中添加路由。

------
#### [  AWS Console ]

1. 打开 Amazon VPC 控制台，网址为 https://console.aws.amazon.com/vpc/。

1. 在导航窗格中，选择**路由表**，然后选择与您的集群节点子网关联的路由表。

1. 依次选择**操作**和**编辑路由**。

1. 选择**添加路由**并配置 HANA 路由：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sap/latest/sap-hana/sap-hana-pacemaker-rhel-infra-setup.html)

1. （可选）添加一条路由，启用对辅助系统的只读访问：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sap/latest/sap-hana/sap-hana-pacemaker-rhel-infra-setup.html)

1. 选择**保存更改**。

   除了标准路径外，您的路由表现在还包括必 IPs需的 Overlay 条目。

------
#### [  AWS CLI ]

上述步骤也可以通过编程方式执行。我们建议使用管理权限而不是基于实例的权限来执行这些步骤以保持最低权限。 CreateRoute 正在进行的操作不需要 API。

例如：

```
$ aws ec2 create-route --route-table-id <routetable_id> --destination-cidr-block <hana_overlayip>/32 --instance-id <instance_id_1>
```

需要启用只读访问时

```
$ aws ec2 create-route --route-table-id <routetable_id> --destination-cidr-block <readenabled_overlayip>/32 --instance-id <instance_id_2>
```

------

# EC2 实例配置
<a name="sap-hana-pacemaker-rhel-ec2-configuration"></a>

Amazon EC2 实例设置可使用基础设施即代码或使用 AWS 命令行界面或 AWS 控制台手动应用。我们建议采用基础设施即代码方法来实现自动化，从而减少手动步骤并确保一致性。

**Topics**
+ [分配或查看 Pacemaker IAM 角色](#_assign_or_review_pacemaker_iam_role)
+ [分配或查看安全组](#_assign_or_review_security_groups)
+ [分配辅助 IP 地址](#_assign_secondary_ip_addresses)
+ [禁用 Source/Destination 检查](#source_dest)
+ [查看停止保护](#stop_protection)
+ [查看自动恢复](#auto_recovery)

**重要**  
以下配置必须在所有集群节点上执行。确保节点间的一致性以防止出现集群问题。

## 分配或查看 Pacemaker IAM 角色
<a name="_assign_or_review_pacemaker_iam_role"></a>

必须将这两个集群资源 IAM 策略分配给与您的 Amazon EC2 实例关联的 IAM 角色。如果 IAM 角色未与您的实例关联，请创建新 IAM 角色用于集群操作。

1. 打开 Amazon EC2 控制台，网址为 https://console.aws.amazon.com/ec2/。

1. 选择集群节点之一。

1. 在导航窗格中，依次选择**操作**、**安全**、**修改 IAM 角色**。

1. 选择包含在[为 Pacemaker 创建 IAM 角色和策略](sap-hana-pacemaker-rhel-infra-setup.md#iam_roles_rhel)中创建的策略的 IAM 角色。

1. 选择**更新 IAM 角色**。

1. 对集群中的所有节点重复这些步骤。

## 分配或查看安全组
<a name="_assign_or_review_security_groups"></a>

必须将在 “ AWS [修改集群通信的安全组](sap-hana-pacemaker-rhel-infra-setup.md#sg-rhel)” 部分创建的安全组规则分配给您的 Amazon EC2 实例。如果安全组未与您的实例关联，或者分配的安全组中不存在所需的规则，请添加安全组或更新规则。

1. 打开 Amazon EC2 控制台，网址为 https://console.aws.amazon.com/ec2/。

1. 选择集群节点之一。

1. 在**安全**选项卡中，查看安全组、端口和流量来源。

1. 如果需要，依次选择**操作**、**安全**和**更改安全组**。

1. 在**关联的安全组**下，搜索并选择所需的组。

1. 选择**保存**。

1. 对集群中的所有节点重复这些步骤。

您可以使用 AWS CLI 验证实例上的安全组规则：

```
$ aws ec2 describe-instance-attribute --instance-id <instance_id> --attribute groupSet
```

## 分配辅助 IP 地址
<a name="_assign_secondary_ip_addresses"></a>

辅助 IP 地址用于在 corosync 中为集群创建冗余通信通道（辅助环路）。集群节点可以使用辅助环路进行通信，以防底层网络中断。

 IPs 它们仅用于集群配置。辅助弹性网络接口 (ENI) IPs 提供与辅助弹性网络接口 (ENI) 相同的容错能力。有关更多信息，请参阅[您的 EC2 实例的辅助 IP 地址](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-secondary-ip-addresses.html)。

您可以使用 AWS CLI 验证实例上的辅助 IP 配置：

```
$ aws ec2 describe-instances --instance-id <instance_id> \
    --query 'Reservations[*].Instances[*].NetworkInterfaces[*].PrivateIpAddresses[*].PrivateIpAddress' \
    --output text
```

验证：
+ 每个实例返回来自同一子网的两个 IP 地址
+ 主网络接口 (eth0) 均 IPs 已分配
+ 次要版本稍后 IPs 将用于 corosync.conf 中的 ring0\$1addr 和 ring1\$1addr

## 禁用 Source/Destination 检查
<a name="source_dest"></a>

默认情况下，Amazon EC2 实例 source/destination 会执行检查，要求实例是其发送或接收的任何流量的来源或目的地。在 pacemaker 集群中，必须禁用从叠加 IP 接收流量的两个实例的 source/destination 检查。

以下 AWS 控制台或 AWS CLI 命令可用于修改该属性。

------
#### [  AWS Console ]

1. 打开 Amazon EC2 控制台，网址为 https://console.aws.amazon.com/ec2/。

1. 选择集群节点之一。

1. 在导航窗格中，选择**操作** → **网络** → **更改 source/destination 检查**。

1. 对于 Source/Destination 检查，当源或目标不是实例本身时，选择**停止**以允许流量。

1. 对集群中的所有节点重复这些步骤。

------
#### [  AWS CLI ]

要使用 AWS CLI 进行修改（需要适当的配置权限），请执行以下操作：

```
$ aws ec2 modify-instance-attribute --instance-id <instance_id> --no-source-dest-check
```

对集群中的所有节点重复执行。

------

要确认特定实例某个属性的值，请使用以下命令。该值`false`表示已禁用 source/destination 检查

```
$ aws ec2 describe-instance-attribute --instance-id <instance_id> --attribute sourceDestCheck
```

输出

```
{
    "InstanceId": "i-xxxxinstidforhost1",
    "SourceDestCheck": {
        "Value": false
    }
}
```

## 查看停止保护
<a name="stop_protection"></a>

为确保可以执行 STONITH 操作，您必须确保对属于起搏器集群的 Amazon EC2 实例禁用停止保护。如果修改了默认设置，请对两个实例使用以下命令通过 AWS CLI 禁用停止保护。

以下 AWS 控制台或 CLI 命令可用于修改该属性。

------
#### [  AWS Console ]

1. 打开 Amazon EC2 控制台，网址为 https://console.aws.amazon.com/ec2/。

1. 选择集群节点之一。

1. 依次选择**操作**、**实例设置**、**更改停止保护**。

1. 确保未启用**停止保护**。

1. 对集群中的所有节点重复这些步骤。

------
#### [  AWS CLI ]

要使用 AWS CLI 进行修改（需要适当的配置权限），请执行以下操作：

```
$ aws ec2 modify-instance-attribute --instance-id <instance_id> --no-disable-api-stop
```

对集群中的所有节点重复此命令。

------

要确认特定实例某个属性的值，请使用以下命令。该值`false`表示可以使用 AWS CLI 停止实例。

```
$ aws ec2 describe-instance-attribute --instance-id <instance_id> --attribute disableApiStop
```

输出

```
{
    "InstanceId": "i-xxxxinstidforhost1",
    "DisableApiStop": {
        "Value": false
    }
}
```

## 查看自动恢复
<a name="auto_recovery"></a>

故障发生后，必须以协调的方式恢复集群控制的操作。这有助于确保已经确定并解决了导致故障的原因，并且集群的状态符合预期。例如，验证是否没有待处理的隔离操作。

以下 AWS 控制台或 CLI 命令可用于修改该属性。

------
#### [  AWS Console ]

1. 打开 Amazon EC2 控制台，网址为 https://console.aws.amazon.com/ec2/。

1. 选择集群节点之一。

1. 依次选择**操作**、**实例设置**、**更改自动恢复行为**。

1. 选择**关闭**可禁用系统状态检查失败时的自动恢复。

1. 对集群中的所有节点重复这些步骤。

------
#### [  AWS CLI ]

要修改自动恢复设置（需要相应的配置权限），请执行以下操作：

```
$ aws ec2 modify-instance-maintenance-options --instance-id <instance_id> --auto-recovery disabled
```

对集群中的所有节点重复此命令。

------

要确认特定实例某个属性的值，请使用以下命令。值 `disabled` 表示不会尝试自动恢复。

```
$ aws ec2 describe-instances --instance-ids <instance_id> --query 'Reservations[*].Instances[*].MaintenanceOptions.AutoRecovery'
```

输出：

```
[
    [
        "disabled"
    ]
]
```

# 操作系统要求
<a name="sap-hana-pacemaker-rhel-os-settings"></a>

此部分概述了 Red Hat Enterprise Linux for SAP（RHEL for SAP）集群节点所需的操作系统配置。请注意，这不是在上面运行 SAP HANA 的配置要求的完整列表 AWS，而是专门介绍集群管理先决条件。

请考虑使用配置管理工具或自动部署脚本，确保在集群基础设施中准确且可重复地完成设置。

**Topics**
+ [根访问](#_root_access)
+ [安装缺失的操作系统软件包](#packages)
+ [更新和检查操作系统版本](#_update_and_check_operating_system_versions)
+ [系统日志记录](#_system_logging)
+ [禁用 NetworkManager 云服务](#_disable_networkmanager_cloud_services)
+ [时间同步服务](#_time_synchronization_services)
+ [AWS CLI 配置文件](#shared_aws_cli_profile)
+ [Pacemaker 代理设置（可选）](#_pacemaker_proxy_settings_optional)
+ [为初始数据库访问添加重叠 IP](#_add_overlay_ip_for_initial_database_access)
+ [主机名解析](#_hostname_resolution)

**重要**  
以下配置必须在所有集群节点上执行。确保节点间的一致性以防止出现集群问题。

## 根访问
<a name="_root_access"></a>

验证两个集群节点上的根访问权限。本文档中的大多数设置命令都需要以根用户身份执行。除非明确说明了有其他选择，否则假定命令应以根用户身份运行。

## 安装缺失的操作系统软件包
<a name="packages"></a>

这适用于所有集群节点。您必须安装任意缺失的操作系统软件包。

Pacemaker 设置需要以下软件包及其依赖项。根据您的基准映像（例如，RHEL for SAP），这些软件包可能已经安装。


| 程序包 | 说明 | 类别 | 必需 | 配置模式 | 
| --- | --- | --- | --- | --- | 
|  chrony  |  时间同步  |  系统支持  |  强制性  |  全部  | 
|  pacemaker  |  集群资源管理器  |  核心集群  |  强制性  |  全部  | 
|  corosync  |  集群通信引擎  |  核心集群  |  强制性  |  全部  | 
|  pcs  |  集群管理 CLI  |  核心集群  |  强制性  |  全部  | 
|  resource-agents  |  基础资源代理  |  核心集群  |  强制性  |  全部  | 
|  resource-agents-cloud  |  云资源代理包括 aws-vpc-move-ip  |  核心集群  |  强制性  |  全部  | 
|  fence-agents-aws  |  隔离功能  |  核心集群  |  强制性  |  全部  | 
|  sap-hana-ha  |  新一代 HANA 系统复制代理  |  SAP HANA HA  |  强制性\$1  |  SAPHANAScaleup-sapangi，out-sapangi SAPHANAScale  | 
|  resource-agents-sap-hana  |  SAP HANA 资源代理  |  SAP HANA HA  |  强制性\$1  |  SAPHANAScale向上经典  | 
|  resource-agents-sap-hana-向外扩展  |  SAP HANA 资源代理  |  SAP HANA HA  |  强制性\$1  |  SAPHANAScale超越经典  | 
|  sos  |  信息收集  |  支持工具  |  强制性  |  全部  | 
|  sysstat  |  性能监控工具  |  支持工具  |  强制性  |  全部  | 
|  pcp-system-tools  |  性能 Co-Pilot 工具  |  监控  |  推荐  |  全部  | 

**注意**  
有关配置模式的更多信息，请参阅[部署类型的供应商支持](sap-hana-pacemaker-rhel-references.md#deployments-rhel)。`Mandatory*` 表示根据配置模式，此软件包必需。

```
#!/bin/bash

# Mandatory core packages for SAP HANA HA on AWS
mandatory_packages="pacemaker corosync pcs chrony resource-agents resource-agents-sap-hana resource-agents-cloud fence-agents-aws"

# HANA SR packages - Previous Generation (still in common use)
hanaSR_scaleup="resource-agents-sap-hana"  # For scale-up deployments
hanaSR_scaleout="resource-agents-sap-hana-scaleout"  # For scale-out deployment

# HANA SR packages - New Generation
hanaSR_angi="sap-hana-ha"  # New generation package for both scale-up and scale-out

# Recommended monitoring and support packages
support_packages="pcp-system-tools sos sysstat"

# Note: Choose hanaSR_scaleup/hanaSR_scaleout or hanaSR_angi
# Uncomment the appropriate line based on your deployment:
packages="${mandatory_packages} ${hanaSR_scaleup} ${support_packages}"
#packages="${mandatory_packages} ${hanaSR_scaleout} ${support_packages}"
#packages="${mandatory_packages} ${hanaSR_angi} ${support_packages}"

missingpackages=""

for package in ${packages}; do
    echo "Checking if ${package} is installed..."
    if ! rpm -q ${package} &>/dev/null; then
        echo " ${package} is missing and needs to be installed"
        missingpackages="${missingpackages} ${package}"
    fi
done

if [ -z "$missingpackages" ]; then
    echo "All packages are installed."
else
    echo "Missing mandatory packages: $(echo ${missingpackages} | tr ' ' '\n' | grep -E "^($(echo ${mandatory_packages} | tr ' ' '|'))$")"
    echo "Missing support packages: $(echo ${missingpackages} | tr ' ' '\n' | grep -E "^($(echo ${support_packages} | tr ' ' '|'))$")"
    echo -n "Do you want to install the missing packages (y/n)? "
    read response
    if [ "$response" = "y" ]; then
        dnf install -y $missingpackages
    fi
fi
```

如果您在安装高可用性软件包时遇到问题，请验证存储库访问权限：

```
$ sudo dnf repolist
```

对于 BYOL（自带许可证）系统，还需要使用 subscription-manager 验证订阅状态。

要安装或更新一个或多个软件并直接确认，请使用以下命令：

```
$ sudo dnf install <package_name(s)>
```

## 更新和检查操作系统版本
<a name="_update_and_check_operating_system_versions"></a>

您必须对各个节点更新和确认版本。将所有最新补丁应用到您的操作系统版本。这样可以确保错误得到解决并且新功能可用。

您可以使用 `dnf update` 命令单独更新补丁或更新所有系统补丁。建议在设置集群之前进行清理重启。

```
$ sudo dnf update
$ sudo reboot
```

比较两个集群节点上的操作系统软件包版本，并确保两个节点上的版本匹配。

## 系统日志记录
<a name="_system_logging"></a>

建议同时使用 systemd-journald 和 rsyslog 实现全面的日志记录。Systemd-journald（默认启用）提供结构化且编制了索引的日志记录，可以直接访问事件，而维护 rsyslog 是为了向后兼容，以及用于传统的基于文件的日志记录。这种双重方法可确保既采用了现代化的日志记录功能，又可以兼容现有的日志管理工具和实践。

 **1。启用并启动 rsyslog：**

```
# systemctl enable --now rsyslog
```

**2. （可选）为 systemd-journald 配置持久日志记录：**  
如果您不使用日志代理（例如 Uni AWS CloudWatch fied Agent 或 Vector）将日志传送到集中位置，则可能需要配置永久日志以在系统重启后保留日志。

```
# mkdir -p /etc/systemd/journald.conf.d
```

使用以下命令创建 `/etc/systemd/journald.conf.d/99-logstorage.conf`：

```
[Journal]
Storage=persistent
```

持续日志记录需要谨慎管理存储。在 `journald.conf` 中配置适当的保留和轮换设置，以防止日志占用过多的磁盘空间。查看`man journald.conf`可用选项 SystemMaxUse，例如 RuntimeMaxUse、和 MaxRetentionSec。

要应用更改，请重新启动 journald：

```
# systemctl restart systemd-journald
```

启用持久存储后，只会持久存储新的日志。当前启动会话中的现有日志将保留在易失性存储中，下次重启时就会丢失。

 **3。验证服务是否正在运行：**

```
# systemctl status systemd-journald
# systemctl status rsyslog
```

## 禁用 NetworkManager 云服务
<a name="_disable_networkmanager_cloud_services"></a>

使用红帽企业 Linux 8.6 或更高版本时，必须禁用 NetworkManager 云设置服务才能保持集群稳定性。这些服务可能会自动从网络接口删除重叠 IP 地址，对集群操作造成干扰。

在每个集群节点上运行以下命令：

```
# systemctl disable --now nm-cloud-setup.timer
# systemctl disable --now nm-cloud-setup
```

验证服务是否已禁用并停止：

```
# systemctl status nm-cloud-setup.timer
# systemctl status nm-cloud-setup
```

状态命令应将两个服务显示为“已禁用”和“非活动（僵死）”。

## 时间同步服务
<a name="_time_synchronization_services"></a>

时间同步对集群操作很重要。确保安装了 chrony rpm，并在配置文件中配置相应的时间服务器。

您可以使用 Amazon Time Sync Service，在 VPC 中运行的所有实例上都可以使用此服务。此服务不需要互联网访问。为确保闰秒处理的一致性，请勿将 Amazon Time Sync Service 与任何其他 ntp 时间同步服务器或服务器池混用。

创建或检查 `/etc/chrony.d/ec2.conf` 文件以定义服务器：

```
# Amazon EC2 time source config
server 169.254.169.123 prefer iburst minpoll 4 maxpoll 4
```

使用以下命令启动 chronyd 服务。

```
# systemctl enable --now chronyd.service
# systemctl status chronyd
```

有关更多信息，请参阅[为 Linux 实例设置时间](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/set-time.html)。

## AWS CLI 配置文件
<a name="shared_aws_cli_profile"></a>

 AWS 群集资源代理使用 AWS 命令行界面 (AWS CLI)。您需要为根账户创建 AWS CLI 配置文件。

您可以`/root/.aws`手动编辑配置文件，也可以使用 `aws configure` AWS CLI 命令编辑配置文件。

您应跳过为访问密钥和秘密访问密钥提供信息的步骤。这些权限是通过附加到 Amazon EC2 实例的 IAM 角色提供的。

```
# aws configure
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]: <region>
Default output format [None]:
```

除非进行了配置，否则配置文件名称为 `default`。如果您选择使用其他名称，则可以指定 `--profile`。在此示例中选择的名称是 cluster。它用于起搏器的 AWS 资源代理定义中。该 AWS 区域必须是实例的默认 AWS 区域。

```
# aws configure --profile cluster
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]: <region>
Default output format [None]:
```

在主机上，您可以使用以下命令验证可用的配置文件：

```
# aws configure list-profiles
```

并可通过查询调用方身份来查看代入的角色是否已关联：

```
# aws sts get-caller-identity --profile=<profile_name>
```

## Pacemaker 代理设置（可选）
<a name="_pacemaker_proxy_settings_optional"></a>

如果您的 Amazon EC2 实例已配置为通过代理服务器访问互联网和/或 AWS 云，则需要在 pacemaker 配置中复制设置。有关更多信息，请参阅[使用 HTTP 代理](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-proxy.html)。

将以下行添加到 `/etc/sysconfig/pacemaker`：

```
http_proxy=http://<proxyhost>:<proxyport>
https_proxy=http://<proxyhost>:<proxyport>
no_proxy=127.0.0.1,localhost,169.254.169.254,fd00:ec2::254
```
+ 修改 proxyhost 和 proxyport 以匹配您的设置。
+ 确保排除了用于访问实例元数据的地址。
+ 将 no\$1proxy 配置为包含实例元数据服务的 IP 地址 — 169.254.169.254 () 和 fd00: ec2:: 254 ()。IPV4 IPV6该地址保持不变。

## 为初始数据库访问添加重叠 IP
<a name="_add_overlay_ip_for_initial_database_access"></a>

此步骤可选，只有在设置集群之前要求客户端能够连接到 SAP HANA 数据库时才需要。重叠 IP 稍后将由集群资源自动管理。

要启用初始数据库访问，请手动将重叠 IP 添加到主实例（当前运行 SAP HANA 数据库的位置）：

```
# ip addr add <hana_overlayip>/32 dev eth0
```
+ 此配置是临时配置，在实例重启后会丢失
+ 仅在当前的主实例上进行此配置
+ 配置完成后，集群将接管对此 IP 的管理

## 主机名解析
<a name="_hostname_resolution"></a>

您必须确保所有实例都能解析所有正在使用的主机名。将集群节点的主机名添加到所有集群节点上的 `/etc/hosts` 文件中。这样可以确保即使出现 DNS 问题也能解析集群节点的主机名。有关双节点集群，请参阅以下示例：

```
# cat /etc/hosts
10.2.10.1 hanahost01.example.com hanahost01
10.2.20.1 hanahost02.example.com hanahost02
172.16.52.1 hanahdb.example.com hanahdb
```

在此示例中，未提及 IPs 用于第二个群集环的辅助环路。它们仅在集群配置中使用。您可以分配虚拟主机名用于管理和标识用途。

**重要**  
重叠 IP 不在 VPC 范围中，无法从未与路由表关联的位置（包括本地）访问。

# SAP HANA 和集群设置
<a name="sap-hana-pacemaker-rhel-deployment-cluster"></a>

**Topics**
+ [SAP HANA 设置和 HSR](sap-hana-pacemaker-rhel-hana-setup-hsr.md)
+ [SAP HANA 服务控制](sap-hana-pacemaker-rhel-hana-control.md)
+ [集群节点设置](sap-hana-pacemaker-rhel-cluster-node-setup.md)
+ [群集配置](sap-hana-pacemaker-rhel-cluster-config.md)
+ [客户端连接](sap-hana-pacemaker-rhel-client-connectivity.md)

# SAP HANA 设置和 HSR
<a name="sap-hana-pacemaker-rhel-hana-setup-hsr"></a>

通过配置参数和创建所需备份，使 SAP HANA 做好系统复制（HSR）准备。

**Topics**
+ [查看 AWS 和 SAP 安装指南](#review_guides)
+ [检查 global.ini 参数](#global_ini)
+ [在主系统上创建 SAP HANA 备份](#pre_setup_backup)
+ [在主系统和辅助系统上配置系统复制](#register_hsr)
+ [检查 SAP 主机代理版本](#sap_host_agent)

**重要**  
本指南假设 SAP HANA Platform 已按照和 SAP 的指导作为扩展配置进行安装，其中两个 EC2 实例位于不同的可用区，或者作为横向扩展配置，在两个可用区中安装了多个 EC2 实例。 AWS 

## 查看 AWS 和 SAP 安装指南
<a name="review_guides"></a>
+  AWS 文档-开[启 SAP HANA 环境设置 AWS](https://docs.aws.amazon.com/sap/latest/sap-hana/std-sap-hana-environment-setup.html) 
+ SAP 文档：[SAP HANA Server Installation and Update Guide](https://help.sap.com/docs/SAP_HANA_PLATFORM/2c1988d620e04368aa4103bf26f17727/7eb0167eb35e4e2885415205b8383584.html) 

SAP 制作了文档，讲解如何使用 SAP HANA Cockpit、SAP HANA Studio 或命令行中的 `hdbnsutil` 来配置 SAP HANA 系统复制。请查看该文档中适合您的 SAP HANA 版本的内容，确保该指南没有变化，或者使用命令行以外的方法。
+ SAP 文档：[Configuring SAP HANA System Replication](https://help.sap.com/docs/SAP_HANA_PLATFORM/4e9b18c116aa42fc84c7dbfd02111aba/442bf027937746248f69701aa9b94112.html) 

## 检查 global.ini 参数
<a name="global_ini"></a>

以 <sid>adm 的身份运行以下命令。这些命令将提示输入 SYSTEMDB 数据库的系统密码。

**检查 log\$1mode 是否设置为 normal**  
确保在 global.ini 文件的 persistence 部分中，将配置参数 log\$1mode 设置为 `normal`：

```
hdbsql -jx -i <hana_sys_nr> -u system -d SYSTEMDB "SELECT VALUE FROM M_INIFILE_CONTENTS WHERE FILE_NAME = 'global.ini' AND SECTION = 'persistence' AND KEY = 'log_mode';"
```

例如：

```
hdbadm> hdbsql -jx -i 00 -u system -d SYSTEMDB "SELECT VALUE FROM M_INIFILE_CONTENTS WHERE FILE_NAME = 'global.ini' AND SECTION = 'persistence' AND KEY = 'log_mode';"
VALUE
"normal"
```

**查看 global.ini 文件复制**  
SAP HANA 系统复制功能需要在主系统和辅助系统之间采用一致的配置来确保正常运行，尤其是在失效转移场景中。global.ini 中的 `inifile_checker/replicate` 参数为满足该要求而提供了自动化解决方案。在主系统上启用该参数后，对主系统上的 ini 文件所做的任何配置更改都会自动同步到辅助站点。这样就无需手动复制配置，并有助于防止可能影响系统可用性的配置不匹配。该参数只需在主系统上配置，因为辅助系统将通过正常的系统复制过程接收这些配置更改。

将以下内容添加到 `global.ini` 中：

```
[inifile_checker]
replicate = true
```

请参阅 SAP Note [2978895 - Changing parameters on Primary and Secondary site of SAP HANA system](https://me.sap.com/notes/2978895) 

## 在主系统上创建 SAP HANA 备份
<a name="pre_setup_backup"></a>

 **获取所有活动数据库的列表：**

```
hdbsql -jx -i <hana_sys_nr> -u system -d SYSTEMDB "SELECT DATABASE_NAME,ACTIVE_STATUS from M_DATABASES"
```

例如：

```
hdbadm> hdbsql -jx -i 00 -u system -d SYSTEMDB "SELECT DATABASE_NAME,ACTIVE_STATUS from M_DATABASES"
Password:
DATABASE_NAME,ACTIVE_STATUS
"SYSTEMDB","YES"
"HDB","YES"
```

**创建 SYSTEMDB 和每个租户数据库的备份：**  
以下命令是针对基于文件的备份的示例。您可以使用首选工具和位置执行备份。如果使用文件系统（例如 /backup），请确保有足够的空间进行完整备份。

------
#### [ Backint ]

对于 SystemDB

```
hdbsql -i 00 -u SYSTEM  -d SYSTEMDB "BACKUP DATA USING BACKINT ('initial_hsr_db_SYSTEMDB') COMMENT 'Initial backup for HSR'";
```

对于每个租户数据库

```
hdbsql -i 00 -u SYSTEM  -d <TENANT_DB> "BACKUP DATA USING BACKINT ('initial_hsr_db_<TENANT_DB>') COMMENT 'Initial backup for HSR'";
```
+ 以 <sid>adm 的身份运行
+ 确保已正确配置 backint
+ 系统将提示您提供密码，您也可以使用 `-p password` 

------
#### [ File ]

对于 SystemDB

```
hdbsql -i <hana_sys_nr> -u system -d SYSTEMDB "BACKUP DATA USING FILE ('/<backup location>/initial_hsr_db_SYSTEMDB') COMMENT 'Initial backup for HSR'";
```

对于每个租户数据库

```
hdbsql -i <hana_sys_nr> -u system -d <TENANT_DB> "BACKUP DATA USING FILE ('/<backup location>/initial_hsr_db_<TENANT_DB>') COMMENT 'Initial backup for HSR'";
```
+ 以 <sid>adm 的身份运行
+ 确保备份位置有足够的空间和正确的文件权限
+ 系统将提示您提供密码，您也可以使用 `-p password` 

------

### 停止辅助系统并复制系统 PKI 密钥
<a name="copy_keys"></a>

**停止辅助系统**  
以 <sid>adm 的身份在辅助系统上停止 HANA 应用程序

```
sapcontrol -nr <hana_sys_nr> -function StopSystem <SID>
```

**复制系统 PKI 密钥**  
使用 scp、共享文件系统或 S3 存储桶，将以下 PKI SSFS 系统密钥和数据文件从主系统复制到辅助系统上的相同位置：

```
/usr/sap/<SID>/SYS/global/security/rsecssfs/data/SSFS_<SID>.DAT
/usr/sap/<SID>/SYS/global/security/rsecssfs/key/SSFS_<SID>.KEY
```

例如，可以使用 scp：

```
hdbadm>scp -p /usr/sap/HDB/SYS/global/security/rsecssfs/data/SSFS_HDB.DAT hdbadm@hanahost02:/usr/sap/HDB/SYS/global/security/rsecssfs/data/SSFS_HDB.DAT
hdbadm>scp -p /usr/sap/HDB/SYS/global/security/rsecssfs/key/SSFS_HDB.KEY hdbadm@hanahost02:/usr/sap/HDB/SYS/global/security/rsecssfs/key/SSFS_HDB.KEY
```

## 在主系统和辅助系统上配置系统复制
<a name="register_hsr"></a>

**在主系统上启用系统复制**  
确保主 SAP HANA 系统已**启动**，然后以 <sid>adm 的身份，使用唯一的站点名称启用系统复制：

```
hdbnsutil -sr_enable --name=<site_1>
```

例如：

```
hdbadm> hdbnsutil -sr_enable --name=siteA
```

**在辅助系统上注册系统复制**  
确保辅助 SAP HANA 系统**已停止**，然后以 <sid>adm 的身份，使用唯一的站点名称、主系统的连接详细信息和首选复制选项来启用系统复制。

```
hdbnsutil -sr_register \
 --name=<site_2> \
 --remoteHost=<hostname_1> \
 --remoteInstance=<hana_sys_nr> \
 --replicationMode=[sync|syncmem] \
 --operationMode=[logreplay|logreplay_readenabled]
```

例如：

```
hdbadm> hdbnsutil -sr_register --name=siteB --remoteHost=hanahost01 --remoteInstance=00 --replicationMode=syncmem --operationMode=logreplay
```

或者，如果您的设置要求对辅助服务器进行 active/active 读取访问权限，请执行以下操作：

```
hdbadm> hdbnsutil -sr_register --name=siteB --remoteHost=hanahost01 --remoteInstance=00 --replicationMode=syncmem --operationMode=logreplay_readenabled
```
+  `hostname_1` 是用于安装 SAP HANA 的主机名，可能是虚拟名称。
+ 复制模式可以是 `sync` 或 `syncmem`。
+ 要使复制支持集群系统和热备用系统，操作模式必须为 `logreplay` 或 `logreplay_readenabled`。
+ 有关更多信息，请参阅 SAP 文档。
  + SAP 文档：[Replication Modes for SAP HANA System Replication](https://help.sap.com/docs/SAP_HANA_PLATFORM/6b94445c94ae495c83a19646e7c3fd56/c039a1a5b8824ecfa754b55e0caffc01.html) 
  + SAP 文档：[Operaton Modes for SAP HANA System Replication](https://help.sap.com/docs/SAP_HANA_PLATFORM/6b94445c94ae495c83a19646e7c3fd56/627bd11e86c84ec2b9fcdf585d24011c.html) 
  + SAP 文档：[SAP HANA 系统复制- Active/Active （已启用读取）](https://help.sap.com/docs/SAP_HANA_PLATFORM/6b94445c94ae495c83a19646e7c3fd56/fe5fc53706a34048bf4a3a93a5d7c866.html) 

## 检查 SAP 主机代理版本
<a name="sap_host_agent"></a>

SAP 主机代理用于 SAP 实例的控制和监控。此代理由 SAP 集群资源代理和钩子使用。建议您在所有实例上安装主机代理的最新版本。有关更多详细信息，请参阅 [SAP Note 2219592 – Upgrade Strategy of SAP Host Agent](https://me.sap.com/notes/2219592)。

使用以下命令检查主机代理的版本，在所有 SAP HANA 节点上重复此操作：

```
# /usr/sap/hostctrl/exe/saphostexec -version
```

# SAP HANA 服务控制
<a name="sap-hana-pacemaker-rhel-hana-control"></a>

修改管理 SAP HANA 服务的方式以启用集群接管和操作。

**Topics**
+ [将 sidadm 添加到 haclient 组](#_add_sidadm_to_haclient_group)
+ [修改 HANA 的 SAP 配置文件](#_modify_sap_profile_for_hana)
+ [配置 SAPHana SR 集群挂钩以优化集群响应](#hook_saphanasr)
+ [（可选）配置快速启动选项](#_optional_configure_fast_start_option)
+ [查看 systemd 集成](#_review_systemd_integration)

## 将 sidadm 添加到 haclient 组
<a name="_add_sidadm_to_haclient_group"></a>

Pacemaker 软件会创建一个 haclient 操作系统组。为确保集群访问权限正确，请在所有集群节点上将 sidadm 用户添加到此组中。以根用户身份运行以下命令：

```
# usermod -a -G haclient hdbadm
```

## 修改 HANA 的 SAP 配置文件
<a name="_modify_sap_profile_for_hana"></a>

为了防止 SAP 启动框架在实例重启时自动启动 SAP HANA，请修改所有节点上的 SAP HANA 实例配置文件。这些配置文件位于 `/usr/sap/<SID>/SYS/profile/`。

以 <sid>adm 用户的身份，编辑 SAP HANA 配置文件 `<SID>_HDB<hana_sys_nr>_<hostname>` 并修改或添加 Autostart 参数，确保将其设置为 0：

```
Autostart = 0
```

## 配置 SAPHana SR 集群挂钩以优化集群响应
<a name="hook_saphanasr"></a>

如果系统复制失败， SAPHanaSR 挂钩会立即通知群集，从而补充了标准的群集轮询机制。这种优化可以显著缩短失效转移响应时间。

按照以下步骤配置 SAPHana SR 挂钩：

1.  **验证集群软件包** 

   钩子配置因正在使用的资源代理而异（有关详细信息，请参阅[部署指南](sap-hana-pacemaker-rhel-references.md#deployments-rhel)）。

------
#### [ SAPHanaSR ]

   检查是否安装了预期的软件包

   ```
   # rpm -qa resource-agents-sap-hana
   ```

------
#### [ SAPHanaSR-angi ]

   检查是否安装了预期的软件包

   ```
   # rpm -qa sap-hana-ha
   ```

------

1.  **确认钩子位置** 

   默认情况下软件包安装在 `/usr/share/sap-hana-ha/` 或 `/usr/share/SAPHanaSR/srHook` 中。我们建议使用默认位置，但您可以选择将其复制到自定义目录，例如 `/hana/share/myHooks`。该钩子必须在所有 SAP HANA 集群节点上可用。

1.  **配置 global.ini** 

   更新位于每个 SAP HANA 集群节点上 `/hana/shared/<SID>/global/hdb/custom/config/` 的 `global.ini` 文件。继续操作之前，请先制作一份备份副本。

------
#### [ SAPHanaSR ]

   ```
   [ha_dr_provider_SAPHanaSR]
   provider = SAPHanaSR
   path = /usr/share/SAPHanaSR/srHook
   execution_order = 1
   
   [trace]
   ha_dr_saphanasr = info
   ```

**注意**  
如果您修改了软件包的位置，请更新路径。

------
#### [ sap-hana-ha (newer agent) ]

   ```
   [ha_dr_provider_sushanasr]
   provider = HanaSR
   path = /usr/share/sap-hana-ha/
   execution_order = 1
   
   [trace]
   ha_dr_sushanasr = info
   ```

**注意**  
如果您修改了软件包的位置，请更新路径。

------

1.  **配置 Sudo 权限** 

    SAPHanaSR Python 挂钩需要 su <sid>do 权限才能让管理员用户访问集群属性：

   1. 在 `/etc/sudoers.d/` 中以根用户身份创建新的 sudoers 文件，例如 `60-SAPHanaSR-hook` 

   1. 使用 visudo 安全地编辑新文件 `visudo /etc/sudoers.d/60-SAPHanaSR-hook` 

   1. 添加以下配置，将 <sid> 替换为小写的系统 ID，将 <SID> 替换为大写的系统 ID：

      ```
      Cmnd_Alias SITE_SOK = /usr/sbin/crm_attribute -n hana_<sid>_site_srHook_[a-zA-Z0-9_]* -v SOK -t crm_config -s SAPHanaSR
      Cmnd_Alias SITE_SFAIL = /usr/sbin/crm_attribute -n hana_<sid>_site_srHook_[a-zA-Z0-9_]* -v SFAIL -t crm_config -s SAPHanaSR
      Cmnd_Alias HOOK_HELPER  = /usr/sbin/SAPHanaSR-hookHelper --sid=<SID> --case=checkTakeover
      hdbadm ALL=(ALL) NOPASSWD: SITE_SOK, SITE_SFAIL, HOOK_HELPER
      ```

      例如：

      ```
      Cmnd_Alias SITE_SOK = /usr/sbin/crm_attribute -n hana_hdb_site_srHook_[a-zA-Z0-9_]* -v SOK -t crm_config -s SAPHanaSR
      Cmnd_Alias SITE_SFAIL = /usr/sbin/crm_attribute -n hana_hdb_site_srHook_[a-zA-Z0-9_]* -v SFAIL -t crm_config -s SAPHanaSR
      Cmnd_Alias HOOK_HELPER  = /usr/sbin/SAPHanaSR-hookHelper --sid=HDB --case=checkTakeover
      hdbadm ALL=(ALL) NOPASSWD: SITE_SOK, SITE_SFAIL, HOOK_HELPER
      ```
**注意**  
该语法使用 glob 表达式，使得它可以适应不同的 HSR 站点名称，同时避免使用通配符。这确保了灵活性和安全性。在 SID 发生变化时，仍需要进行修改。将 `<sid>` 替换为与安装匹配的小写 `sid`，将 `<SID>` 替换为与安装匹配的大写 `SID`。

1.  **重新加载配置** 

   <sid>adm 将更改重新加载到 `global.ini` 时，使用 HANA 重新启动或以下命令：

   ```
   hdbadm> hdbnsutil -reconfig
   ```

1.  **验证钩子配置** 

   以 <sid>adm 的身份验证钩子是否已加载：

   ```
   hdbadm> cdtrace
   hdbadm> grep "loading HA/DR Provider" nameserver*
   ```

1.  **将配置复制到辅助系统** 

   1. 确认 global.ini 更改已复制到辅助系统

   1. 在辅助系统上创建对应的 sudoers.d 文件

## （可选）配置快速启动选项
<a name="_optional_configure_fast_start_option"></a>

SAP HANA 快速重启选项不在本文档的讨论范围内，该选项使用 tmpfs 文件系统来保留和重复使用 MAIN 数据片段，从而加快 SAP HANA 的重启速度。这在操作系统未重新启动（包括索引服务器的本地重启）的情况下很有用。

Fast Start Option 可能是 susChkSrv 挂钩的替代方案。

有关更多信息，请参阅 SAP 文档：[SAP HANA Fast Restart Option](https://help.sap.com/docs/SAP_HANA_PLATFORM/6b94445c94ae495c83a19646e7c3fd56/ce158d28135147f099b761f8b1ee43fc.html) 

## 查看 systemd 集成
<a name="_review_systemd_integration"></a>

查看 HANA 版本和 systemd 版本以确定是否满足了 systemd 的先决条件：

```
sidadm> systemctl --version
```

**操作系统版本**
+ Red Hat Enterprise Linux 8（systemd 版本 239）

**SAP HANA 修订版**
+ SAP HANA SPS07 修订版 70

使用带有 systemd 集成的 SAP HANA 版本（SPS07 及更高版本）时，您必须运行以下步骤，以防止在特意停止 Amazon EC2 实例时节点被隔离。请参阅 Note [3189534 - Linux: systemd integration for sapstartsrv and SAP HANA](https://me.sap.com/notes/3189534) 

1. 验证 SAP HANA 是否已与 systemd 集成。如果已集成，则会显示 systemd 服务名称，例如 SAP<SID>\$1<hana\$1sys\$1nr>.service。例如，对于 SID HDB 和实例编号 00，服务名称是 SAPHDB\$100.service。

   以根用户身份使用以下命令查找 SAP systemd 服务：

   ```
   # systemctl list-unit-files | grep -i sap
   ```

1. 创建 Pacemaker 服务即时接入文件：

   ```
   # mkdir -p /etc/systemd/system/pacemaker.service.d/
   ```

1. 创建包含以下内容的文件 `/etc/systemd/system/pacemaker.service.d/50-saphana.conf`：

   ```
   [Unit]
   Description=pacemaker needs SAP instance service
   Documentation=man:SAPHanaSR_basic_cluster(7)
   Wants=SAP<SID>_<hana_sys_nr>.service
   After=SAP<SID>_<hana_sys_nr>.service
   ```

1. 通过重新加载 systemd 来启用即时接入文件：

   ```
   # systemctl daemon-reload
   ```

1. 验证更改是否生效：

   ```
   # systemctl show pacemaker.service | grep SAP<SID>_<hana_sys_nr>
   ```

   例如，对于 SID HDB 和实例编号 00，预计输出如下：

   ```
   # systemctl show pacemaker.service | grep SAPHDB_00
   Wants=SAPHDB_00.service resource-agents-deps.target dbus.service
   After=system.slice network.target corosync.service resource-agents-deps.target basic.target rsyslog.service SAPHDB_00.service systemd-journald.socket sysinit.target time-sync.target dbus.service sbd.service
   ```

# 集群节点设置
<a name="sap-hana-pacemaker-rhel-cluster-node-setup"></a>

使用 Corosync 并配置所需的身份验证，在节点之间建立集群通信。

**Topics**
+ [部署仲裁生成器节点（仅限横向扩展集群）](#_deploy_a_majority_maker_node_scale_out_clusters_only)
+ [设置无密码身份验证](#_setup_passwordless_authentication)
+ [启用并启动 pcsd 服务](#_start_and_enable_the_pcsd_service)
+ [授权集群](#_authorize_the_cluster)
+ [生成 Corosync 配置](#_generate_corosync_configuration)
+ [验证配置](#_verify_configuration)

## 部署仲裁生成器节点（仅限横向扩展集群）
<a name="_deploy_a_majority_maker_node_scale_out_clusters_only"></a>

**注意**  
只有拥有两个以上节点的集群才需要此选项。

在中部署 SAP HANA Scale-Out 集群时 AWS，必须在第三个可用区 (AZ) 中包含一个多数制造商节点。仲裁生成器（平局决胜机制）节点在一个可用区出现故障时，通过保留仲裁权来确保集群保持正常运行。要使横向扩展集群正常运行，必须至少有一个可用区中的所有节点以及仲裁生成器节点在运行。如果不满足此最低要求，则集群将失去其仲裁状态，所有剩余的 SAP HANA 节点都将被隔离。

多数制造商要求最低 EC2 实例配置为 2 v CPUs、2 GB RAM 和 50 GB 磁盘空间；此实例专门用于法定人数管理，不托管 SAP HANA 数据库或任何其他集群资源。=== 更改 hacluster 密码

在所有集群节点上，更改操作系统用户 hacluster 的密码：

```
# passwd hacluster
```

## 设置无密码身份验证
<a name="_setup_passwordless_authentication"></a>

Red Hat 集群工具为集群活动提供全面的报告和故障排除功能。许多这些工具需要在节点之间进行无密码 SSH 访问才能有效地收集整个集群的信息。Red Hat 建议为根用户配置无密码 SSH，以实现无缝集群诊断和报告。

请参阅 Redhat 文档 [How to setup SSH Key passwordless login in Red Hat Enterprise Linux](https://access.redhat.com/solutions/9194) 

请参阅[访问 Red Hat 知识库门户](https://docs.aws.amazon.com/systems-manager/latest/userguide/fleet-manager-red-hat-knowledge-base-access.html) 

**警告**  
在实施此配置之前，请查看配置对组织的安全影响，包括根访问权限控制和网络分段。

## 启用并启动 pcsd 服务
<a name="_start_and_enable_the_pcsd_service"></a>

```
# systemctl enable pcsd --now
```

## 授权集群
<a name="_authorize_the_cluster"></a>

运行以下命令，在两个节点上启用并启动 Pacemaker 集群服务：

```
# pcs host auth <hostname_1> <hostname_2> -u hacluster -p <password>
```
+ 系统将提示您输入之前设置的 hacluster 密码。

## 生成 Corosync 配置
<a name="_generate_corosync_configuration"></a>

Corosync 提供高可用性集群所需的成员资格和成员通信需求。

使用以下命令执行初始设置

```
# pcs cluster setup <cluster_name> \
<hostname_1> addr=<host_ip_1> addr=<host_additional_ip_1> \
<hostname_2> addr=<host_ip_2> addr=<host_additional_ip_2>
```
+ 示例

```
# pcs cluster setup hana_cluster hanahost01 addr=10.1.20.1 addr=10.1.20.2 hanahost02 addr=10.2.20.1 addr=10.2.20.2
```


| IP 地址类型 | 示例 | 
| --- | --- | 
|  <host\$1ip\$11>  |  10.2.10.1  | 
|  <host\$1additional\$1ip\$11>  |  10.2.10.2  | 
|  <host\$1ip\$12>  |  10.2.20.1  | 
|  <host\$1additional\$1ip\$12>  |  10.2.20.2  | 

时序参数针对 AWS 云环境进行了优化：
+ 将 totem 令牌的值增加到 15 秒可提供稳定的集群操作，同时适应正常的云网络特性。这些设置可防止在短暂的网络变化期间进行不必要的失效转移
+ 扩展到超过两个节点时，请从 quorum 部分中删除 two\$1node 参数。时序参数将使用 token\$1coefficient 功能自动调整，以便在添加节点时保持适当的故障检测能力。

```
# pcs cluster config update totem token=15000
```

## 验证配置
<a name="_verify_configuration"></a>

```
# pcs cluster start --all
```

**Example**  
通过启用 Pacemaker 服务，服务器将在重启后自动加入集群。这样可以确保系统受到保护。或者，您可以在引导时手动启动 Pacemaker 服务。然后，您可以调查失败的原因。

运行以下命令，查看 Pacemaker 服务的状态。

```
# systemctl status pacemaker
```

输出示例：

```
● pacemaker.service - Pacemaker High Availability Cluster Manager
     Loaded: loaded (/usr/lib/systemd/system/pacemaker.service; enabled; vendor preset: disabled)
     Active: active (running) since Mon 2025-06-02 13:27:48 AEST; 39s ago
       Docs: man:pacemakerd
             https://clusterlabs.org/pacemaker/doc/
   Main PID: 38554 (pacemakerd)
      Tasks: 7
     Memory: 31.3M
        CPU: 136ms
     CGroup: /system.slice/pacemaker.service
             ├─38554 /usr/sbin/pacemakerd
             ├─38555 /usr/libexec/pacemaker/pacemaker-based
             ├─38556 /usr/libexec/pacemaker/pacemaker-fenced
             ├─38557 /usr/libexec/pacemaker/pacemaker-execd
             ├─38558 /usr/libexec/pacemaker/pacemaker-attrd
             ├─38559 /usr/libexec/pacemaker/pacemaker-schedulerd
             └─38560 /usr/libexec/pacemaker/pacemaker-controld
```

集群服务 Pacemaker 启动后，使用 pcs 命令检查集群状态，如下例所示：

```
# pcs status
```

输出示例：

```
# pcs status
Cluster name: hana_cluster

WARNINGS:
No stonith devices and stonith-enabled is not false

Cluster Summary:
  * Stack: corosync
  * Current DC: hanahost02 (version 2.0.5-9.el8_4.8-ba59be7122) - partition with quorum
  * Last updated: Mon May 12 12:59:35 2025
  * Last change:  Mon May 12 12:59:25 2025 by hacluster via crmd on hanahost02
  * 2 nodes configured
  * 0 resource instances configured

Node List:
  * Online: [ hanahost01 hanahost02 ]

Full List of Resources:
  * No resources

Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled
```

主系统（hanahost01）和辅助系统（hanahost02）必须显示为在线。您可以使用 corosync-cfgtool 命令，查找集群的环路状态和关联的 IP 地址，如下例所示：

```
# corosync-cfgtool -s
```

输出示例：

```
Local node ID 1, transport knet
LINK ID 0 udp
        addr    = 10.2.10.1
        status:
                nodeid:          1:     localhost
                nodeid:          2:     connected
LINK ID 1 udp
        addr    = 10.2.10.2
        status:
                nodeid:          1:     localhost
                nodeid:          2:     connected
```

# 群集配置
<a name="sap-hana-pacemaker-rhel-cluster-config"></a>

引导集群并配置所有必需的集群资源和限制。

**Topics**
+ [为资源创建做准备](#_prepare_for_resource_creation)
+ [集群引导](#cluster-bootstrap)
+ [创建 STONITH 隔离资源](#resource-stonith)
+ [创建重叠 IP 资源](#resource-overlayip)
+ [创建 SAPHana拓扑资源](#resource-saphanatop)
+ [创建 SAPHANA 资源（基于资源代理 SAPHana 或 SAPHana控制器）](#resource-saphana)
+ [创建资源约束](#resource-constraints)
+ [重置配置 – 可选](#_reset_configuration_optional)

## 为资源创建做准备
<a name="_prepare_for_resource_creation"></a>

为确保集群在设置资源和配置期间不会执行任何意外操作，请将维护模式设置为 true。

运行以下命令，将集群置于维护模式：

```
# pcs property set maintenance-mode=true
```

要验证当前的维护状态，请执行以下操作：

```
$ pcs status
```

**注意**  
维护模式分为两种类型：  
集群范围的维护（使用 `pcs property set maintenance-mode=true` 进行设置）
特定于节点的维护（使用 `pcs node maintenance nodename` 进行设置）
更改配置时，请务必使用集群范围的维护模式。有关特定于节点的操作，例如硬件维护，请参阅“操作”部分以了解正确的步骤。  
要在配置完成后禁用维护模式，请执行以下操作：  

```
# pcs property set maintenance-mode=false
```

## 集群引导
<a name="cluster-bootstrap"></a>

### 配置集群属性
<a name="_configure_cluster_properties"></a>

配置集群属性以建立隔离行为和资源失效转移设置：

```
# pcs property set stonith-enabled="true"
# pcs property set stonith-timeout="600"
# pcs property set priority-fencing-delay="20"
```
+ 建议**priority-fencing-delay**在网络分区事件期间保护 SAP HANA 节点。进行集群分区时，这种延迟会优先考虑托管更高优先级资源的节点，而 SAP HANA 主（已提升）实例将获得额外的优先级权重。这有助于确保主 HANA 节点在脑裂场景中存活下来。建议的 20 秒 priority-fencing-delay与 stonith 资源中配置的 pcmk\$1delay\$1max（10 秒）配合使用，在进行围栏之前，总共可能延迟长达 30 秒。

要验证集群属性设置，请执行以下操作：

```
# pcs property list
# pcs property config <property_name>
```

### 配置资源默认值
<a name="_configure_resource_defaults"></a>

配置资源默认行为：

------
#### [ RHEL 8.4 and above ]

```
# pcs resource defaults update resource-stickiness="1000"
# pcs resource defaults update migration-threshold="5000"
```

------
#### [ RHEL 7.x and RHEL 8.0 to 8.3 ]

```
# pcs resource defaults resource-stickiness="1000"
# pcs resource defaults migration-threshold="5000"
```
+ **resource-stickiness** 值可以防止不必要的资源移动，从而有效地为移动资源设置“成本”。值为 1000 会强烈推荐将资源保留在当前节点上，避免与移动相关的停机时间。
+ **migration-threshold** 为 5000 可确保集群在声明该节点不适合托管资源之前，多次尝试在同一节点上恢复资源。

------

各个资源可以用自己定义的值覆盖这些默认值。

要验证您的资源默认设置，请执行以下操作：

### 配置操作默认值
<a name="_configure_operation_defaults"></a>

```
# pcs resource op defaults update timeout="600"
```

如果未定义特定于资源的超时，op\$1defaults 超时可确保所有集群操作的默认超时为合理的 600 秒。默认值不适用于使用自己定义的值进行了覆盖的资源

## 创建 STONITH 隔离资源
<a name="resource-stonith"></a>

正确的群集屏蔽操作需要 AWS STONITH 资源。建议将该`fence_aws`资源用于 AWS 部署，因为它利用 AWS API 通过停止 EC2 实例来安全地屏蔽出现故障或无法传染的节点。

使用资源代理 **`fence_aws`** 创建 STONITH 资源：

```
# pcs stonith create <stonith_resource_name> fence_aws \
pcmk_host_map="<hostname_1>:<instance_id_1>;<hostname_2>:<instance_id_2>" \
region="<aws_region>" \
skip_os_shutdown="true" \
pcmk_delay_max="10" \
pcmk_reboot_timeout="600" \
pcmk_reboot_retries="4" \
op start interval="0" timeout="600" \
op stop interval="0" timeout="180" \
op monitor interval="300" timeout="60"
```

详细信息：
+  **pcmk\$1host\$1map**-将集群节点的主机名映射到其 EC2 实例。 IDs此映射在 AWS 账户中必须是唯一的，并遵循主机名:instance-id 的格式，多个条目用分号分隔。
+  ** AWS 区域**-部署 EC2 实例的区域
+  **pcmk\$1delay\$1max**：执行隔离操作前的随机延迟。与群集属性配合使用，可`priority-fencing-delay`防止在 2 节点群集中同时进行屏蔽。过去会设置为较高的值，但现在由 `priority-fencing-delay` 处理主节点保护，较低的值（10 秒）便已足够。在具有实际法定人数（3 个以上节点）的集群中省略，以避免不必要的延迟。
+  **pcmk\$1reboot\$1timeout**：重启操作允许的最长时间，以秒为单位。
+  **pcmk\$1reboot\$1retries**：重试失败的重新引导操作的次数。
+  s@@ **kip\$1os\$1shutdown（全新）-利用新的 ec2 停止实例 API 标志，通过跳过**操作系统的关闭来强制停止 EC2 实例。
  +  [红帽解决方案 4963741-fence\$1aws fence操作失败，显示 “等待关闭电源超时”（需要访问](https://access.redhat.com/solutions/4963741)红帽客户门户）
+  *使用[参数参考](sap-hana-pacemaker-rhel-parameters.md)中的值的示例*：  
**Example**  

  ```
  # pcs stonith create rsc_fence_aws fence_aws \
  pcmk_host_map="hanahost01:i-xxxxinstidforhost1;hanahost02:i-xxxxinstidforhost2" \
  region="us-east-1" \
  skip_os_shutdown="true" \
  pcmk_delay_max="10" \
  pcmk_reboot_timeout="600" \
  pcmk_reboot_retries="4" \
  op start interval="0" timeout="600" \
  op stop interval="0" timeout="180" \
  op monitor interval="300" timeout="60"
  ```

**注意**  
配置 STONITH 资源时，请考虑实例的启动和关闭时间。默认 pcmk\$1reboot\$1action 是“reboot”，此时集群会等待停止和启动操作完成，然后才会将隔离操作视为成功。这使得集群可以返回受保护状态。设置 `pcmk_reboot_action=off` 可允许集群在关闭后立即继续。对于内存增强型裸机实例，建议只使用“off”，因为启动期间初始化内存的时间会延长。  

```
# pcs resource update <stonith_resource_name> pcmk_reboot_action="off"
# pcs resource update <stonith_resource_name> pcmk_off_timeout="600"
# pcs resource update <stonith_resource_name> pcmk_off_retries="4"
```

## 创建重叠 IP 资源
<a name="resource-overlayip"></a>

此资源通过更新 AWS 路由表条目来确保在故障转移期间客户端连接跟随 SAP HANA 主实例。它管理一个始终指向活动 SAP HANA 数据库的重叠 IP 地址

创建 IP 资源：

```
# pcs resource create rsc_ip_<SID>_HDB<hana_sys_nr> ocf:heartbeat:aws-vpc-move-ip \
ip="<hana_overlayip>" \
routing_table="<routetable_id>" \
interface="eth0" \
profile="<cli_cluster_profile>" \
op start interval="0" timeout="180" \
op stop interval="0" timeout="180" \
op monitor interval="60" timeout="60"
```
+  **ip**：将用于连接主要 SAP HANA 数据库的重叠 IP 地址。参见[重叠 IP 概念](sap-hana-pacemaker-rhel-concepts.md#overlay-ip-rhel) 
+  **routing\$1tab** le-需要更新的 AWS 路由表 ID。要指定多个路由表，可以使用逗号分隔（例如，`routing_table=rtb-xxxxxroutetable1,rtb-xxxxxroutetable2`）。确保已按照[为叠加层添加 VPC 路由表条目 IPs](sap-hana-pacemaker-rhel-infra-setup.md#rt-rhel)中的说明创建初始条目 
+  **interface**：IP 地址的网络接口（通常为 eth0）
+  **profil** e-（可选）用于 AP AWS I 身份验证的 CLI 配置文件名称。使用 `aws configure list-profiles` 验证配置文件是否存在。如果配置文件没有明确地进行配置，则将使用默认配置文件。
+  **awscli**-（可选）CL AWS I 可执行文件的路径。默认路径为 `/usr/bin/aws`。仅当 AWS CLI 安装在其他位置时才指定此参数。要确认系统上的路径，请运行`which aws`。
+  *使用[参数参考](sap-hana-pacemaker-rhel-parameters.md)中的值的示例*：  
**Example**  

  ```
  # pcs resource create rsc_ip_HDB_HDB00 ocf:heartbeat:aws-vpc-move-ip \
  ip="172.16.52.1" \
  routing_table="rtb-xxxxxroutetable1" \
  interface="eth0" \
  profile="cluster" \
  op start interval="0" timeout="180" \
  op stop interval="0" timeout="180" \
  op monitor interval="60" timeout="60"
  ```

**注意**  
要在创建资源参数后更新任何资源参数，请使用`pcs resource update`。例如，如果 AWS CLI 未安装在默认路径 (`/usr/bin/aws`)，请运行：  

```
# pcs resource update rsc_ip_<SID>_HDB<hana_sys_nr> awscli=$(which aws)
```

**已启用 Active/Active 读取**  
仅适用于您正在使用 `logreplay_readenabled` 并要求可通过重叠 IP 访问辅助系统时。您可以创建其他 IP 资源。

```
# pcs resource create primitive rsc_ip_<SID>_HDB<hana_sys_nr>_readenabled ocf:heartbeat:aws-vpc-move-ip \
ip="<readenabled_overlayip>" \
routing_table="<routetable_id>" \
interface="eth0" \
profile="<cli_cluster_profile>" \
op start interval="0" timeout="180" \
op stop interval="0" timeout="180" \
op monitor interval="60" timeout="60"
```
+  *使用[参数参考](sap-hana-pacemaker-rhel-parameters.md)中的值的示例*：  
**Example**  

  ```
  # crm configure primitive rsc_ip_HDB_HDB00_readenabled ocf:heartbeat:aws-vpc-move-ip \
  params ip="172.16.52.2" \
  routing_table="rtb-xxxxxroutetable1" \
  interface="eth0" \
  profile="cluster" \
  op start interval="0" timeout="180" \
  op stop interval="0" timeout="180" \
  op monitor interval="60" timeout="60"
  ```

**对于共享 VPC**  
如果您的配置需要共享 VPC，则需要另外两个参数。

```
# pcs resource create primitive rsc_ip_<SID>_HDB<hana_sys_nr> ocf:heartbeat:aws-vpc-move-ip \
ip="<hana_overlayip>" routing_table=<routetable_id> interface=eth0 \
profile="<cli_cluster_profile>" lookup_type=NetworkInterfaceId \
routing_table_role="arn:aws:iam::<sharing_vpc_account_id>:role/<sharing_vpc_account_cluster_role>" \
op start interval="0" timeout="180" \
op stop interval="0" timeout="180" \
op monitor interval="60" timeout="60"
```

其他详细信息：
+ lookup\$1type= NetworkInterfaceId
+ routing\$1table\$1role="arn:aws:iam::<shared\$1vpc\$1account\$1id>:role/<sharing\$1vpc\$1account\$1cluster\$1role>"

## 创建 SAPHana拓扑资源
<a name="resource-saphanatop"></a>

 SAPHana拓扑资源代理通过系统复制帮助管理 SAP HANA 数据库的高可用性。它分析 HANA 拓扑并通过节点状态属性报告调查发现。 SAPHana 或 SAPHana控制器资源代理使用这些属性来控制 HANA 数据库。 SAPHana拓扑启动并监视本地 saphostagent，利用 landscapeHostConfiguration .py、hdbnsutil 和 saphostctrl 等 SAP 接口收集有关系统状态、角色和配置的信息。

对于纵向扩展部署和横向扩展部署

有关该资源的文档，您可以查看 man 页面。

```
# man ocf_heartbeat_SAPHanaTopology
```

------
#### [ For scale-up (2-node) ]

对于原始资源和克隆资源：

```
# pcs resource create rsc_SAPHanaTopology_<SID>_HDB<hana_sys_nr> ocf:heartbeat:SAPHanaTopology \
SID="<SID>" InstanceNumber="<hana_sys_nr>" \
op start interval="0" timeout="600" \
op stop interval="0" timeout="300" \
op monitor interval="10" timeout="600" \
clone clone-node-max="1" interleave="true" clone-max="2"
```
+  *使用[参数参考](sap-hana-pacemaker-rhel-parameters.md)中的值的示例*：  
**Example**  

  ```
  # pcs resource create rsc_SAPHanaTopology_HDB_HDB00 ocf:heartbeat:SAPHanaTopology \
  SID="HDB" \
  InstanceNumber="00" \
  op start interval="0" timeout="600" \
  op stop interval="0" timeout="300" \
  op monitor interval="10" timeout="600" \
  clone clone-node-max="1" interleave="true" clone-max="2"
  ```

------
#### [ For scale-out ]

对于原始资源和克隆资源：

```
# pcs resource create rsc_SAPHanaTopology_<SID>_HDB<hana_sys_nr> ocf:heartbeat:SAPHanaTopology \
SID="<SID>" InstanceNumber="<hana_sys_nr>" \
op start interval="0" timeout="600" \
op stop interval="0" timeout="300" \
op monitor interval="10" timeout="600" \
clone clone-node-max="1" interleave="true" clone-max="<number-of-nodes>"
```
+  *使用[参数参考](sap-hana-pacemaker-rhel-parameters.md)中的值的示例*：  
**Example**  

  ```
  # pcs resource create rsc_SAPHanaTopology_HDB_HDB00 ocf:heartbeat:SAPHanaTopology \
  SID="HDB" InstanceNumber="00" \
  op start interval="0" timeout="600" \
  op stop interval="0" timeout="300" \
  op monitor interval="10" timeout="600" \
  clone clone-node-max="1" interleave="true" clone-max="6"
  ```

------

详细信息：
+  **SID**：HANA 实例的 SAP 系统 ID
+  **InstanceNumber**-SAP HANA 实例的实例号
+  **clone-node-max**-定义可以在单个节点上启动多少个资源代理副本（设置为 1）
+  **interleave**：允许在同一节点上并行启动依赖克隆资源（设置为 true）
+  **clone-max**：定义可以在集群中启动的克隆实例总数（例如，使用 2 用于横向扩展，或设置为 6 用于横向扩展，每个站点 3 个节点，不包括仲裁生成器节点）

## 创建 SAPHANA 资源（基于资源代理 SAPHana 或 SAPHana控制器）
<a name="resource-saphana"></a>

SAP HANA 资源代理管理 SAP HANA 数据库之间的系统复制和失效转移。这些代理控制启动、停止和监视操作，同时检查同步状态，以保持数据一致性。他们利用 SAP 接口，包括 sapcontrol、 landscapeHostConfiguration、hdbnsutil 和 saphostctrl。 systemReplicationStatus所有配置都与 SAPHana拓扑代理配合使用，拓扑代理收集有关群集节点间系统复制状态的信息。

根据您的 SAP HANA 架构选择合适的资源代理配置：

### SAPHanaSR-angi 部署（在 RHEL 9.6 和 10\$1 版本中可用）
<a name="_saphanasr_angi_deployments_available_in_rhel_9_6_and_10"></a>

在 RHEL 9.6 和 10\$1 版本上可用，并推荐用于新部署。具有下一代系统复制架构 (SAPHanaSR-angi) 的 SAPHana控制器资源代理为纵向扩展和横向扩展部署提供了改进的集成和管理功能。有关详细信息：

有关该资源的文档，您可以查看 man 页面。

```
# man ocf_heartbeat_SAPHanaController
```

------
#### [ For scale-up (2-node) ]

创建原始资源

```
# pcs resource create rsc_SAPHanaController_<SID>_HDB<hana_sys_nr> ocf:heartbeat:SAPHanaController \
SID="<SID>" \
InstanceNumber="<hana_sys_nr>" \
PREFER_SITE_TAKEOVER="true" \
DUPLICATE_PRIMARY_TIMEOUT="7200" \
AUTOMATED_REGISTER="true" \
op start interval="0" timeout="3600" \
op stop interval="0" timeout="3600" \
op promote interval="0" timeout="3600" \
op monitor interval="60" role="Promoted" timeout="700" \
op monitor interval="61" role="Unpromoted" timeout="700" \
promotable notify="true" clone-node-max="1" interleave="true" clone-max="2" \
meta priority="100"
```
+  *使用[参数参考](sap-hana-pacemaker-rhel-parameters.md)中的值的示例*：

  ```
  # pcs resource create rsc_SAPHanaController_HDB_HDB00 ocf:heartbeat:SAPHanaController \
  SID="HDB" \
  InstanceNumber="00" \
  PREFER_SITE_TAKEOVER="true" \
  DUPLICATE_PRIMARY_TIMEOUT="7200" \
  AUTOMATED_REGISTER="true" \
  op start interval="0" timeout="3600" \
  op stop interval="0" timeout="3600" \
  op promote interval="0" timeout="3600" \
  op monitor interval="60" role="Promoted" timeout="700" \
  op monitor interval="61" role="Unpromoted" timeout="700" \
  promotable notify="true" clone-node-max="1" interleave="true" clone-max="2" \
  meta priority="100"
  ```

------
#### [ For scale-out ]

使用 SAPHana控制器资源代理创建基元：

```
# pcs resource create rsc_SAPHanaController_<SID>_HDB<hana_sys_nr> ocf:heartbeat:SAPHanaController \
SID="<SID>" \
InstanceNumber="<hana_sys_nr>" \
PREFER_SITE_TAKEOVER="true" \
DUPLICATE_PRIMARY_TIMEOUT="7200" \
AUTOMATED_REGISTER="true" \
op start interval="0" timeout="3600" \
op stop interval="0" timeout="3600" \
op promote interval="0" timeout="3600" \
op monitor interval="60" role="Promoted" timeout="700" \
op monitor interval="61" role="Unpromoted" timeout="700" \
promotable notify="true" clone-node-max="1" interleave="true" clone-max="<number-of-nodes>"
```
+  *使用[参数参考](sap-hana-pacemaker-rhel-parameters.md)中的值的示例*：  
**Example**  

  ```
  # pcs resource create rsc_SAPHanaController_<SID>_HDB<hana_sys_nr> ocf:heartbeat:SAPHanaController \
  params SID="HDB" \
  InstanceNumber="00" \
  PREFER_SITE_TAKEOVER="true" \
  DUPLICATE_PRIMARY_TIMEOUT="7200" \
  AUTOMATED_REGISTER="true" \
  op start interval="0" timeout="3600" \
  op stop interval="0" timeout="3600" \
  op promote interval="0" timeout="3600" "\
  op monitor interval="60" role="Promoted" timeout="700" \
  op monitor interval="61" role="Unpromoted" timeout="700" \
  promotable notify="true" clone-node-max="1" interleave="true" clone-max="<number-of-nodes>"
  ```

------

详细信息：
+  **SID**：HANA 实例的 SAP 系统 ID
+  **InstanceNumber**-SAP HANA 实例的实例号
+  **clone-node-max**-定义可以在单个节点上启动多少个资源代理副本（设置为 1）
+  **interleave**：允许在同一节点上并行启动依赖克隆资源（设置为 true）
+  **clone-max**：定义可以在集群中启动的克隆实例总数（例如，使用 2 用于横向扩展，或设置为 6 用于横向扩展，每个站点 3 个节点，不包括仲裁生成器节点）
+  **PREFER\$1SITE\$1TAKEOVER** 定义是否首选接管辅助系统。查看非标准部署。
+  **AUTOMATED\$1REGISTER** 定义是否应将前主系统注册为辅助系统。查看非标准部署。
+  **DUPLICATE\$1PRIMARY\$1TIMEOUT** 是等待时间，用于尽可能降低意外的双主系统风险。
+  **meta pri** ority-将其设置为 100 可以同时 priority-fencing-delay确保正确的故障转移顺序并防止同步屏蔽操作
+ 对于较大的数据库，可能需要增加启动和停止超时值（3600 秒）。根据您的数据库大小和观测 startup/shutdown 时间调整这些值
+ 如果您需要更新配置，以下示例可帮助您确定正确的命令

  ```
  # pcs resource update rsc_SAPHanaController_HDB_HDB00 op monitor role="Promoted" timeout=900
  # pcs resource update rsc_SAPHanaController_HDB_HDB00 DUPLICATE_PRIMARY_TIMEOUT=3600
  # pcs resource meta rsc_SAPHanaController_HDB_HDB00-clone priority=100
  ```

### 经典部署
<a name="_classic_deployments"></a>

对于经典的纵向扩展部署， SAPHana 资源代理管理两个 SAP HANA 数据库之间的接管。有关详细信息：

```
# man ocf_heartbeat_SAPHana
```

------
#### [ For scale-up (2-node) ]

使用 SAPHana 资源代理创建基元

```
# pcs resource create rsc_SAPHana_<SID>_HDB<hana_sys_nr> ocf:heartbeat:SAPHana \
SID="<SID>" \
InstanceNumber="<hana_sys_nr>" \
PREFER_SITE_TAKEOVER="true" \
DUPLICATE_PRIMARY_TIMEOUT="7200" \
AUTOMATED_REGISTER="true" \
op start interval="0" timeout="3600" \
op stop interval="0" timeout="3600" \
op promote interval="0" timeout="3600" \
op monitor interval="60" role="Promoted" timeout="700" \
op monitor interval="61" role="Unpromoted" timeout="700" \
promotable notify="true" clone-node-max="1" interleave="true" clone-max="2" \
meta priority="100"
```
+  *使用[参数参考](sap-hana-pacemaker-rhel-parameters.md)中的值的示例*：

  ```
  # pcs resource create rsc_SAPHana_HDB_HDB00 ocf:heartbeat:SAPHana \
  SID="HDB" \
  InstanceNumber="00" \
  PREFER_SITE_TAKEOVER="true" \
  DUPLICATE_PRIMARY_TIMEOUT="7200" \
  AUTOMATED_REGISTER="true" \
  op start interval="0" timeout="3600" \
  op stop interval="0" timeout="3600" \
  op promote interval="0" timeout="3600" \
  op monitor interval="60" role="Promoted" timeout="700" \
  op monitor interval="61" role="Unpromoted" timeout="700" \
  promotable notify="true" clone-node-max="1" interleave="true" clone-max="2" \
  meta priority="100"
  ```

------
#### [ For scale-out ]

使用 SAPHana控制器资源代理创建基元：

```
# pcs resource create rsc_SAPHanaController_<SID>_HDB<hana_sys_nr> ocf:heartbeat:SAPHanaController \
SID="<SID>" \
InstanceNumber="<hana_sys_nr>" \
PREFER_SITE_TAKEOVER="true" \
DUPLICATE_PRIMARY_TIMEOUT="7200" \
AUTOMATED_REGISTER="true" \
op start interval="0" timeout="3600" \
op stop interval="0" timeout="3600" \
op promote interval="0" timeout="3600" \
op monitor interval="60" role="Promoted" timeout="700" \
op monitor interval="61" role="Unpromoted" timeout="700" \
promotable notify="true" clone-node-max="1" interleave="true" clone-max="<number-of-nodes>"
```
+  *使用[参数参考](sap-hana-pacemaker-rhel-parameters.md)中的值的示例*：

  ```
  # pcs resource create rsc_SAPHanaController_<SID>_HDB<hana_sys_nr> ocf:heartbeat:SAPHanaController \
  params SID="HDB" \
  InstanceNumber="00" \
  PREFER_SITE_TAKEOVER="true" \
  DUPLICATE_PRIMARY_TIMEOUT="7200" \
  AUTOMATED_REGISTER="true" \
  op start interval="0" timeout="3600" \
  op stop interval="0" timeout="3600" \
  op promote interval="0" timeout="3600" "\
  op monitor interval="60" role="Promoted" timeout="700" \
  op monitor interval="61" role="Unpromoted" timeout="700" \
  promotable notify="true" clone-node-max="1" interleave="true" clone-max="<number-of-nodes>"
  ```

------

详细信息：
+  **SID**：HANA 实例的 SAP 系统 ID
+  **InstanceNumber**-SAP HANA 实例的实例号
+  **clone-node-max**-定义可以在单个节点上启动多少个资源代理副本（设置为 1）
+  **interleave**：允许在同一节点上并行启动依赖克隆资源（设置为 true）
+  **clone-max**：定义可以在集群中启动的克隆实例总数（例如，使用 2 用于横向扩展，或设置为 6 用于横向扩展，每个站点 3 个节点，不包括仲裁生成器节点）
+  **PREFER\$1SITE\$1TAKEOVER** 定义是否首选接管辅助系统。查看非标准部署。
+  **AUTOMATED\$1REGISTER** 定义是否应将前主系统注册为辅助系统。查看非标准部署。
+  **DUPLICATE\$1PRIMARY\$1TIMEOUT** 是等待时间，用于尽可能降低意外的双主系统风险。
+  **meta pri** ority-将其设置为 100 可以同时 priority-fencing-delay确保正确的故障转移顺序并防止同步屏蔽操作
+ 对于较大的数据库，可能需要增加启动和停止超时值（3600 秒）。根据您的数据库大小和观测 startup/shutdown 时间调整这些值
+ 如果您需要更新配置，以下示例可帮助您确定正确的命令

  ```
  # pcs resource update rsc_SAPHana_HDB_HDB00 op monitor role="Promoted" timeout=900
  # pcs resource update rsc_SAPHana_HDB_HDB00 DUPLICATE_PRIMARY_TIMEOUT=3600
  # pcs resource meta rsc_SAPHana_HDB_HDB00-clone priority=100
  ```

## 创建资源约束
<a name="resource-constraints"></a>

以下约束是必需的。

### 顺序约束
<a name="_order_constraint"></a>

此约束定义了 SAPHana拓扑和 SAPHana 资源之间的起始顺序：

```
# pcs constraint order <SAPHanaTopology-clone> <SAPHana/SAPHanaController-clone> symmetrical=false
```
+  *示例*：

  ```
  # pcs constraint order start rsc_SAPHanaTopology_HDB_HDB00-clone then rsc_SAPHana_HDB_HDB00-clone symmetrical=false
  ```

### 主机托管约束
<a name="_colocation_constraint"></a>

#### 主资源的 IP
<a name="_ip_with_primary"></a>

此约束可确保用于确定重叠 IP 的目标的 IP 资源，运行在具有主 SAP Hana 角色的节点上：

```
# pcs constraint colocation add <ip_resource> with promoted <SAPHana/SAPHanaController-clone> 2000
```
+  *示例*：

  ```
  # pcs constraint colocation add rsc_ip_HDB_HDB00 with promoted rsc_SAPHana_HDB_HDB00-clone 2000
  ```

#### ReadOnly 带辅助的 IP（仅适用于 ReadOnly 模式）
<a name="_readonly_ip_with_secondary_only_for_readonly_patterns"></a>

此约束可确保启用只读的 IP 资源运行在辅助（未提升）节点上。当辅助节点不可用时，IP 将移至主节点，读取工作负载将与主工作负载共享容量：

```
# pcs constraint colocation add <ip_resource> with unpromoted <SAPHana/SAPHanaController-clone> 2000
```
+  *示例*：

  ```
  # pcs constraint colocation add rsc_ip_HDB_HDB00_readenabled  with unpromoted rsc_SAPHana_HDB_HDB00-clone 2000
  ```

### 位置约束
<a name="_location_constraint"></a>

#### 仲裁生成器上没有 SAP HANA 资源（仅限横向扩展）
<a name="_no_sap_hana_resources_on_the_majority_maker_scale_out_only"></a>

这种位置约束可确保 SAP HANA 资源避开仲裁生成器，因为其上不适合运行这些资源。

```
# pcs constraint location <SAPHanaTopology-clone> avoids <hostname_mm>
# pcs constraint location <SAPHana/SAPHanaController-clone> avoids <hostname_mm>
```

### 激活集群
<a name="_activate_cluster"></a>

使用 `pcs config show` 来检查是否正确输入了所有值。

确认值正确之后，使用以下命令将维护模式设置为 false。这使得集群可以控制资源：

```
# pcs property set maintenance-mode=false
```

## 重置配置 – 可选
<a name="_reset_configuration_optional"></a>

**重要**  
以下说明可帮助您重置完整配置。只有当您想从头开始进行设置时，才运行这些命令。

运行以下命令可备份当前配置以供参考：

```
# pcs config backup /tmp/cluster_backup_$(date +%Y%m%d)
# pcs config show > /tmp/config_backup_$(date +%Y%m%d).txt
```

运行以下命令可停止并清除当前配置

```
# pcs cluster stop --all
hanahost02: Stopping Cluster (pacemaker)...
hanahost01: Stopping Cluster (pacemaker)...
hanahost02: Stopping Cluster (corosync)...
hanahost01: Stopping Cluster (corosync)...
# pcs cluster destroy
Shutting down pacemaker/corosync services...
Killing any remaining services...
Removing all cluster configuration files...
```

执行上述擦除命令后，它将从集群信息库（CIB）中删除所有集群资源，并断开从 corosync 到集群的通信。只有在绝对需要将所有设置重置为默认值时才执行这些步骤。对于较小的更改，请改用 pcs 资源更新或 pcs 属性设置。

# 客户端连接
<a name="sap-hana-pacemaker-rhel-client-connectivity"></a>

对于正确连接 SAP HANA 数据库：
+ 确保在所有应用程序服务器中都能正确解析重叠 IP
+ DNS 配置或本地主机条目必须有效
+ 网络路由必须正确配置
+ SAP HANA 客户端库必须已安装并处于最新状态

确保 SAP HANA 数据库的连接数据引用了与重叠 IP 关联的主机名。有关更多信息，请参阅 SAP 文档：[Setting Connectivity Data for the SAP HANA Database](https://help.sap.com/docs/SLTOOLSET/39c32e9783f6439e871410848f61544c/b7ed2d55b0a7f857e10000000a441470.html?version=CURRENT_VERSION_SWPM20) 

使用 R3trans 实用程序测试数据库连接：

```
sidadm> R3trans -d
```

查看其他需要高可用性的 SAP HANA 连接。虽然应用程序连接应使用重叠 IP，但管理工具（SAP HANA Studio、hdbsql 命令、监控工具）需要直接连接到单独 SAP HANA 实例。

# 操作
<a name="sap-hana-pacemaker-rhel-operations"></a>

**Topics**
+ [查看集群状态](sap-hana-pacemaker-rhel-ops-cluster-state.md)
+ [执行计划内维护](sap-hana-pacemaker-rhel-ops-planned-maint.md)
+ [故障后分析和重置](sap-hana-pacemaker-rhel-ops-post-failure.md)
+ [提醒和监控](sap-hana-pacemaker-rhel-ops-alert-monitor.md)

# 查看集群状态
<a name="sap-hana-pacemaker-rhel-ops-cluster-state"></a>

**Topics**
+ [基于操作系统](#_operating_system_based)

## 基于操作系统
<a name="_operating_system_based"></a>

有多个操作系统命令可以通过根用户身份运行，也可以通过具有适当权限的用户身份运行。这些命令让您能够大致了解集群及其服务的状态。

```
# pcs status --full
```

注意：如果您不需要查看节点属性，请省略 `--full` 以获得更简洁的输出。

示例输出：

```
Cluster name: hacluster
Cluster Summary:
  * Stack: corosync
  * Current DC: hanahost02 (version 2.1.2-4.el9_0.5-ada5c3b36e2) - partition with quorum
  * Last updated: Tue Jun  3 15:47:15 2025
  * Last change:  Tue Jun  3 15:47:12 2025 by hacluster via crmd on hanahost02
  * 2 nodes configured
  * 6 resource instances configured

Node List:
  * Online: [ hanahost01 hanahost02 ]

Full List of Resources:
  * rsc_fence_aws       (stonith:fence_aws):     Started hanahost01
  * rsc_ip_HDB_HDB00    (ocf:heartbeat:aws-vpc-move-ip):         Stopped
  * Clone Set: rsc_SAPHanaTopology_HDB_HDB00-clone [rsc_SAPHanaTopology_HDB_HDB00]:
    * Started: [ hanahost01 hanahost02 ]
  * Clone Set: rsc_SAPHana_HDB_HDB00-clone [rsc_SAPHana_HDB_HDB00] (promotable):
    * Promoted: [ hanahost02 ]
    * Unpromoted: [ hanahost01 ]

Node Attributes:
  * Node: hanahost01 (1):
    * hana_hdb_clone_state              : PROMOTED
    * hana_hdb_op_mode                  : logreplay
    * hana_hdb_remoteHost               : hanavirt02
    * hana_hdb_roles                    : 4:P:master1:master:worker:master
    * hana_hdb_site                     : siteA
    * hana_hdb_srah                     : -
    * hana_hdb_srmode                   : syncmem
    * hana_hdb_sync_state               : PRIM
    * hana_hdb_version                  : 2.00.073.00
    * hana_hdb_vhost                    : hanavirt01
    * lpa_hdb_lpt                       : 1755493611
    * master-rsc_SAPHana_HDB_HDB00      : 150
  * Node: hanahost02 (2):
    * hana_hdb_clone_state              : DEMOTED
    * hana_hdb_op_mode                  : logreplay
    * hana_hdb_remoteHost               : hanavirt01
    * hana_hdb_roles                    : 4:S:master1:master:worker:master
    * hana_hdb_site                     : siteB
    * hana_hdb_srah                     : -
    * hana_hdb_srmode                   : syncmem
    * hana_hdb_sync_state               : SOK
    * hana_hdb_version                  : 2.00.073.00
    * hana_hdb_vhost                    : hanavirt02
    * lpa_hdb_lpt                       : 30
    * master-rsc_SAPHana_HDB_HDB00      : 100

Migration Summary:

Tickets:

PCSD Status:
  hanahost01: Online
  hanahost02: Online

Daemon Status:
  corosync: active/disabled
  pacemaker: active/disabled
  pcsd: active/enabled
```

下表提供了有用命令的列表。


| 命令 | 说明 | 
| --- | --- | 
|   `crm_mon`   |  在控制台上显示集群状态，并在进行更新时显示进展  | 
|   `crm_mon -1`   |  在控制台上仅显示一次集群状态，然后退出  | 
|   `crm_mon -Arnf`   |  -A 显示节点属性 -n 按节点对资源分组 -r 显示不活动的资源 -f 显示资源失败计数  | 
|   `crm help`   |  查看更多选项  | 
|   `crm_mon --help-all`   |  查看更多选项  | 

# 执行计划内维护
<a name="sap-hana-pacemaker-rhel-ops-planned-maint"></a>

在集群环境中对 SAP HANA 系统执行维护时，务必要了解集群如何与 SAP HANA 系统复制进行交互。计划内维护活动应谨慎进行，以防止不必要的失效转移或集群干预。

在对节点、资源和集群执行计划内维护时，有不同的选项可用。

**Topics**
+ [维护模式](#_maintenance_mode)
+ [将节点置于备用模式](#_placing_a_node_in_standby_mode)
+ [标记资源](#_moving_a_resource)

## 维护模式
<a name="_maintenance_mode"></a>

如果要对配置进行任何更改或控制集群中的资源和节点，请使用维护模式。在大多数情况下，这是执行管理任务的最安全的选项。

**Example**  
使用以下命令启用维护模式。  

```
# pcs property maintenance-mode=true
```
使用以下命令关闭维护模式。  

```
# pcs property maintenance-mode=false
```

## 将节点置于备用模式
<a name="_placing_a_node_in_standby_mode"></a>

要在避免系统完全中断的情况下对集群执行维护，对于移动活动的资源，建议的方法是将要从集群中移除的节点置于备用模式。

```
# pcs node standby <hostname>
```

集群将清洁地重新放置资源，您可以执行活动，包括重新启动处于备用模式的节点。维护活动完成后，您可以使用以下命令重新引入节点。

```
# pcs node unstandby <hostname>
```

## 标记资源
<a name="_moving_a_resource"></a>

移动单独的资源时，请务必了解资源的依赖关系和约束。以下命令演示如何强制 HANA 接管。请务必查看集群状态并在接管之后验证任何临时位置限制。

例如：

```
# pcs resource move rsc_SAPHana_HDB_HDB00-clone hanahost02
Location constraint to move resource 'rsc_SAPHana_HDB_HDB00-clone' has been created
Waiting for the cluster to apply configuration changes...
Location constraint created to move resource 'rsc_SAPHana_HDB_HDB00-clone' has been removed
Waiting for the cluster to apply configuration changes...
resource 'rsc_SAPHana_HDB_HDB00-clone' is promoted on node 'hanahost02'; unpromoted on node 'hanahost01'
```

注意：确切的资源名称将因您的 SAP HANA 系统 ID 和实例编号而异。请相应调整命令。

# 故障后分析和重置
<a name="sap-hana-pacemaker-rhel-ops-post-failure"></a>

每次出现故障后都必须进行检查，来了解故障的根源以及集群的反应。在大多数情况下，集群可以防止应用程序中断。但是，通常需要手动操作才能将集群重置为保护状态，以防后续出现任何故障。

**Topics**
+ [查看日志](#_checking_the_logs)
+ [清理 pcs 状态](#_cleanup_pcs_status)
+ [重启出现故障的节点或 Pacemaker](#_restart_failed_nodes_or_pacemaker)
+ [深入分析](#_further_analysis)

## 查看日志
<a name="_checking_the_logs"></a>
+ 要对集群问题进行故障排除，请使用 journalctl 检查 Pacemaker 和 corosync 日志：

  ```
  # journalctl -u pacemaker -u corosync --since "1 hour ago"
  ```
  + 使用 `--since` 指定时间段（例如，“2 小时前”、“今天”）
  + 添加 `-f` 以实时跟踪日志
  + 与 grep 结合使用可执行特定搜索
+ 系统消息和资源代理活动可在 `/var/log/messages` 中找到。
+ 有关 HANA 特定的问题，请查看 HANA 跟踪目录。以 <sid>adm 身份登录时，可以使用“cdtrace”进行访问。另请查阅 HANA 跟踪目录中的 DB\$1<tenantdb> 目录。

## 清理 pcs 状态
<a name="_cleanup_pcs_status"></a>

如果使用 `pcs status` 命令报告了失败的操作，并且已经对其进行了调查，您可以使用以下命令清除报告。

```
# pcs resource cleanup <resource> <hostname>
```

## 重启出现故障的节点或 Pacemaker
<a name="_restart_failed_nodes_or_pacemaker"></a>

建议不要自动重启出现故障（或已隔离）的节点。这样操作员才有机会调查故障，并确保集群不会对资源状态做出假设。

您需要根据自己的方法重启实例或 Pacemaker 服务。

## 深入分析
<a name="_further_analysis"></a>

对于集群特定的问题，请使用 `pcs cluster report`，对所有节点上的集群组件生成针对性分析：

```
# pcs cluster report --from="YYYY-MM-DD HH:MM:SS" --to="YYYY-MM-DD HH:MM:SS" /tmp/cluster-report
```

**使用 pcs 集群报告**
+ 指定包含事件的时间范围
+ 该报告包括所有节点的日志和配置
+ 查看生成的 tarball 来了解集群事件、资源操作和配置更改

# 提醒和监控
<a name="sap-hana-pacemaker-rhel-ops-alert-monitor"></a>

本节涵盖以下主题。

**Topics**
+ [使用 Amazon CloudWatch 应用程序见解](#_using_amazon_cloudwatch_application_insights)
+ [使用集群警报代理](#_using_the_cluster_alert_agents)

## 使用 Amazon CloudWatch 应用程序见解
<a name="_using_amazon_cloudwatch_application_insights"></a>

为了监控和查看集群状态及操作，Application Insights 提供了多个指标用于监控入队复制状态、集群指标以及 SAP 和高可用性检查。EFS 和 CPU 监控等其他指标也有助于进行根本原因分析。

有关更多信息，请参阅[亚马逊 CloudWatch 应用程序见解入门和亚马逊](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/appinsights-getting-started.html)[上的 SAP HANA 高可用性 EC2](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/component-configuration-examples-hana-ha.html)。

## 使用集群警报代理
<a name="_using_the_cluster_alert_agents"></a>

在集群配置中，您可以调用外部程序（警报代理）来处理警报。这是一条*推送*通知。它通过环境变量传递有关事件的信息。

然后，您可以配置代理来发送电子邮件、记录到文件、更新监控系统等。例如，以下脚本可用于访问 Amazon SNS。

```
#!/bin/sh

# alert_sns.sh
# modified from /usr/share/pacemaker/alerts/alert_smtp.sh.sample

##############################################################################
# SETUP
# * Create an SNS Topic and subscribe email or chatbot
# * Note down the ARN for the SNS topic
# * Give the IAM Role attached to both Instances permission to publish to the SNS Topic
# * Ensure the aws cli is installed
# * Copy this file to /usr/share/pacemaker/alerts/alert_sns.sh or other location on BOTH nodes
# * Ensure the permissions allow for hacluster and root to execute the script
# * Run the following as root (modify file location if necessary and replace SNS ARN):
#
# SLES:
# crm configure alert aws_sns_alert /usr/share/pacemaker/alerts/alert_sns.sh meta timeout=30s timestamp-format="%Y-%m-%d_%H:%M:%S" to <{ arn:aws:sns:region:account-id:myPacemakerAlerts  }>
#
# RHEL:
# pcs alert create id=aws_sns_alert path=/usr/share/pacemaker/alerts/alert_sns.sh meta timeout=30s timestamp-format="%Y-%m-%d_%H:%M:%S"
# pcs alert recipient add aws_sns_alert value=arn:aws:sns:region:account-id:myPacemakerAlerts
##############################################################################

# Additional information to send with the alerts
node_name=`uname -n`
sns_body=`env | grep CRM_alert_`

# Required for SNS
TOKEN=$(/usr/bin/curl --noproxy '*' -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")

# Get metadata
REGION=$(/usr/bin/curl --noproxy '*' -w "\n" -s -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/dynamic/instance-identity/document | grep region | awk -F\" '{print $4}')

sns_subscription_arn=${CRM_alert_recipient}

# Format depending on alert type
case ${CRM_alert_kind} in
   node)
     sns_subject="${CRM_alert_timestamp} ${cluster_name}: Node '${CRM_alert_node}' is now '${CRM_alert_desc}'"
   ;;
   fencing)
     sns_subject="${CRM_alert_timestamp} ${cluster_name}: Fencing ${CRM_alert_desc}"
   ;;
   resource)
     if [ ${CRM_alert_interval} = "0" ]; then
         CRM_alert_interval=""
     else
         CRM_alert_interval=" (${CRM_alert_interval})"
     fi
     if [ ${CRM_alert_target_rc} = "0" ]; then
         CRM_alert_target_rc=""
     else
         CRM_alert_target_rc=" (target: ${CRM_alert_target_rc})"
     fi
     case ${CRM_alert_desc} in
         Cancelled)
           ;;
         *)
           sns_subject="${CRM_alert_timestamp}: Resource operation '${CRM_alert_task}${CRM_alert_interval}' for '${CRM_alert_rsc}' on '${CRM_alert_node}': ${CRM_alert_desc}${CRM_alert_target_rc}"
           ;;
     esac
     ;;
   attribute)
     sns_subject="${CRM_alert_timestamp}: The '${CRM_alert_attribute_name}' attribute of the '${CRM_alert_node}' node was updated in '${CRM_alert_attribute_value}'"
     ;;
   *)
     sns_subject="${CRM_alert_timestamp}: Unhandled $CRM_alert_kind alert"
     ;;
esac

# Use this information to send the email
aws sns publish --topic-arn "${sns_subscription_arn}" --subject "${sns_subject}" --message "${sns_body}" --region ${REGION}
```

# 测试
<a name="sap-hana-pacemaker-rhel-testing"></a>

我们建议至少每年定期安排一次故障场景恢复测试，并在可能会影响到运营的操作系统或 HANA 升级过程中进行故障场景恢复测试。有关定期测试最佳实践的更多详细信息，请参阅 SAP Lens：[最佳实践 4.3 – 定期测试业务连续性计划和故障恢复](https://docs.aws.amazon.com/wellarchitected/latest/sap-lens/best-practice-4-3.html)。

此处描述的测试模拟了故障场景。这可以帮助您了解集群的行为和操作需求。

除了检查集群资源的状态之外，还要确保您尝试保护的服务处于所需状态。客户端连接是否仍可用？ 定义恢复时间，确保其符合业务目标。在运行手册中记录恢复操作。

**Topics**
+ [测试 1：使用 `HDB kill-9` 在主节点上停止 HANA](#_test_1_stop_hana_on_the_primary_node_using_hdb_kill_9)
+ [测试 2：模拟硬件故障](#_test_2_simulate_a_hardware_failure)
+ [测试 3：模拟内核崩溃](#_test_3_simulate_a_kernel_panic)
+ [测试 4：模拟网络故障](#_test_4_simulate_a_network_failure)
+ [测试 5：意外关机](#_test_5_accidental_shutdown)
+ [其他测试](#_other_tests)

## 测试 1：使用 `HDB kill-9` 在主节点上停止 HANA
<a name="_test_1_stop_hana_on_the_primary_node_using_hdb_kill_9"></a>

 **原因**：测试集群对立即终止 HANA 进程的响应。这可以验证集群能否检测和响应关键数据库进程故障，并确保适当的失效转移机制正常运行。

 **模拟故障**：在 `hanahost01` 上，以 `hdbadm` 身份执行以下命令：

```
hdbadm> HDB kill-9
```

 **预期行为**：集群检测到 HANA 进程故障，并触发立即失效转移到辅助节点。辅助节点提升为主节点，接管工作负载而不尝试本地恢复。

 **恢复操作**：

1. 使用 `crm_mon -r` 监控集群状态 

1. 使用 `hdbnsutil -sr_state` 验证 HANA 系统复制状态 

1. 如果 AUTOMATED\$1REGISTER 为“false”，请手动重新注册以前的主节点：
   + 有关如何注册辅助节点的更多详细信息，请参阅 [HSR 设置](sap-hana-pacemaker-rhel-hana-setup-hsr.md)：

     ```
     hdbnsutil -sr_register --name=<site_name> --remoteHost=<primary_host> --remoteInstance=<instance_number> --mode=sync --operationMode=logreplay
     ```

## 测试 2：模拟硬件故障
<a name="_test_2_simulate_a_hardware_failure"></a>

 **原因**：测试集群对整个节点故障的响应，验证在节点完全无响应时的隔离行为和资源失效转移是否正确。

 **注意**：使用双重强制选项（`--force --force`）以在测试环境中尽可能接近地模拟硬件故障。此命令绕过系统管理器，在不进行任何清理的情况下强制立即关机，类似于断电或硬件故障。但需要注意，这仍然是模拟操作，一些操作系统级别的清理可能仍会进行，而这些清理在真正的硬件故障或断电情况下是不会发生的。

 **模拟故障**：在 `hanahost01` 上，以 `root` 身份执行以下命令：

```
# poweroff --force --force
```

 **预期行为**：Corosync 检测到节点通信中断，正常运行的节点上的 Pacemaker 通过隔离代理启动隔离，然后将辅助 HANA 实例提升为主实例。应用程序连接应自动重新连接到新的主实例。

 **恢复操作**：

1. 启动已关闭的 Amazon EC2 实例

1. 使用 `crm_mon -r` 验证集群状态 

1. 使用 `pcs stonith history cleanup` 清理 STONITH 历史记录 

1. 使用 `hdbnsutil -sr_state` 检查 HANA 复制状态 

1. 如果 AUTOMATED\$1REGISTER 为“false”，请手动注册为辅助实例

1. 验证应用程序是否连接到新的主实例

## 测试 3：模拟内核崩溃
<a name="_test_3_simulate_a_kernel_panic"></a>

 **原因**：测试集群对灾难性内核故障的响应，确保节点系统出现完全崩溃时，恢复机制能够正常运行。

 **注意**：要模拟系统崩溃，必须首先确保 `/proc/sys/kernel/sysrq` 设置为 1。

 **模拟故障**：在 `hanahost01` 上，以 `root` 身份执行以下命令：

```
# echo 'c' > /proc/sysrq-trigger
```

 **预期行为**：集群通过检测信号丢失来发现节点故障。正常运行的节点通过隔离代理启动隔离，然后将辅助 HANA 实例提升为主实例。

 **恢复操作**：

1. 内核崩溃后重启节点

1. 使用 `crm_mon -r` 验证集群状态 

1. 使用 `pcs stonith history cleanup` 清理 STONITH 历史记录 

1. 使用 `hdbnsutil -sr_state` 检查 HANA 复制状态 

1. 如果 AUTOMATED\$1REGISTER 为“false”，请手动注册为辅助实例

1. 验证所有集群资源是否清洁

## 测试 4：模拟网络故障
<a name="_test_4_simulate_a_network_failure"></a>

 **原因**：测试网络分区场景中的集群行为，确保脑裂防范机制发挥作用，并在节点无法通信时正确进行隔离。

 **注意**:
+ 必须安装 Iptables
+ 由于有辅助环路，因此在此命令中使用子网
+ 检查是否存在任何现有的 iptables 规则，因为 iptables -F 将刷新所有规则
+ 如果您看到两个节点在隔离竞赛中都未能存活，请查看 pcmk\$1delay 和 priority 参数

 **模拟故障**：在任一节点上以根用户身份执行以下命令：

```
# iptables -A INPUT -s <CIDR_of_other_subnet> -j DROP; iptables -A OUTPUT -d <CIDR_of_other_subnet> -j DROP
```

 **预期行为**：集群检测到网络故障并隔离其中一个节点，以避免出现脑裂情况。正常运行的节点将接管集群资源的控制。

 **恢复操作**：

1. 如果在正常运行的节点上模拟了故障，则执行 `iptables -F` 以清除网络故障

1. 启动 EC2 节点和 pacemaker 服务

1. 验证集群状态和资源放置

## 测试 5：意外关机
<a name="_test_5_accidental_shutdown"></a>

 **原因**：测试系统能否正确处理停机场景，确保集群在计划内和计划外停机期间都能正确地管理资源。

 **注意**:
+ 避免在没有集群感知能力的情况下停机
+ 建议使用 systemd 来确保行为可预测
+ 确保正确处理了资源依赖关系

 **模拟故障**：登录 AWS 管理控制台，停止实例或发布关机命令。

 **预期行为**：已关闭的节点出现故障。集群将在故障节点上运行的资源移至正常运行的节点。如果 systemd 和资源依赖关系配置不正确，则集群可能会检测到集群服务未能干净地停止并隔离关闭的实例。

 **恢复操作**：

1. 启动 EC2 节点和 pacemaker 服务

1. 验证集群状态和资源放置

1. 确保根据约束条件正确分配资源

## 其他测试
<a name="_other_tests"></a>

根据您的环境和项目要求，请考虑执行以下额外的测试：
+  **辅助节点测试** 
  + 在辅助节点上执行上述测试，以确保辅助节点的中断不会影响主节点的服务可用性
  + 使用相反的角色对节点执行上述测试，以验证任一配置中的全部运营能力
+  **横向扩展测试**（适用于横向扩展部署）
  + 测试协调器和 Worker 节点上的故障
  + 测试多个 Worker 节点的并发故障以验证失效转移顺序
  + 测试阻止了对存储的访问权限（包括 /hana/shared）时的故障
+  **组件级测试** 
  + 测试索引服务器故障并测量恢复时间
  + 验证快速启动选项行为和钩子脚本执行
+  **集群配置测试** 
  + 使用 `pcs stonith fence <node_name>` 直接执行隔离操作 
  + 资源移动和约束条件验证

请记住记录所有测试结果、恢复时间和任何意外行为，以便供将来参考和用于更新运行手册。