IBM Cloud Docs
在 Red Hat Enterprise Linux High Availability Add-On 集群中配置 SAP HANA 成本优化扩展系统复制

在 Red Hat Enterprise Linux High Availability Add-On 集群中配置 SAP HANA 成本优化扩展系统复制

以下信息介绍了 Red Hat Enterprise Linux (RHEL) High Availability Add-On 集群的配置,用于管理 SAP HANA Cost-Optimized Scale-Up System Replication。 群集使用 IBM® Power® Virtual Server 中的虚拟服务器实例作为群集节点。

成本优化配置中,一个非生产性的 SAP HANA 系统在正常运行期间运行在辅助节点上。 辅助节点上的硬件资源由非生产系统和 SAP HANA 系统复制辅助节点共享。 通过禁用列表数据的预加载,减少了生产系统复制辅助系统的内存使用量。

如果发生故障转移,在节点接管生产工作负载之前,非生产实例会自动停止。 与性能优化配置相比,接管时间更长。

本信息面向计划在 Power Virtual Server 上高可用性部署 SAP HANA 的架构师和专家。

准备工作

查看 IBM Power Virtual Server 参考资料中为 SAP 应用程序实施高可用性 中列出的一般要求、产品文档、支持文章和 SAP 注释。

先决条件

  • Power Virtual Server 中的两个虚拟服务器实例上部署了 Red Hat High Availability 集群。
  • 虚拟服务器实例需要满足 SAP HANA 范围内系统的硬件和资源要求。 请遵循 规划部署 文件中的指导原则。
  • 虚拟服务器实例的主机名必须符合 SAP HANA 的要求。
  • SAP HANA 安装在两个虚拟服务器实例上,并配置了 系统复制。SAP HANA SAP HANA 的安装和 HANA 系统复制的设置并非针对 Power Virtual Server 环境,您需要遵循标准程序。
  • 非生产 SAP HANA 系统安装在 NODE2 上,其 SIDInstance Number 与生产系统不同。 非生产系统需要自己的专用存储卷和文件系统。 限制非生产系统的 全局内存分配限制,以确保辅助系统上的 HANA 系统复制工作负载有足够的内存。 限值通过 global.ini 配置文件 [memorymanager] 部分中的 global_allocation_limit 参数设置。
  • 可选择为非生产系统保留一个虚拟 IP 地址,如 保留虚拟 IP 地址 中所述。

设置成本优化方案

成本优化方案是 Red Hat Enterprise Linux High Availability Add-On 集群中配置 SAP HANA 扩展系统复制 中所述设置的扩展。 完成生产系统系统复制群集的设置后,再继续以下步骤。

准备环境变量

为简化设置,请为 NODE2 上的用户 ID root 准备以下环境变量。 这些环境变量将与本信息后面的操作系统命令一起使用。

在 NODE2 上,设置以下环境变量。

# General settings
export SID_NP=<SID>            # SAP HANA System ID of non-production system (uppercase)
export sid_np=<sid>            # SAP HANA System ID of non-production system (lowercase)
export INSTNO_NP=<INSTNO>      # SAP HANA Instance Number of non-production system

# Cluster nodes
export NODE1=<Hostname 1>      # Hostname of virtual server instance 1 (production primary)
export NODE2=<Hostname 2>      # Hostname of virtual server instance 2 (non-production, production secondary)

# Optional virtual IP address
export VIP_NP=<IP address>     # Virtual IP address for the non-production system

配置 SAP HANA HA/DR 提供商钩子

SAP HANA 名称服务器提供基于 Python 的 API,在 HANA 系统复制接管过程中的重要时刻调用该 API。 这些 API 调用用于运行客户特定的操作 (实施 HA/DR 提供商 )。

在成本优化方案中,SAP HANA HA/DR 提供商钩子用于在接管事件期间自动重新配置 SAP HANA 实例。

下一节展示了为成本优化的 SAP HANA 系统复制环境设置钩子脚本的示例。 在群集中实施成本优化的 SAP HANA System Replication HA 环境自动化时,必须对接管钩子脚本进行彻底测试。 手动运行测试。 关闭辅助节点上的非生产 SAP HANA 实例,执行接管,并验证钩子脚本是否正确地重新配置了主 HANA DB。

