

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

# SAP HANA 在使用 Pacemaker 软件的 SUSE Enterprise Linux 上的高可用性
<a name="sap-hana-on-aws-sles-pacemaker"></a>

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

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

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

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

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

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

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

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

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

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

要在 SUSE 上部署 SAP HANA，SAP 和 SUSE 建议使用 SUSE Linux Enterprise Server for SAP Applications（SLES for SAP）。SLES for SAP 提供了额外的优势，包括：
+ 扩展服务包叠加支持（ESPOS）
+ 适用于 SAP 应用程序的配置和调整软件包
+ 高可用性扩展（HAE）

要了解更多信息，请参阅 [SUSE Linux Enterprise Server for SAP Applications](https://www.suse.com/products/sles-for-sap/)。

适用于 SAP 的 SLES 在AWS Marketplace 上线，有：
+ 每小时订阅
+ 年度订阅
+ 自带订阅（BYOS）模式

## 进行设置所需的访问权限
<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-sles-references"></a>

## SAP 和 SUSE 参考资料
<a name="_sap_and_suse_references"></a>

除本指南外，还可以参考以下参考资料来获取更多详细信息：
+ SUSE 文档：适用于 [SAP 的 SLES-适用于云的 SAP HANA 高可用性集群AWS](https://documentation.suse.com/en-us/sbp/sap-15/html/SLES4SAP-hana-sr-guide-perfopt-15-aws/index.html) 
+ SUSE 文档：[An overview of supported High Availability Solutions by SLES for SAP applications](https://documentation.suse.com/en-us/sles-sap/sap-ha-support/html/sap-ha-support/index.html) 
+ SAP 注意：[1656099-SAP 应用程序开启AWS：支持的产品和 DB/OS 亚马逊](https://me.sap.com/notes/1656099)产品 EC2 
+ SAP Note：[1984787 - SUSE Linux Enterprise Server 12: Installation Notes](https://me.sap.com/notes/1984787) 
+ SAP Note：[2205917 - SAP HANA DB: Recommended OS settings for SLES 12 / SLES for SAP Applications 12](https://me.sap.com/notes/2205917) 
+ SAP Note：[2578899 - SUSE Linux Enterprise Server 15: Installation Notes](https://me.sap.com/notes/2578899) 
+ SAP Note：[2684254 - SAP HANA DB: Recommended OS settings for SLES 15 / SLES for SAP Applications 15](https://me.sap.com/notes/2684254) 
+ SAP Note：[1275776 - Linux: Preparing SLES for SAP environments](https://me.sap.com/notes/1275776) 

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

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

AWS与 SUSE 合作，支持在上AWS部署 SAP HANA。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，Out-angi SAPHANAScale  | 
|  SAP HANA 横向扩展辅助系统只读已启用  |  供应商提供文档和支持  |  遵循 SAP 文档  |  | 
|  SAP HANA 横向扩展多层复制  |  供应商提供文档和支持  |  遵循 SAP 文档  |  | 
|  SAP HANA 横向扩展多目标复制  |  供应商提供文档和支持  |  遵循 SAP 文档  |  | 

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

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

本文档介绍了使用 SAPHana SR-angi 的新实现。有关从现有 SAPHana SR 或 SR ScaleOut 安装到 SAPHana S SAPHana R-angi 的迁移，请参阅 SUSE 文档以了解详细的升级过程。

# 概念
<a name="sap-hana-pacemaker-sles-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-sles"></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-sles"></a>

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

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

SUSE 支持多种屏蔽代理，包括推荐用于 Amazon EC2 实例（外部/ec2）的屏蔽代理。

# 自动部署
<a name="sap-hana-pacemaker-sles-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-sles-testing.md)。

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

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

**Topics**
+ [全局AWS参数](#global_shared_aws_parameters)
+ [Amazon EC2 实例参数](#_amazon_ec2_instance_parameters)
+ [SAP 和 Pacemaker 资源参数](#_sap_and_pacemaker_resource_parameters)
+ [SLES 集群参数](#_sles_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-sles-concepts.md#overlay-ip-sles)。

## SLES 集群参数
<a name="_sles_cluster_parameters"></a>


| Name | 参数 | 示例 | 
| --- | --- | --- | 
|  集群用户  |   `<cluster_user>`   |   `hacluster`   | 
|  集群密码  |   `<cluster_password>`   |  | 
|  集群名称  |   `<cluster_name>`   |   `myCluster`   | 
|  集群标签  |   `<cluster_tag>`   |   `pacemaker`   | 
|  AWS CLI 集群配置文件  |   `<cli_cluster_profile>`   |   `cluster`   | 
+ 集群用户 – 安装集群软件包将创建用户 hacluster，为该账户设置密码以确保集群可以执行不需要根访问权限的任务。
+ 集群标签 —AWS Stonith 代理使用此标签来确保它能够识别要屏蔽的正确亚马逊 EC2 实例。标签的名称是可自定义的，并且对于此集群对，在您的AWS账户中应该是唯一的。
+ AWS CLI 集群配置文件 — 可以定义一个命名配置文件，用于集群 API 调用，这与 CLI 的其他用途不同。每个配置文件可以指定不同的凭证，也可以指定不同的AWS区域和输出格式。

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

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

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


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

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

# AWS 基础设施设置
<a name="sap-hana-pacemaker-sles-infra-setup"></a>

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

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

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

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

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

有关更多信息，请参阅 [Amazon 的 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>

SLES STONITH 资源代理（external/ec2）需要权限才能启动和停止集群的两个节点。创建策略，如以下示例所示。将此策略附加到分配给集群中两个 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>

SLES Overlay 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 

**最低版本要求**  
默认情况下，随附的最新版本的 aws-vpc-move-ip代理 SLES15 SP3 支持共享 VPC 设置。以下是支持共享 VPC 设置所需的最低版本：
+ SLES 12-resource-agents-4.3.018.a7fb5035 SP5 -3.79.1.x86\$164
+ SLES 15-资源代理-4.4.0\$1git57.70549516 SP2 -3.30.1.x86\$164
+ SLES 15-资源代理-4.8.0\$1git30.d0077df0 SP3 -8.5.1

**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-sles"></a>

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

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


| 来源 | 协议 | 端口范围 | 描述 | 
| --- | --- | --- | --- | 
|  安全组 ID（其自己的资源 ID）  |  UDP  |  5405  |  允许集群资源之间的 UDP 流量以进行 corosync 通信  | 
|  用于管理的堡垒主机安全组或 CIDR 范围  |  TCP  |  7630  |  （可选）供 SLES Hawk2 接口用来通过 Web 界面进行监控和管理。有关更多详细信息，请参阅 SUSE 文档[使用 Hawk2 配置和管理群集资源](https://documentation.suse.com/sle-ha/15-SP6/html/SLE-HA-all/cha-ha-manage-resources.html#sec-conf-hawk2-manage-edit)。  | 
+ 请注意此处使用 `UDP` 协议。
+ 如果您运行的是本地防火墙（例如 iptables），请确保允许在两个 Amazon EC2 实例之间通过上述端口进行通信。

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

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

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

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

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

1. 打开亚马逊 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-sles-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-sles-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-sles-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)
+ [创建亚马逊 EC2 STONITH 代理使用的亚马逊 EC2 资源标签](#create-cluster-tags)

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

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

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

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

1. 选择集群节点之一。

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

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

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

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

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

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

1. 打开亚马逊 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. 打开亚马逊 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. 打开亚马逊 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. 打开亚马逊 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"
    ]
]
```

## 创建亚马逊 EC2 STONITH 代理使用的亚马逊 EC2 资源标签
<a name="create-cluster-tags"></a>

Amazon EC2 STONITH 代理使用 AWS 资源标签来识别亚马逊 EC2 实例。通过 AWS 控制台或 AWS CLI 为主 Amazon EC2 实例和辅助 Amazon 实例创建标签。有关更多信息，请参阅[使用标签](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html)。

使用相同的标签键和本地主机名，该名称通过跨实例使用命令 hostname 返回。例如，使用全局 AWS 参数中定义的值的配置需要下表所示的标签。


| 亚马逊 EC2 | 键示例 | 值示例 | 
| --- | --- | --- | 
|  <instance\$1id>  |  <cluster\$1tag>  |  <hostname>  | 
|  实例 1  |  pacemaker  |  hanahost1  | 
|  实例 2  |  pacemaker  |  hanahost2  | 

您可以在本地运行以下命令来验证标签值以及用于描述标签的 IAM 权限。对集群中的所有实例运行此命令。

```
$ aws ec2 describe-tags --filters "Name=resource-id,Values=<instance_id>" "Name=key,Values=<cluster_tag>" --region=<region> --output=text | cut -f5
```

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

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

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

**Topics**
+ [根访问](#_root_access)
+ [安装缺失的操作系统软件包](#packages)
+ [更新和检查操作系统版本](#_update_and_check_operating_system_versions)
+ [系统日志记录](#_system_logging)
+ [时间同步服务](#_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 设置需要以下软件包及其依赖项。根据您的基准映像（例如，SLES for SAP），这些软件包可能已经安装。


| 程序包 | 说明 | 类别 | 必需 | 配置模式 | 
| --- | --- | --- | --- | --- | 
|  chrony  |  时间同步  |  系统支持  |  强制性  |  全部  | 
|  rsyslog  |  系统日志记录  |  系统支持  |  强制性  |  全部  | 
|  pacemaker  |  集群资源管理器  |  核心集群  |  强制性  |  全部  | 
|  corosync  |  集群通信引擎  |  核心集群  |  强制性  |  全部  | 
|  cluster-glue  |  集群基础设施  |  核心集群  |  强制性  |  全部  | 
|  crmsh  |  集群管理 CLI  |  核心集群  |  强制性  |  全部  | 
|  resource-agents  |  基础资源代理  |  核心集群  |  强制性  |  全部  | 
|  fence-agents  |  隔离功能  |  核心集群  |  强制性  |  全部  | 
|  SAPHanasr-angi  |  新一代 HANA 系统复制代理  |  SAP HANA HA  |  强制性\$1  |  SAPHANAScaleup-sapangi，out-sapangi SAPHANAScale  | 
|  SAPHanaSR  |  上一代纵向扩展 SR 代理  |  SAP HANA HA  |  强制性\$1  |  SAPHANAScale向上经典  | 
|  SAPHanasr-doc  |  纵向扩展配置的文档  |  SAP HANA HA  |  强制性\$1  |  SAPHANAScale向上经典  | 
|  SAPHanaSR-ScaleOut  |  上一代横向扩展 SR 代理  |  SAP HANA HA  |  强制性\$1  |  SAPHANAScale超越经典  | 
|  SAPHanaSR ScaleOut--doc  |  横向扩展配置的文档  |  SAP HANA HA  |  强制性\$1  |  SAPHANAScale超越经典  | 
|  supportutils  |  信息收集  |  支持工具  |  强制性  |  全部  | 
|  sysstat  |  性能监控工具  |  支持工具  |  强制性  |  全部  | 
|  zypper-lifecycle-plugin  |  软件生命周期管理  |  支持工具  |  推荐  |  全部  | 
|  supportutils-plugin-ha-sap  |  HA/SAP 支持服务数据收集  |  支持工具  |  推荐  |  全部  | 
|  supportutils-plugin-suse-public-云  |  云支持服务数据收集  |  支持工具  |  推荐  |  全部  | 
|  dstat  |  系统资源统计数据  |  监控  |  推荐  |  全部  | 
|  iotop  |  I/O 监控  |  监控  |  推荐  |  全部  | 

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

```
#!/bin/bash
# Mandatory core packages for SAP HANA HA on AWS
mandatory_packages="corosync pacemaker cluster-glue crmsh rsyslog chrony resource-agents fence-agents "

# HANA SR packages - New Generation
hanaSR_angi="SAPHanaSR-angi"  # New generation package for both scale-up and scale-out

# HANA SR packages - Previous Generation (still in common use)
hanaSR_scaleup="SAPHanaSR SAPHanaSR-doc"  # For scale-up deployments
hanaSR_scaleout="SAPHanaSR-ScaleOut SAPHanaSR-ScaleOut-doc"  # For scale-out deployments

# Recommended monitoring and support packages
support_packages="supportutils supportutils-plugin-ha-sap supportutils-plugin-suse-public-cloud sysstat dstat iotop zypper-lifecycle-plugin"

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

missingpackages=""

for package in ${packages}; do
    echo "Checking if ${package} is installed..."
    if ! rpm -q ${package} --quiet; 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
        zypper install -y $missingpackages
    fi
fi
```

如果某个软件包未安装，并且您无法使用 zypper 进行安装，则可能是因为在您选择的映像中，SUSE Linux Enterprise High Availability 扩展不可用作存储库。您可以使用以下命令验证扩展的可用性：

```
$ sudo zypper repos
```

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

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

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

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

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

```
$ sudo zypper 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
```

## 时间同步服务
<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-sles-deployment-cluster"></a>

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

# SAP HANA 设置和 HSR
<a name="sap-hana-pacemaker-sles-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-sles-hana-control"></a>

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

**Topics**
+ [将 sidadm 添加到 haclient 组](#_add_sidadm_to_haclient_group)
+ [修改 HANA 的 SAP 配置文件](#_modify_sap_profile_for_hana)
+ [配置 SAPHana SR 集群挂钩以优化集群响应](#hook_saphanasr)
+ [配置 susTkOver 集群挂钩以确保集群意识到手动接管](#hook_sustkover)
+ [（可选）配置 susChkSrv 群集挂钩（快死索引服务器）](#hook_suschksrv)
+ [（可选）配置快速启动选项](#_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 SAPHanaSR
   ```

   有关更多详细信息，请查看 man 页面。

   ```
   # man SAPHanaSR
   # man SAPHanaSR.py
   ```

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

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

   ```
   # rpm -qa SAPHanaSR-angi
   ```

   有关更多详细信息，请查看 man 页面

   ```
   # man SAPHanaSR-angi
   # man SAPHanaSR.py
   ```

------

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

   默认情况下软件包安装在 `/usr/share/SAPHanaSR-angi` 或 `/usr/share/SAPHanaSR` 中。我们建议使用默认位置，但您可以选择将其复制到自定义目录，例如 `/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
   execution_order = 1
   
   [trace]
   ha_dr_saphanasr = info
   ```

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

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

   ```
   [ha_dr_provider_sushanasr]
   provider = susHanaSR
   path = /usr/share/SAPHanaSR-angi
   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
      <sid>adm 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 文件

## 配置 susTkOver 集群挂钩以确保集群意识到手动接管
<a name="hook_sustkover"></a>

susTkOver如果 SAP HANA 多状态资源（由 SAPHana 或 SAPHana控制器管理）处于活动状态，.py 可防止手动接管 HANA 主资源，除非集群设置为维护模式或 Linux 集群已停止。

有关更多详细信息，请参阅以下资源：

```
# man susTkOver.py
```

在用于上述钩子的步骤之外，还可以在每个节点上的 global.ini 中添加一个额外条目。必须重新启动 Hana：

```
[ha_dr_provider_susTkOver]
provider = susTkOver
path = /usr/share/SAPHanaSR
execution_order = 2
sustkover_timeout = 30

[trace]
ha_dr_sustkover = info
```

## （可选）配置 susChkSrv 群集挂钩（快死索引服务器）
<a name="hook_suschksrv"></a>

在默认配置中，即使受集群保护，SAP HANA 的故障 IndexServer 也会导致进程在本地重新启动。停止进程和重新加载内存所花费的时间可能会影响恢复时间目标（RTO）和性能。SAP HANA 挂钩 suschksRV 提供了一个选项来触发操作，例如基于 HA/DR 提供者挂钩方法 srServiceState Changed () 的屏蔽或关闭，这反过来又会触发故障转移。

**重要**  
因此此钩子可以使用几个不同的选项来配置。建议您查阅 man 页面或 SUSE 文档，并评估适合您的设置的最佳选择。

```
# man susChksrv.py
```

使用生产规模的系统测试场景，以评测恢复运营的时间是否符合您对不能正常使用的时间要求。

有关更多信息，请参阅 SUSE 博客：[Emergency Braking for SAP HANA Dying Index Server](https://www.suse.com/c/emergency-braking-for-sap-hana-dying-indexserver/) 

## （可选）配置快速启动选项
<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>

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

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

**操作系统版本**
+ SUSE Linux Enterprise Server 15（systemd 版本 234）

**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>_<hana_sys_nr>.service`。例如，对于 SID HDB 和实例编号 00，服务名称是 `SAPHDB_00.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-sles-cluster-node-setup"></a>

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

**Topics**
+ [部署仲裁生成器节点（仅限横向扩展集群）](#_deploy_a_majority_maker_node_scale_out_clusters_only)
+ [更改 hacluster 密码](#_change_the_hacluster_password)
+ [设置无密码身份验证](#_setup_passwordless_authentication)
+ [配置集群节点](#_configure_the_cluster_nodes)
+ [修改创建的 Corosync 配置](#_modify_generated_corosync_configuration)
+ [验证 Corosync 配置](#_verify_corosync_configuration)
+ [配置集群服务](#_configure_cluster_services)
+ [验证集群状态](#_verify_cluster_status)

## 部署仲裁生成器节点（仅限横向扩展集群）
<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 密码
<a name="_change_the_hacluster_password"></a>

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

```
# passwd hacluster
```

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

SUSE 提供了多种报告工具，可以用来获取更全面、更易于使用的集群活动视图。其中许多工具都需要不输入密码来访问两个节点的权限。SUSE 建议由根用户执行此设置。

有关更多详细信息，请参阅 SUSE 文档 [Usage of hb\$1report for SLES HAE](https://www.suse.com/support/kb/doc/?id=000017501) 中的“Configuration to collect cluster report as root with root SSH access between cluster nodes”部分。

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

## 配置集群节点
<a name="_configure_the_cluster_nodes"></a>

在第一个节点上初始化集群框架，包括所有已知的集群节点。

在主节点上以根用户身份运行以下命令：

```
# crm cluster init -u -n <cluster_name> -N <hostname_1> -N <hostname_2>
```

 *使用[参数参考](sap-hana-pacemaker-sles-parameters.md)中的值的示例*：

```
hanahost01:~ # crm cluster init -u -n myCluster -N hanahost01 -N hanahost02
INFO: Detected "amazon-web-services" platform
INFO: Loading "default" profile from /etc/crm/profiles.yml
INFO: Configure Corosync (unicast):
  This will configure the cluster messaging layer.  You will need
  to specify a network address over which to communicate (default
  is eth0's network, but you can use the network address of any
  active interface).

Address for ring0 [10.2.10.1]
Port for ring0 [5405]

Do you wish to use SBD (y/n)? n
WARNING: Not configuring SBD - STONITH will be disabled.

Do you wish to configure a virtual IP address (y/n)? n

Do you want to configure QDevice (y/n)? n
INFO: Done (log saved to /var/log/crmsh/crmsh.log)

INFO: Adding node hanahost02 to cluster
INFO: Running command on hanahost02: crm cluster join -y -c root@hanahost01
...
INFO: Done (log saved to /var/log/crmsh/crmsh.log)
```

此命令：
+ 初始化名为 `myCluster` 的双节点集群 
+ 配置单播通信（-u）
+ 设置基本 corosync 配置
+ 自动将第二个节点加入集群
+ 我们`fence_aws`不会像在环境中用于 STONITH 那样配置 SBD。 AWS 
+ QDevice 配置是可能的，但本文档中没有介绍。请参阅 [SUSE Linux 企业高可用性文档- QDevice 和 QNet D](https://documentation.suse.com/en-us/sle-ha/15-SP7/html/SLE-HA-all/cha-ha-qdevice.html).
+ 对于具有两个以上节点的集群，可以在初始化期间使用额外的 `-N <hostname_3>` 参数添加其他节点，也可以稍后在每个新节点上使用以下命令添加：

  ```
  # crm cluster join -c <hostname_1>
  ```

## 修改创建的 Corosync 配置
<a name="_modify_generated_corosync_configuration"></a>

初始化集群后，需要对生成的 corosync 配置进行一些修改，以便针对云环境进行优化。

 **1。编辑 corosync 配置：**

```
# vi /etc/corosync/corosync.conf
```

生成的文件通常如以下所示：

```
# Please read the corosync.conf.5 manual page
totem {
        version: 2
        cluster_name: myCluster
        clear_node_high_bit: yes
        interface {
                ringnumber: 0
                mcastport: 5405
                ttl: 1
        }

        transport: udpu
        crypto_hash: sha1
        crypto_cipher: aes256
        token: 5000     # This needs to be changed
        join: 60
        max_messages: 20
        token_retransmits_before_loss_const: 10
}

logging {
        fileline: off
        to_stderr: no
        to_logfile: yes
        logfile: /var/log/cluster/corosync.log
        to_syslog: yes
        debug: off
        timestamp: on
        logger_subsys {
                subsys: QUORUM
                debug: off
        }

}

nodelist {
    node {
        ring0_addr: <node1_primary_ip>    # Only single ring configured
        nodeid: 1
    }
    node {
        ring0_addr: <node2_primary_ip>    # Only single ring configured
        nodeid: 2
    }
}

quorum {

        # Enable and configure quorum subsystem (default: off)
        # see also corosync.conf.5 and votequorum.5
        provider: corosync_votequorum
        expected_votes: 2
        two_node: 1
}

totem {
    version: 2
    token: 5000             # This needs to be changed
    transport: udpu
    interface {
        ringnumber: 0
        mcastport: 5405
    }
}
```

 **2。修改配置以添加第二个环路并优化设置：**

```
totem {
    token: 15000           # Changed from 5000 to 15000
    rrp_mode: passive      # Added for dual ring support
}

nodelist {
    node {
        ring0_addr: <node1_primary_ip>     # Primary network
        ring1_addr: <node1_secondary_ip>   # Added secondary network
        nodeid: 1
    }
    node {
        ring0_addr: <node2_primary_ip>     # Primary network
        ring1_addr: <node2_secondary_ip>   # Added secondary network
        nodeid: 2
    }
}
```

 *示例 IP 配置：*


| 网络接口 | 节点 1 | 节点 2 | 
| --- | --- | --- | 
|  ring0\$1addr  |  10.2.10.1  |  10.2.20.1  | 
|  ring1\$1addr  |  10.2.10.2  |  10.2.20.2  | 

 **3。将修改后的配置同步到所有节点：**

```
# csync2 -f /etc/corosync/corosync.conf
```

 **4。重启集群** 

```
# crm cluster restart --all
```

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

验证网络环路是否活动：

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

 *输出示例：*

```
Printing ring status.
Local node ID 1
RING ID 0
        id      = 10.2.10.1
        status  = ring 0 active with no faults
RING ID 1
        id      = 10.2.10.2
        status  = ring 1 active with no faults
```

两个网络环路都应报告“活动且没有故障”。如果缺少任何一个环路，请查看 corosync 配置并检查 `/etc/corosync/corosync.conf` 更改是否已同步到辅助节点。您可能需要手动执行此操作。如有必要，请重启集群。

## 配置集群服务
<a name="_configure_cluster_services"></a>

启用 Pacemaker，使其在重启后自动启动：

```
# systemctl enable pacemaker
```

启用 Pacemaker 还可以通过服务依赖关系来处理 corosync。集群将在重启后自动启动。对于故障排除场景，您可以改为选择在启动后手动启动服务。

## 验证集群状态
<a name="_verify_cluster_status"></a>

 **1。检查 Pacemaker 服务状态：**

```
# systemctl status pacemaker
```

 **2。验证集群状态：**

```
# crm_mon -1
```

 *输出示例：*

```
Cluster Summary:
  * Stack: corosync
  * Current DC: hanahost01 (version 2.1.5+20221208.a3f44794f) - partition with quorum
  * 2 nodes configured
  * 0 resource instances configured

Node List:
  * Online: [ hanahost01 hanahost02 ]

Active Resources:
  * No active resources
```

# 群集配置
<a name="sap-hana-pacemaker-sles-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)
+ [激活集群](#_activate_cluster)
+ [重置配置 – 可选](#_reset_configuration_optional)

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

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

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

```
# crm maintenance on
```

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

```
# crm status
```

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

```
# crm maintenance off
```

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

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

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

```
# crm configure property stonith-enabled="true"
# crm configure property stonith-timeout="600"
# crm configure property priority-fencing-delay="20"
# crm configure property stonith-action="off"
```
+ 建议**priority-fencing-delay**在网络分区事件期间保护 SAP HANA 节点。进行集群分区时，这种延迟会优先考虑托管更高优先级资源的节点，而 SAP HANA 主（已提升）实例将获得额外的优先级权重。这有助于确保主 HANA 节点在脑裂场景中存活下来。建议的 20 秒 priority-fencing-delay与 stonith 资源中配置的 pcmk\$1delay\$1max（10 秒）配合使用，在进行围栏之前，总共可能延迟长达 30 秒
+ 设置 **stonith-action="off"** 可确保被隔离的节点在手动调查之前一直处于关闭状态，从而防止可能受损的节点自动重新加入集群。在首选自动恢复时，“reboot”可以作为替代方案，但建议对 SAP HANA 集群使用“off”，以防止可能出现的数据损坏并启用根本原因分析

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

```
# crm configure show property
```

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

配置资源默认行为：

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

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

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

```
# crm configure show rsc_defaults
```

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

配置操作超时默认值：

```
# crm configure op_defaults timeout="600"
```
+ **op\$1defaults timeout** 可确保所有集群操作的默认超时为合适的 600 秒。各个资源可以用自己的超时值覆盖这些默认值。

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

```
# crm configure show op_defaults
```

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

建议在 SUSE 上 AWS 部署 AWS STONITH 资源代理，因为它利用 AWS API 通过停止 EC2 实例来安全地屏蔽出现故障或无法传染的节点。请参阅[Pacemaker – STONITH 隔离代理](sap-hana-pacemaker-sles-concepts.md#fencing-sles)。

使用资源代理 **`external/ec2`** 创建 STONITH 资源：

```
# crm configure primitive <stonith_resource_name> stonith:external/ec2 \
params tag="<cluster_tag>" profile="<cli_cluster_profile>" pcmk_delay_max="10" \
op start interval="0" timeout="180" \
op stop interval="0" timeout="180" \
op monitor interval="300" timeout="60"
```

详细信息：
+  **tag**-将实例与此集群配置关联的 EC2 实例标签密钥名称。此标签密钥在 AWS 账户中必须是唯一的，并且其值必须与实例主机名相匹配。[创建亚马逊 EC2 STONITH 代理使用的亚马逊 EC2 资源标签](sap-hana-pacemaker-sles-ec2-configuration.md#create-cluster-tags)有关 EC2 实例标记配置，请参阅。
+  **profil** e-（可选）用于 AP AWS I 身份验证的 CLI 配置文件名称。使用 `aws configure list-profiles` 验证配置文件是否存在。如果配置文件没有明确地进行配置，则将使用默认配置文件。
+  **pcmk\$1delay\$1max**：执行隔离操作前的随机延迟。与集群属性 `priority-fencing-delay` 配合使用以防止同时执行隔离。过去会设置为较高的值（45 秒），但现在由 `priority-fencing-delay` 处理主节点保护，较低的值（10 秒）便已足够。
+  *使用[参数参考](sap-hana-pacemaker-sles-parameters.md)中的值的示例*：

```
# crm configure primitive res_stonith_ec2 stonith:external/ec2 \
params tag="pacemaker" profile="cluster" \
pcmk_delay_max="10" \
op start interval="0" timeout="180" \
op stop interval="0" timeout="180" \
op monitor interval="300" timeout="60"
```

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

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

创建 IP 资源：

```
# crm configure primitive rsc_ip_<SID>_HDB<hana_sys_nr> ocf:heartbeat:aws-vpc-move-ip \
params 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-sles-concepts.md#overlay-ip-sles) 
+  **routing\$1tab** le-需要更新的 AWS 路由表 ID。要指定多个路由表，可以使用逗号分隔（例如，`routing_table=rtb-xxxxxroutetable1,rtb-xxxxxroutetable2`）。确保已按照[为叠加层添加 VPC 路由表条目 IPs](sap-hana-pacemaker-sles-infra-setup.md#rt-sles)中的说明创建初始条目 
+  **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**  

  ```
  # crm configure primitive rsc_ip_HDB_HDB00 ocf:heartbeat:aws-vpc-move-ip \
  params 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"
  ```

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

```
# crm configure primitive rsc_ip_<SID>_HDB<hana_sys_nr>_readenabled ocf:heartbeat:aws-vpc-move-ip \
params 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-sles-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，则需要另外两个参数。

```
# crm configure primitive rsc_ip_<SID>_HDB<hana_sys_nr> ocf:heartbeat:aws-vpc-move-ip \
params 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"
```

其他详细信息：
+  **查找类型 =** 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 数据库的高可用性。它分析 SAP HANA 拓扑并通过节点状态属性报告调查发现。 SAPHana 或 SAPHana控制器资源代理使用这些属性来控制 SAP HANA 数据库。 SAPHana拓扑启动并监视本地 saphostagent，利用 landscapeHostConfiguration .py、hdbnsutil 和 saphostctrl 等 SAP 接口收集有关系统状态、角色和配置的信息。

### SAPHanaSR-angi 和经典部署
<a name="_saphanasr_angi_and_classic_deployments"></a>

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

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

```
# man ocf_suse_SAPHanaTopology
```

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

对于原始资源：

```
# crm configure primitive rsc_SAPHanaTopology_<SID>_HDB<hana_sys_nr> ocf:suse:SAPHanaTopology \
params SID="<SID>" \
InstanceNumber="<hana_sys_nr>" \
op start interval="0" timeout="600" \
op stop interval="0" timeout="300" \
op monitor interval="10" timeout="600"
```

对于克隆资源：

```
# crm configure clone cln_SAPHanaTopology_<SID>_HDB<hana_sys_nr> rsc_SAPHanaTopology_<SID>_HDB<hana_sys_nr> \
meta clone-node-max="1" interleave="true" clone-max="2"
```
+  *使用[参数参考](sap-hana-pacemaker-sles-parameters.md)中的值的示例*：  
**Example**  

  ```
  # crm configure primitive rsc_SAPHanaTopology_HDB_HDB00 ocf:suse:SAPHanaTopology \
  params SID="HDB" \
  InstanceNumber="00" \
  op start interval="0" timeout="600" \
  op stop interval="0" timeout="300" \
  op monitor interval="10" timeout="600"
  
  # crm configure clone cln_SAPHanaTopology_HDB_HDB00 rsc_SAPHanaTopology_HDB_HDB00 \
  meta clone-node-max="1" interleave="true" clone-max="2"
  ```

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

对于原始资源：

```
# crm configure primitive rsc_SAPHanaTopology_<SID>_HDB<hana_sys_nr> ocf:suse:SAPHanaTopology \
params SID="<SID>" InstanceNumber="<hana_sys_nr>" \
op start interval="0" timeout="600" \
op stop interval="0" timeout="300" \
op monitor interval="10" timeout="600"
```

对于克隆资源：

```
# crm configure clone cln_SAPHanaTopology_<SID>_HDB<hana_sys_nr> rsc_SAPHanaTopology_<SID>_HDB<hana_sys_nr> \
meta clone-node-max="1" interleave="true" clone-max="<number-of-nodes>"
```
+  *使用[参数参考](sap-hana-pacemaker-sles-parameters.md)中的值的示例*：  
**Example**  

  ```
  # crm configure primitive rsc_SAPHanaTopology_HDB_HDB00 ocf:suse:SAPHanaTopology \
  params SID="HDB" InstanceNumber="00" \
  op start interval="0" timeout="600" \
  op stop interval="0" timeout="300" \
  op monitor interval="10" timeout="600"
  
  # crm configure clone cln_SAPHanaTopology_HDB_HDB00 rsc_SAPHanaTopology_HDB_HDB00 \
  meta 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 部署（在 SLES 15 及以上版本中可用） SP4
<a name="_saphanasr_angi_deployments_available_in_sles_15_sp4"></a>

在 SLES 15 及更高版本上推出 SP4 并推荐用于新部署。具有下一代系统复制架构 (SAPHanaSR-angi) 的 SAPHana控制器资源代理为纵向扩展和横向扩展部署提供了改进的集成和管理功能。有关详细信息：

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

```
# man ocf_suse_SAPHanaController
```

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

创建原始资源

```
# crm configure primitive rsc_SAPHanaController_<SID>_HDB<hana_sys_nr> ocf:suse:SAPHanaController \
params 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" \
meta priority="100"
```

创建克隆

```
# crm configure clone msl_SAPHanaController_<SID>_HDB<hana_sys_nr> rsc_SAPHanaController_<SID>_HDB<hana_sys_nr> \
meta clone-node-max="1" interleave="true" clone-max="2"
```
+  *使用[参数参考](sap-hana-pacemaker-sles-parameters.md)中的值的示例*：  
**Example**  

  ```
  # crm configure primitive rsc_SAPHanaController_HDB_HDB00 ocf:suse: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" \
  meta priority="100"
  # crm configure clone msl_SAPHanaController_HDB_HDB00 rsc_SAPHanaController_HDB_HDB00 \
  meta clone-node-max="1" interleave="true" clone-max="2"
  ```

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

创建原始资源

```
# crm configure primitive rsc_SAPHanaController_<SID>_HDB<hana_sys_nr> ocf:suse:SAPHanaController \
params 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"
```

创建克隆

```
# crm configure clone msl_SAPHanaController_<SID>_HDB<hana_sys_nr> rsc_SAPHanaController_<SID>_HDB<hana_sys_nr> \
meta clone-node-max="1" interleave="true" clone-max="<number-of-nodes>"
```
+  *使用[参数参考](sap-hana-pacemaker-sles-parameters.md)中的值的示例*：  
**Example**  

  ```
  # crm configure primitive rsc_SAPHanaController_HDB_HDB00 ocf:suse: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"
  
  # crm configure clone msl_SAPHanaController_HDB_HDB00 rsc_SAPHanaController_HDB_HDB00 \
  meta 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 个节点，不包括仲裁生成器节点）
+  **PREFER\$1SITE\$1TAKEOVER** 定义是否首选接管辅助系统。查看非标准部署。
+  **AUTOMATED\$1REGISTER** 定义是否应将前主系统注册为辅助系统。查看非标准部署。
+  **DUPLICATE\$1PRIMARY\$1TIMEOUT** 是等待时间，用于尽可能降低意外的双主系统风险。
+  **meta pri** ority-将其设置为 100 可以同时 priority-fencing-delay确保正确的故障转移顺序并防止同步屏蔽操作
+ 对于较大的数据库，可能需要增加启动和停止超时值（3600 秒）。根据您的数据库大小和观测 startup/shutdown 时间调整这些值

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

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

```
# man ocf_suse_SAPHana
```

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

使用 SAPHana 资源代理创建基元

```
# crm configure primitive rsc_SAPHana_<SID>_HDB<hana_sys_nr> ocf:suse:SAPHana \
params 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="Master" timeout="700" \
op monitor interval="61" role="Slave" timeout="700" \
meta priority="100"
```

创建克隆

```
# crm configure clone msl_SAPHana_<SID>_HDB<hana_sys_nr> rsc_SAPHana_<SID>_HDB<hana_sys_nr> \
meta clone-node-max="1" interleave="true" clone-max="2"
```
+  *使用[参数参考](sap-hana-pacemaker-sles-parameters.md)中的值的示例*：

  ```
  # crm configure primitive rsc_SAPHana_HDB_HDB00 ocf:suse:SAPHana \
  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="Master" timeout="700" \
  op monitor interval="61" role="Slave" timeout="700" \
  meta priority="100"
  
  # crm configure clone msl_SAPHana_HDB_HDB00 rsc_SAPHana_HDB_HDB00 \
  meta clone-node-max="1" interleave="true" clone-max="2"
  ```

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

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

```
# crm configure primitive rsc_SAPHanaController_<SID>_HDB<hana_sys_nr> ocf:suse:SAPHanaController \
params 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="Master" timeout="700" \
op monitor interval="61" role="Slave" timeout="700"
```

创建克隆

```
# crm configure clone msl_SAPHanaController_<SID>_HDB<hana_sys_nr> rsc_SAPHanaController_<SID>_HDB<hana_sys_nr> \
meta clone-node-max="1" interleave="true" clone-max="<number-of-nodes>"
```
+  *使用[参数参考](sap-hana-pacemaker-sles-parameters.md)中的值的示例*：

  ```
  # crm configure primitive rsc_SAPHanaController_HDB_HDB00 ocf:suse: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="Master" timeout="700" \
  op monitor interval="61" role="Slave" timeout="700"
  
  # crm configure clone msl_SAPHana_HDB_HDB00 rsc_SAPHana_HDB_HDB00 \
  meta 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 个节点，不包括仲裁生成器节点）
+  **PREFER\$1SITE\$1TAKEOVER** 定义是否首选接管辅助系统。查看非标准部署。
+  **AUTOMATED\$1REGISTER** 定义是否应将前主系统注册为辅助系统。查看非标准部署。
+  **DUPLICATE\$1PRIMARY\$1TIMEOUT** 是等待时间，用于尽可能降低意外的双主系统风险。
+  **meta pri** ority-将其设置为 100 可以同时 priority-fencing-delay确保正确的故障转移顺序并防止同步屏蔽操作
+ 对于较大的数据库，可能需要增加启动和停止超时值（3600 秒）。根据您的数据库大小和观测 startup/shutdown 时间调整这些值

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

以下约束是必需的。

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

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

```
# crm configure order <order_rule_name> Optional: <SAPHanaTopology_clone> <SAPHana/SAPHanaController_Clone>
```
+  *示例*：

  ```
  # crm configure order ord_SAPHana Optional: cln_SAPHanaTopology_HDB_HDB00 msl_SAPHana_HDB_HDB00
  ```

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

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

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

```
# crm configure colocation <colocation_rule_name> 2000: <ip_resource_name> <saphana/saphanacontroller name>:Master
```
+  *示例*：

  ```
  # crm configure colocation col_ip_SAPHana_Primary 2000: rsc_ip_HDB_HDB00 msl_SAPHana_HDB_HDB00:Master
  ```

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

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

```
# crm configure colocation <colocation_rule_name> 2000: rsc_ip_<SID>_HDB<hana_sys_nr>_readenabled msl_SAPHana/SAPHanaController_<SID>_HDB<hana_sys_nr>:Unpromoted
```
+  *示例*：

  ```
  # crm configure colocation col_ip_readenabled_SAPHana_Secondary 2000: rsc_ip_HDB_HDB00_readenabled msl_SAPHana_HDB_HDB00:Unpromoted
  ```

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

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

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

```
# crm configure location loc_SAPHanaTopology_avoid_majority_maker cln_SAPHanaTopology_<SID>_HDB<hana_sys_nr> -inf:<hostname_mm>

# crm configure location loc_SAPHana/SAPHanaController_avoid_majority_maker msl_SAPHana/SAPHanaController_<SID>_HDB<hana_sys_nr> -inf:<hostname_mm>
```
+  *示例*：

  ```
  # crm configure location loc_SAPHanaTopology_avoid_majority_maker cln_SAPHanaTopology_HDB_HDB00 -inf:hanamm
  # crm configure location loc_SAPHana_avoid_majority_maker msl_SAPHana_HDB_HDB00 -inf:hanamm
  ```

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

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

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

```
# crm maintenance off
```

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

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

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

```
# crm config show > /tmp/crmconfig_backup.txt
```

运行以下命令可清除当前配置：

```
# crm configure erase
```

执行上述擦除命令后，它将从集群信息库（CIB）中删除所有集群资源，并断开从 corosync 到集群的通信。在开始资源配置之前，请运行 crm cluster restart，以便集群重新建立与 corosync 的通信并检索配置。集群的重启会移除维护模式。在开始其他配置和资源设置之前，请重新应用。

# 客户端连接
<a name="sap-hana-pacemaker-sles-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-operations"></a>

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

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

您可以通过两种方式查看集群的状态：根据您的操作系统，或者使用 SUSE 提供的基于 Web 的控制台。

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

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

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

```
# crm status
```

示例输出：

```
Cluster Summary:
  * Stack: corosync
  * Current DC: sapsecdb (version 2.0.5+20201202.ba59be712-150300.4.45.2-2.0.5+20201202.ba59be712) - partition with quorum
  * Last updated: Wed Aug 20 14:05:19 2025
  * Last change:  Wed Aug 20 14:04:54 2025 by root via crm_attribute on hanahost01
  * 2 nodes configured
  * 6 resource instances configured

Node List:
  * Online: [ hanahost01 hanahost02  ]

Full List of Resources:
  * rsc_AWS_STONITH     (stonith:external/ec2):  Started sapsecdb
  * rsc_ip_HDB_HDB00    (ocf::heartbeat:aws-vpc-move-ip):        Started hanahost01
  * Clone Set: cln_SAPHanaTopology_HDB_HDB00 [rsc_SAPHanaTopology_HDB_HDB00]:
    * Started: [ hanahost01 hanahost02 ]
  * Clone Set: msl_SAPHana_HDB_HDB00 [rsc_SAPHana_HDB_HDB00] (promotable):
    * Masters: [ hanahost01 ]
    * Slaves: [ hanahost02 ]
```

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


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

## SUSE Hawk2
<a name="_suse_hawk2"></a>

Hawk2 是基于 Web 的图形用户界面，用于管理和监控 Pacemaker 高可用性集群。此功能必须在集群中的每个节点上启用，才能将您的 Web 浏览器指向任何节点进行访问。使用以下命令来启用 Hawk2。

```
# systemctl enable --now hawk
# systemctl status hawk
```

使用以下 URL 检查安全组，确认是否可以从管理主机访问端口 7630。

```
https://your-server:7630/

e.g https://hanahost01:7630
```

有关更多信息，请参阅 SUSE 文档中的[使用 Hawk2 配置和管理群集资源](https://documentation.suse.com/sle-ha/12-SP5/html/SLE-HA-all/cha-conf-hawk2.html)。

# 执行计划内维护
<a name="sap-hana-pacemaker-sles-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**  
使用以下命令之一启用维护模式。  

```
# crm maintenance on
```

```
# crm configure property maintenance-mode="true"
```
使用以下命令之一关闭维护模式。  

```
# crm maintenance off
```

```
# crm configure property maintenance-mode="false"
```

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

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

```
# crm node standby <hostname>
```

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

```
# crm node online <hostname>
```

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

建议不要移动单独的资源，因为创建的迁移或移动约束是为了将资源锁定在新位置。您可以按照信息消息中的说明进行清除，但这会引入额外的设置。

```
 # crm resource move msl_SAPHanaController_HDB_HDB00 hanahost02
INFO: Move constraint created for msl_SAPHanaController_HDB_HDB00 to hanahost02
INFO: Use `crm resource clear msl_SAPHanaController_HDB_HDB00` to remove this constraint
```

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

资源重新放置到目标位置后，使用以下命令。

```
# crm resource clear msl_SAPHanaController_HDB_HDB00
```

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

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

**Topics**
+ [查看日志](#_checking_the_logs)
+ [清理 crm 状态](#_cleanup_crm_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> 目录。

## 清理 crm 状态
<a name="_cleanup_crm_status"></a>

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

```
# crm resource cleanup <resource> <hostname>
```

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

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

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

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

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

```
# hb_report -f "YYYY-MM-DD HH:MM:SS" -t "YYYY-MM-DD HH:MM:SS" /tmp/hb_report
```

要快速分析最近的事件，您可以使用：

```
# crm history events
# crm history log
```
+ `hb_report` 和 `crm history` 命令都需要在节点之间使用无密码 SSH
+ 有关更多信息，请参阅 SUSE 文档：[Usage of hb\$1report for SLES HAE](https://www.suse.com/support/kb/doc/?id=000017501) 

# 提醒和监控
<a name="sap-hana-pacemaker-sles-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-sles-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-sles-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. 使用 `crm resource refresh` 清理 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. 使用 `crm resource refresh` 清理 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）时的故障
+  **组件级测试** 
  + 测试索引服务器故障并测量恢复时间
  + 验证快速启动选项行为和钩子脚本执行
+  **集群配置测试** 
  + 使用 `stonith_admin -F <node_name>` 直接执行隔离操作 
  + 资源移动和约束条件验证

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