在 SAP HANA 生产数据库中创建数据库用户

使用以下步骤在 SAP HANA 生产数据库中创建数据库用户。

  1. SystemDBSAP HANA 生产系统中创建数据库用户、或提供现有用户的凭据。 钩子脚本使用该数据库用户连接到生产数据库并更改配置参数。

    使用 数据库交互终端 hdbsql 或 Cockpit 登录 SystemDB 使用 SAP HANA 数据库交互终端 hdbsqlSAP HANA Cockpit 登录主实例,并创建一个新用户。

    例如,在终端会话中使用 hdbsql 连接数据库。

    sudo -i -u ${sid}adm -- hdbsql -i ${INSTNO} -d SYSTEMDB -u SYSTEM
    

    创建用户。

    CREATE USER HA_HOOK PASSWORD <Password> no force_first_password_change;
    

    授予用户所需的权限。

    授予 INIFILE ADMIN 权限,允许更改配置文件参数。

    GRANT INIFILE ADMIN TO HA_HOOK;
    

    验证 HA_HOOK 用户。

     sudo -i -u ${sid}adm -- hdbsql -d SYSTEMDB -u SYSTEM select \* from users where user_name = \'HA_HOOK\';
    
  2. 将用户证书添加到安全用户存储 hdbuserstore

    在两个节点上运行以下命令。 使用上一步中设置的密码。

    sudo -i -u ${sid}adm -- hdbuserstore SET HA_HOOK_KEY localhost:3${INSTNO}13 HA_HOOK <Password>
    

    检查 hdbuserstore 的更新。

    sudo -i -u ${sid}adm -- hdbuserstore list
    

    在主实例上,使用存储的用户密钥测试连接。

    sudo -i -u ${sid}adm  -- hdbsql -U HA_HOOK_KEY select \* from m_inifiles;
    

创建挂钩脚本

Python 用于创建钩子脚本的示例文件作为 安装的一部分提供。SAP HANA 样本位于 $DIR_INSTANCE/exe/python_support/hdb_ha_dr 目录中。

目标目录 /hana/shared/myHooks 已为钩子 SAPHanaSR.py 创建。 在 /hana/shared/myHooks 中创建 HA/DR 提供程序钩子。 以下钩子脚本基于 HADRdummy.py 示例。

在 NODE2 上,编辑文件 /hana/shared/myHooks/SAPHanaCostOptSR.py 并添加以下内容。

"""
Sample for a HA/DR hook provider.

When using your own code in here, please copy this file to location on /hana/shared outside the HANA installation.
This file will be overwritten with each hdbupd call! To configure your own changed version of this file, please add
to your global.ini lines similar to this:

    [ha_dr_provider_<className>]
    provider = <className>
    path = /hana/shared/haHook
    execution_order = 1


For all hooks, 0 must be returned in case of success.
"""

from __future__ import absolute_import
from hdb_ha_dr.client import HADRBase, Helper
from hdbcli import dbapi
import os, time

class SAPHanaCostOptSR(HADRBase):

    def __init__(self, *args, **kwargs):
        # delegate construction to base class
        super(SAPHanaCostOptSR, self).__init__(*args, **kwargs)

    def about(self):
        return {"provider_company" :        "SAP",
                "provider_name" :           "SAPHanaCostOptSR", # provider name = class name
                "provider_description" :    "Handle reconfiguration event for cost-optimized system replication",
                "provider_version" :        "1.0"}

    def postTakeover(self, rc, **kwargs):
        """Post takeover hook."""

        # prepared SQL statements to remove memory allocation limit and pre-load of column tables
        stmnt1 = "ALTER SYSTEM ALTER CONFIGURATION ('global.ini','SYSTEM') UNSET ('memorymanager','global_allocation_limit') WITH RECONFIGURE"
        stmnt2 = "ALTER SYSTEM ALTER CONFIGURATION ('global.ini','SYSTEM') UNSET ('system_replication','preload_column_tables') WITH RECONFIGURE"

        myPort = int('3' + os.environ.get('DIR_INSTANCE')[-2:] + '15')
        myKey = self.config.get("userkey") if self.config.hasKey("userkey") else "HA_HOOK_KEY"

        self.tracer.info("%s.postTakeover method called with rc=%s" % (self.__class__.__name__, rc))
        self.tracer.info("%s.postTakeover method: userkey: %s, port: %s" % (self.__class__.__name__, myKey, myPort))

        if rc in (0, 1):
            # rc == 0: normal takeover succeeded
            # rc == 1: waiting for force takeover
            conn = dbapi.connect(userkey=myKey, address='localhost', port=myPort)
            self.tracer.info("%s: Connect using userkey %s - %s" % (self.__class__.__name__, myKey, conn.isconnected()))
            cursor = conn.cursor()
            rc1 = cursor.execute(stmnt1)
            self.tracer.info("%s: (%s) - %s" % (self.__class__.__name__, stmnt1, rc1))
            rc2 = cursor.execute(stmnt2)
            self.tracer.info("%s: (%s) - %s" % (self.__class__.__name__, stmnt2, rc2))
            return 0
        elif rc == 2:
            # rc == 2: error, something went wrong
            return 0

激活成本优化挂钩

使用以下步骤激活成本优化挂钩。

  1. 停止群集。

    在任何一个群集节点上,运行以下命令。

    pcs cluster stop --all
    
  2. 设置钩子脚本的文件所有权。

    在 NODE2 上,运行以下命令。

    chown -R ${sid}adm:sapsys /hana/shared/myHooks
    
  3. 更新 NODE2 上的 global.ini 配置文件,启用钩子脚本。

    在 NODE2 上,运行以下命令将所需参数添加到 global.ini 文件中。

    sudo -i -u ${sid}adm -- <<EOT
        python \$DIR_INSTANCE/exe/python_support/setParameter.py \
          -set SYSTEM/global.ini/ha_dr_provider_SAPHanaCostOptSR/provider=SAPHanaCostOptSR \
          -set SYSTEM/global.ini/ha_dr_provider_SAPHanaCostOptSR/path=/hana/shared/myHooks \
          -set SYSTEM/global.ini/ha_dr_provider_SAPHanaCostOptSR/userkey=HA_HOOK_KEY \
          -set SYSTEM/global.ini/ha_dr_provider_SAPHanaCostOptSR/execution_order=2 \
          -set SYSTEM/global.ini/trace/ha_dr_saphanacostoptsr=info
    EOT
    
  4. 检查 global.ini 文件的内容。

    cat /hana/shared/${SID}/global/hdb/custom/config/global.ini
    
  5. 验证挂钩是否起作用。

    • 在 NODE2 上重启 HANA 实例,并验证钩子脚本是否按预期运行。
    • 通过 SAP HANA 接管操作触发钩子。
    • 检查钩子是否在跟踪文件中记录了任何内容。
    sudo -i -u ${sid}adm -- \
        sh -c 'grep SAPHanaCostOptSR $DIR_INSTANCE/$VTHOSTNAME/trace/nameserver_*.trc'
    

    验证钩子功能后,就可以重新启动 HA 群集。

  6. 启动 HA 群集。

    在任何一个群集节点上,运行以下命令。

    pcs cluster start --all
    

    检查群集的状态。

    pcs status --full
    

定义 SAP HANA 次节点资源使用限制

NODE2 上运行的所有 SAP HANA 系统共享节点的可用内存。 辅助系统 SAP HANA $ {SID} 的内存配置必须限制在系统复制所需的数量内,以便非生产系统可以使用剩余内存。

SAP 文件《 二次系统使用 》描述了不同的情况,并提供了参数建议。

通过设置数据库配置参数 preload_column_tables = false,在辅助系统上禁用列表的预加载,以限制其内存消耗。 该参数位于 NODE2 上 SAP HANA 生产系统的实例配置文件 [system_replication] 部分。

global_allocation_limit 设置在 [memorymanager] 部分,以限制 SAP HANA 生产系统和运行在 NODE2 上的非生产系统的内存分配。

在 NODE2 上,为辅助 HANA 生产实例定义一个环境变量,其中包含所需的内存限制。

export GLOBAL_ALLOCATION_LIMIT=<memory_size_in_mb_for_hana_secondary>

然后,运行以下命令更新 global.ini 配置文件。

sudo -i -u ${sid}adm -- <<EOT
    python \$DIR_INSTANCE/exe/python_support/setParameter.py \
      -set SYSTEM/global.ini/system_replication/preload_column_tables=false \
      -set SYSTEM/global.ini/memorymanager/global_allocation_limit=$GLOBAL_ALLOCATION_LIMIT
EOT

验证配置文件。

cat /hana/shared/${SID}/global/hdb/custom/config/global.ini

无法在辅助系统上使用 hdbsqlALTER SYSTEM ALTER CONFIGURATION ... 语句,在此状态下无法进行 SQL 连接。 使用 hdbnsutil –reconfig 命令激活更改。

sudo -i -u ${sid}adm -- hdbnsutil -reconfig

更新非生产实例的 global.ini 配置文件,允许使用辅助运行的内存资源。

在 NODE2 上,为非生产 HANA 实例定义一个环境变量,其中包含所需的内存限制。

export NON_PROD_GLOBAL_ALLOCATION_LIMIT=<memory_size_in_mb_for_non_prod_hana>

然后,运行以下命令更新 global.ini 配置文件。

sudo -i -u ${sid_np}adm -- <<EOT
    python \$DIR_INSTANCE/exe/python_support/setParameter.py \
      -set SYSTEM/global.ini/memorymanager/global_allocation_limit=$NON_PROD_GLOBAL_ALLOCATION_LIMIT \
      -reconfigure
EOT

验证配置文件。

cat /hana/shared/${SID_NP}/global/hdb/custom/config/global.ini

运行以下命令检查当前数据库内存限制。

sudo -i -u ${sid_np}adm -- hdbcons "mm globallimit" | grep limit

为非生产实例配置群集资源

使用以下信息为非生产实例配置群集资源。

安装 SAPInstance 资源代理

resource-agents-sap 软件包包括 SAPInstance 集群资源代理,用于管理附加的非生产 SAP HANA 实例。

在 NODE2 上,运行以下命令安装资源代理。

dnf install -y resource-agents-sap

如果需要,使用 subscription-manager 启用 SAP NetWeaver 存储库。

subscription-manager repos --enable="rhel-8-for-ppc64le-sap-netweaver-e4s-rpms"

创建用于管理非生产实例的群集资源

在 NODE2 上,运行以下命令。

pcs resource create SAPHana_np_${SID_NP}_HDB${INSTNO_NP} SAPInstance \
    InstanceName="${SID_NP}_HDB${INSTNO_NP}_${NODE2}" \
    MONITOR_SERVICES="hdbindexserver|hdbnameserver" \
    START_PROFILE="/usr/sap/${SID_NP}/SYS/profile/${SID_NP}_HDB${INSTNO_NP}_${NODE2}" \
    op start timeout=600 op stop timeout=600 op monitor interval=60 timeout=600 \
    --group group_${sid_np}_non_prod

如果要为非生产实例分配虚拟 IP 地址,请添加 IPaddr2 群集资源。

pcs resource create vip_np IPaddr2 \
    ip="${VIP_NP}" \
    --group group_${sid_np}_non_prod

创建群集约束,防止非生产系统在 NODE1 上启动。

pcs constraint location add loc-${sid_np}-avoid-${NODE1} \
    group_${sid_np}_non_prod ${NODE1} -INFINITY resource-discovery=never

如果发生接管,当生产系统在 NODE2 上担任 PRIMARY 角色时,非生产系统会停止运行,其内存资源也会被释放。 以下群集约束可确保主生产实例和非生产实例永远不会在一个节点上同时运行,并确保非生产实例在生产实例升级前停止运行。

pcs constraint colocation add group_${sid_np}_non_prod with master SAPHana_${SID}_${INSTNO}-clone score=-INFINITY
pcs constraint order stop group_${sid_np}_non_prod then promote SAPHana_${SID}_${INSTNO}-clone

群集配置完成。

运行以下命令检查已定义群集资源的状态。

pcs status --full

样本输出:

# pcs status --full
Cluster name: SAP_PRD
Cluster Summary:
  * Stack: corosync
  * Current DC: cl-prd-2 (2) (version 2.0.5-9.el8_4.5-ba59be7122) - partition with quorum
  * Last updated: Fri Apr 28 16:38:00 2023
  * Last change:  Fri Apr 28 16:37:49 2023 by hacluster via crmd on cl-prd-1
  * 2 nodes configured
  * 8 resource instances configured

Node List:
  * Online: [ cl-prd-1 (1) cl-prd-2 (2) ]

Full List of Resources:
  * res_fence_ibm_powervs	(stonith:fence_ibm_powervs):	 Started cl-prd-2
  * Clone Set: SAPHanaTopology_PRD_00-clone [SAPHanaTopology_PRD_00]:
    * SAPHanaTopology_PRD_00	(ocf::heartbeat:SAPHanaTopology):	 Started cl-prd-2
    * SAPHanaTopology_PRD_00	(ocf::heartbeat:SAPHanaTopology):	 Started cl-prd-1
  * Clone Set: SAPHana_PRD_00-clone [SAPHana_PRD_00] (promotable):
    * SAPHana_PRD_00	(ocf::heartbeat:SAPHana):	 Slave cl-prd-2
    * SAPHana_PRD_00	(ocf::heartbeat:SAPHana):	 Master cl-prd-1
  * vip_PRD_00	(ocf::heartbeat:IPaddr2):	 Started cl-prd-1
  * Resource Group: group_dev_non_prod:
    * vip_np	(ocf::heartbeat:IPaddr2):	 Started cl-prd-2
    * SAPHana_np_DEV_HDB10	(ocf::heartbeat:SAPInstance):	 Started cl-prd-2

Node Attributes:
  * Node: cl-prd-1 (1):
    * hana_prd_clone_state            	: PROMOTED
    * hana_prd_op_mode                	: logreplay
    * hana_prd_remoteHost             	: cl-prd-2
    * hana_prd_roles                  	: 4:P:master1:master:worker:master
    * hana_prd_site                   	: SiteA
    * hana_prd_srmode                 	: syncmem
    * hana_prd_sync_state             	: PRIM
    * hana_prd_version                	: 2.00.070.00.1679989823
    * hana_prd_vhost                  	: cl-prd-1
    * lpa_prd_lpt                     	: 1682692638
    * master-SAPHana_PRD_00           	: 150
  * Node: cl-prd-2 (2):
    * hana_prd_clone_state            	: DEMOTED
    * hana_prd_op_mode                	: logreplay
    * hana_prd_remoteHost             	: cl-prd-1
    * hana_prd_roles                  	: 4:S:master1:master:worker:master
    * hana_prd_site                   	: SiteB
    * hana_prd_srmode                 	: syncmem
    * hana_prd_sync_state             	: SOK
    * hana_prd_version                	: 2.00.070.00.1679989823
    * hana_prd_vhost                  	: cl-prd-2
    * lpa_prd_lpt                     	: 30
    * master-SAPHana_PRD_00           	: 100

Migration Summary:

Tickets:

PCSD Status:
  cl-prd-1: Online
  cl-prd-2: Online

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

运行以下命令检查已定义的限制条件。

样本输出:

# pcs constraint --full
Location Constraints:
  Resource: group_dev_non_prod
    Disabled on:
      Node: cl-prd-1 (score:-INFINITY) (resource-discovery=never) (id:loc-dev-avoid-cl-prd-1)
Ordering Constraints:
  start SAPHanaTopology_PRD_00-clone then start SAPHana_PRD_00-clone (kind:Mandatory) (non-symmetrical) (id:order-SAPHanaTopology_PRD_00-clone-SAPHana_PRD_00-clone-mandatory)
  stop group_dev_non_prod then promote SAPHana_PRD_00-clone (kind:Mandatory) (id:order-group_dev_non_prod-SAPHana_PRD_00-clone-mandatory)
Colocation Constraints:
  vip_PRD_00 with SAPHana_PRD_00-clone (score:2000) (rsc-role:Started) (with-rsc-role:Master) (id:colocation-vip_PRD_00-SAPHana_PRD_00-clone-2000)
  group_dev_non_prod with SAPHana_PRD_00-clone (score:-INFINITY) (rsc-role:Started) (with-rsc-role:Master) (id:colocation-group_dev_non_prod-SAPHana_PRD_00-clone-INFINITY)
Ticket Constraints:

启用自动注册辅助实例

您需要根据操作要求设置参数 AUTOMATED_REGISTER。 如果希望保留恢复到上一个主 SAP HANA 实例状态的功能,那么 AUTOMATED_REGISTER=false 就可以避免将上一个主服务器自动注册为新的辅助服务器。

如果在群集触发接管后数据出现问题,如果 AUTOMATED_REGISTER 设置为 false,则可以手动恢复。

如果 AUTOMATED_REGISTER 设置为 true,则之前的主要 SAP HANA 实例会自动注册为次要实例,并且无法在其之前的历史记录中激活。 AUTOMATED_REGISTER=true 的优势在于,故障节点重新出现在集群中后,高可用性会自动重建。

目前,建议将 AUTOMATED_REGISTER 保留为默认值 false,直到集群经过全面测试并验证故障转移方案是否按预期运行。

pcs resource update 命令用于修改资源属性,pcs resource update SAPHana_${SID}_${INSTNO} AUTOMATED_REGISTER=true 将属性设置为 true

测试 SAP HANA 系统复制群集

彻底测试群集配置以确保群集正常运行至关重要。 以下信息提供了一些故障切换测试场景示例,但并非完整的测试场景列表。

例如,每个测试用例的说明包括以下信息。

  • 测试哪个组件
  • 测试说明
  • 启动故障转移测试前的前提条件和初始状态
  • 测试程序
  • 预期行为和结果
  • 恢复程序

Test1- 测试主数据库实例故障

使用以下信息测试主数据库实例的故障。

Test1- 说明

模拟在 NODE1 上运行的 HANA 主数据库实例崩溃。

Test1- 先决条件

  • 用于 HANA 系统复制的功能性双节点 RHEL HA 附加集群。
  • 两个群集节点都处于活动状态。
  • 群集在 NODE1 和 NODE2 上启动。
  • 集群资源 SAPHana_${SID}_${INSTNO} 是通过 AUTOMATED_REGISTER=false 配置的。
  • 检查 SAP HANA 系统复制状态:
    • SAP HANA 主数据库运行在 NODE1 上。
    • SAP HANA 备用数据库运行在 NODE2 上。
    • HANA 系统复制已激活并保持同步。
  • NODE2 上的辅助 SAP HANA 数据库在内存配置减少的情况下运行。
    • global_allocation_limit 已减少。
    • 已禁用列表预载 (preload_column_tables = false)。
  • NODE2 上运行着一个非生产 SAP HANA 系统 ${SID_NP}

Test1- 测试程序

以用户 ${sid}adm 的身份发送 SIGKILL 信号,使 SAP HANA 初级程序崩溃。

在 NODE1 上,运行以下命令。

sudo -i -u ${sid}adm -- HDB kill-9

Test1- 预期行为

  • SAP HANA NODE1 上的主实例崩溃。
  • 群集会检测到已停止的 HANA 主数据库,并将资源标记为 failed
  • 群集会将 NODE2 上的辅助 HANA 数据库升级为新的主数据库。
    • 群集在 NODE2 上停止非生产数据库 ${SID_NP}
    • 激活期间,global_allocation_limitpreload_column_tables 参数将重置为默认值。
  • 群集释放 NODE1 上的虚拟 IP 地址,并在 NODE2 上的新主 IP 地址上获取该地址。
  • 如果应用程序(如 SAP NetWeaver )连接到 SAP HANA 的租户数据库,则应用程序会自动重新连接到新的主数据库。

在 NODE2 上,运行以下命令检查 global_allocation_limitpreload_column_tables 是否未设置。

sudo -i -u ${sid}adm -- hdbcons "mm globallimit" | grep limit
grep -E "global_allocation_limit|preload_column_tables" \
     /hana/shared/${SID}/global/hdb/custom/config/global.ini

Test1- 恢复程序

由于群集资源 SAPHana_${SID}_${INSTNO} 是通过 AUTOMATED_REGISTER=false 配置的,因此群集不会重启故障的 HANA 数据库,也不会将其注册到新的主数据库中。 新主系统 ( NODE2 ) 的状态显示辅助系统处于 "CONNECTION TIMEOUT"(连接超时)状态。

在 NODE1 上,运行以下命令将先前的主系统注册为新的辅助系统。

sudo -i -u ${sid}adm -- <<EOT
    hdbnsutil -sr_register \
        --name=${DC1} \
        --remoteHost=${NODE2} \
        --remoteInstance=${INSTNO} \
        --replicationMode=sync \
        --operationMode=logreplay \
        --online
EOT

验证系统复制状态。

sudo -i -u ${sid}adm -- <<EOT
    hdbnsutil -sr_state
    HDBSettings.sh systemReplicationStatus.py
EOT

在 NODE1 上,运行以下命令启动群集节点。

pcs cluster start

新的辅助实例重新启动,并显示为同步状态 (SOK)。

pcs status --full

使用 AUTOMATED_REGISTER=true 配置群集资源 SAPHana_${SID}_${INSTNO}

在 NODE1 上,运行以下命令。

pcs resource update SAPHana_${SID}_${INSTNO} AUTOMATED_REGISTER=true
pcs resource config SAPHana_${SID}_${INSTNO}

Test2- 测试手动将 SAPHana 资源移动到另一个节点

使用以下信息测试手动将 SAPHana 资源移动到另一个节点。

Test2- 说明

使用群集命令将主实例移回另一个节点。

Test2- 先决条件

  • 用于 HANA 系统复制的功能性双节点 RHEL HA 附加集群。
  • 两个群集节点都处于活动状态。
  • 群集在 NODE1 和 NODE2 上启动。
  • 集群资源 SAPHana_${SID}_${INSTNO} 是通过 AUTOMATED_REGISTER=true 配置的。
  • 检查 SAP HANA 系统复制状态:
    • SAP HANA 主数据库运行在 NODE2 上。
    • SAP HANA 备用数据库运行在 NODE1 上。
    • HANA 系统复制已激活并保持同步。
  • 非生产 SAP HANA 系统 ${SID_NP} 在 NODE2 上停止运行。

Test2- 考试准备

取消对非生产 SAP HANA 系统的群集资源的管理,以防止它在辅助系统的内存资源不受限制时启动。

在 NODE1 上,运行以下命令。

pcs resource unmanage group_${sid_np}_non_prod

Test2- 测试程序

在 NODE1 上,运行以下命令将 SAP HANA 主文件移回 NODE1。

pcs resource move SAPHana_${SID}_${INSTNO}-clone

Test2- 预期行为

  • 集群会创建一个位置限制,以移动资源。
  • 群集触发对 NODE1 上辅助 HANA 数据库的接管。
  • 如果应用程序(如 SAP NetWeaver )连接到 SAP HANA 的租户数据库,则应用程序会自动重新连接到新的主数据库。
  • 非生产 SAP HANA 系统的资源 ${SID_NP} 处于非托管状态,不会自动启动。

Test2- 恢复程序

要重建完整的 HA 方案,需要遵循几个步骤。

  1. 等待主 HANA 实例激活。 然后,减少二级程序的内存占用。

    在 NODE2 上运行以下命令来减少内存。

    export GLOBAL_ALLOCATION_LIMIT=<size_in_mb_for_hana_secondary>
    
    sudo -i -u ${sid}adm -- <<EOT
        python \$DIR_INSTANCE/exe/python_support/setParameter.py \
          -set SYSTEM/global.ini/system_replication/preload_column_tables=false \
          -set SYSTEM/global.ini/memorymanager/global_allocation_limit=$GLOBAL_ALLOCATION_LIMIT
    EOT
    
  2. 移除位置限制,从而触发二级实例的启动。

    pcs resource clear SAPHana_${SID}_${INSTNO}-clone
    

    确认约束已清除。

    pcs constraint
    

    检查群组状态。

    pcs status --full
    
  3. 在 NODE2 上,运行以下命令检查 global_allocation_limitpreload_column_tables 是否已设置。

    sudo -i -u ${sid}adm -- hdbcons "mm globallimit" | grep limit
    
    grep -E "global_allocation_limit|preload_column_tables" \
         /hana/shared/${SID}/global/hdb/custom/config/global.ini
    
  4. 重新激活非生产 SAP HANA 系统的资源。

    在 NODE2 上,运行以下命令。

    pcs resource manage group_${sid_np}_non_prod
    

    管理非生产 SAP HANA 系统 ${SID_NP} 的资源,并在 NODE2 上启动非生产系统。

    pcs status --full
    

Test3- 测试运行主数据库的节点故障

使用以下信息测试运行主数据库的节点是否发生故障。

Test3- 说明

模拟运行主 HANA 数据库的节点崩溃。

Test3- 先决条件

  • 用于 HANA 系统复制的功能性双节点 RHEL HA 附加集群。
  • 两个群集节点都处于活动状态。
  • 群集在 NODE1 和 NODE2 上启动。
  • 集群资源 SAPHana_${SID}_${INSTNO} 是通过 AUTOMATED_REGISTER=true 配置的。
  • 检查 SAP HANA 系统复制状态:
    • SAP HANA 主数据库运行在 NODE1 上。
    • SAP HANA 备用数据库运行在 NODE2 上。
    • HANA 系统复制已激活并保持同步。
  • NODE2 上的辅助 SAP HANA 数据库在内存配置减少的情况下运行。
    • global_allocation_limit 已减少。
    • 已禁用列表预载 (preload_column_tables = false)。
  • NODE2 上运行着一个非生产 SAP HANA 系统 ${SID_NP}

Test3- 测试程序

通过发送崩溃系统请求,在 NODE1 上崩溃主系统。

在 NODE1 上,运行以下命令。

sync; echo c > /proc/sysrq-trigger

Test3- 预期行为

  • NODE1 关闭。
  • 群集检测到故障节点,并将其状态设置为 OFFLINE
  • 群集会将 NODE2 上的辅助 HANA 数据库升级为新的主数据库。
    • 群集在 NODE2 上停止非生产数据库 ${SID_NP}
    • 在激活过程中,global_allocation_limitpreload_column_tables SAP HANA ${SID} 的参数会被重置。
  • 群集通过 NODE2 获取新主服务器上的虚拟 IP 地址。
  • 如果应用程序(如 SAP NetWeaver )连接到 SAP HANA 的租户数据库,则应用程序会自动重新连接到新的主数据库。

Test3- 恢复程序

登录 IBM Cloud® 控制台并启动 NODE1。 等待 NODE1 再次可用,然后重启群集框架。

在 NODE1 上,运行以下命令。

pcs cluster start
pcs status --full

由于群集资源 SAPHana_${SID}_${INSTNO} 是与 AUTOMATED_REGISTER=true 一起配置的,因此,当 NODE1 加入群集时,SAP HANA 会重新启动,并且前主服务器会注册为辅助服务器。

然后,重新运行 Test2- Test the manual move of SAPHana resource to another node 中的步骤 中的步骤,以恢复到初始状态。

Test4- 测试辅助数据库实例故障

使用以下信息测试辅助数据库实例的故障。

Test4- 说明

模拟 HANA 备用数据库崩溃。

Test4- 先决条件

  • 用于 HANA 系统复制的功能性双节点 RHEL HA 附加集群。
  • 两个节点都已激活。
  • 群集在 NODE1 和 NODE2 上启动。
  • 集群资源 SAPHana_${SID}_${INSTNO} 是通过 AUTOMATED_REGISTER=true 配置的。
  • 检查 SAP HANA 系统复制状态:
    • SAP HANA 主数据库运行在 NODE1 上。
    • SAP HANA 备用数据库运行在 NODE2 上。
    • HANA 系统复制已激活并同步。

Test4- 测试程序

以用户 ${sid}adm 的身份发送 SIGKILL 信号,使 SAP HANA 二级程序崩溃。

在 NODE2 上,运行以下命令。

sudo -i -u ${sid}adm -- HDB kill-9

Test4- 预期行为

  • SAP HANA NODE2 上的二级碰撞。
  • 群集会检测到已停止的二级 HANA 数据库,并将资源标记为 failed
  • 群集重新启动辅助 HANA 数据库。
  • 群集检测到系统复制再次同步。

Test4- 恢复程序

等待辅助 HANA 实例启动并再次同步 (SOK),然后清理失败的资源操作,如 pcs status 所示。

在 NODE2 上,运行以下命令。

pcs resource refresh SAPHana_${SID}_${INSTNO}
pcs status --full