将 SLES HA 集群中的 VIP 迁移到内部负载均衡器

在 Google Cloud 上,为适用于 SAP 的基于操作系统的高可用性 (HA) 集群实现虚拟 IP 地址 (VIP) 的推荐方法是使用内部 TCP/UDP 负载均衡器的故障切换支持。

如果您在 Google Cloud 上已有适用于 SAP 的 SUSE Linux Enterprise Server (SLES) HA 集群,且该集群使用的是通过别名 IP 实现的 VIP,则您可以迁移该 VIP 以改用内部负载均衡器。

如果您使用了不再受支持的 sap_hana_ha Deployment Manager 模板在 SLES 上的 HA 集群中部署 SAP HANA 纵向扩容系统,则您的 VIP 会通过别名实现 IP。

以下说明介绍了如何在 SLES HA 集群中迁移 VIP。

前提条件

以下说明假定您在 Google Cloud 上已有正确配置的 HA 集群,且该集群使用别名 IP 实现 VIP。

步骤概述

  • 使用临时转发规则和临时 IP 地址代替 VIP 来配置和测试负载均衡器。
  • 将集群设置为维护模式,如果可以,停止 SAP 应用服务器实例以避免任何意外行为。
  • 从主要主机中取消分配别名 IP 地址。此地址将成为使用负载均衡器的 VIP。
  • 在 Pacemaker 集群配置中:
    • 更改现有 VIP 资源的类。
    • 将别名 IP 的现有参数替换为健康检查服务的参数。

确认现有 VIP 地址

在主虚拟机实例上,以根用户身份显示现有基于别名 IP 的集群配置:

$ crm configure show

在资源定义中,VIP 地址范围显示在 aliasIPaddr2 资源上。如果您需要更改 VIP 地址,则需要更新这两个资源。请参阅以下示例:

primitive rsc_vip_gcp-primary ocf:gcp:alias \
        op monitor interval=60s timeout=60s \
        op start interval=0 timeout=600s \
        op stop interval=0 timeout=180s \
        params alias_ip="10.128.1.200/32" hostlist="ha1 ha2" gcloud_path="/usr/local/google-cloud-sdk/bin/gcloud" logging=yes \
        meta priority=10
primitive rsc_vip_int-primary IPaddr2 \
        params ip=10.128.1.200 cidr_netmask=32 nic=eth0 \
        op monitor interval=3600s timeout=60s

在 Google Cloud 控制台中,确认与别名 IP 结合使用的 IP 地址是否已预留。IP 地址可以是用于别名 IP 地址的 IP 地址,也可以是新的 IP 地址。

$ gcloud compute addresses list --filter="region:( cluster-region )"

如果该 IP 地址已预留并分配给主虚拟机实例,则其状态将显示为 IN_USE。当您将该 IP 重新分配给负载均衡器时,首先要从活跃主实例中取消分配该 IP,此时其状态会变为 RESERVED

如果 list 命令返回的 IP 地址不包含此地址,请立即预留该地址以防止将来发生地址冲突。

$ gcloud compute addresses create vip-name \
  --region cluster-region --subnet cluster-subnet \
  --addresses vip-address

再次列出您的地址,以确认该 IP 地址是否显示为 RESERVED

配置 Cloud Load Balancing 故障切换支持

具有故障切换支持的内部直通式网络负载均衡器服务会根据健康检查服务将流量路由到 SAP HANA 集群中的活跃主机。

为避免冲突并允许在迁移完成之前进行测试,以下说明可让您创建临时转发规则,该规则使用 VIP 地址所在子网中的占位 IP 地址。当您准备好切换 VIP 实现时,可以创建使用 VIP 地址的新的最终转发规则。

为虚拟 IP 预留临时 IP 地址

VIP 地址跟随活跃 SAP HANA 系统。负载均衡器将发送到 VIP 的流量路由到当前正在托管活跃 SAP HANA 系统的虚拟机。

  1. 打开 Cloud Shell:

    打开 Cloud Shell

  2. 在别名 IP 所在的子网中预留临时 IP 地址,以便进行测试。如果您省略 --addresses 标志,系统会为您选择指定子网中的 IP 地址:

    $ gcloud compute addresses create VIP_NAME \
      --region CLUSTER_REGION --subnet CLUSTER_SUBNET \
      --addresses VIP_ADDRESS

    如需详细了解如何预留静态 IP 地址,请参阅预留静态内部 IP 地址

  3. 确认 IP 地址预留:

    $ gcloud compute addresses describe VIP_NAME \
      --region CLUSTER_REGION

    您应该会看到类似于以下示例的输出:

    address: 10.0.0.19
    addressType: INTERNAL
    creationTimestamp: '2020-05-20T14:19:03.109-07:00'
    description: ''
    id: '8961491304398200872'
    kind: compute#address
    name: vip-for-hana-ha
    networkTier: PREMIUM
    purpose: GCE_ENDPOINT
    region: https://www.googleapis.com/compute/v1/projects/example-project-123456/regions/us-central1
    selfLink: https://www.googleapis.com/compute/v1/projects/example-project-123456/regions/us-central1/addresses/vip-for-hana-ha
    status: RESERVED
    subnetwork: https://www.googleapis.com/compute/v1/projects/example-project-123456/regions/us-central1/subnetworks/example-subnet-us-central1

为您的主机虚拟机创建实例组

  1. 在 Cloud Shell 中,创建两个非代管实例组,并将主要主实例主机虚拟机分配给其中一个实例组,同时将辅助主实例主机虚拟机分配给另一个实例组:

    $ gcloud compute instance-groups unmanaged create PRIMARY_IG_NAME \
      --zone=PRIMARY_ZONE
    $ gcloud compute instance-groups unmanaged add-instances PRIMARY_IG_NAME \
      --zone=PRIMARY_ZONE \
      --instances=PRIMARY_HOST_NAME
    $ gcloud compute instance-groups unmanaged create SECONDARY_IG_NAME \
      --zone=SECONDARY_ZONE
    $ gcloud compute instance-groups unmanaged add-instances SECONDARY_IG_NAME \
      --zone=SECONDARY_ZONE \
      --instances=SECONDARY_HOST_NAME
    
  2. 确认已创建实例组:

    $ gcloud compute instance-groups unmanaged list

    您应该会看到类似于以下示例的输出:

    NAME          ZONE           NETWORK          NETWORK_PROJECT        MANAGED  INSTANCES
    hana-ha-ig-1  us-central1-a  example-network  example-project-123456 No       1
    hana-ha-ig-2  us-central1-c  example-network  example-project-123456 No       1

创建 Compute Engine 健康检查

  1. 在 Cloud Shell 中,创建健康检查。对于健康检查使用的端口,请选择专用范围 (49152-65535) 内的端口,以避免与其他服务发生冲突。检查间隔和超时值略大于默认值,其目的是为了在 Compute Engine 实时迁移事件期间提高故障切换容忍度。您可以根据需要调整这些值:

    $ gcloud compute health-checks create tcp HEALTH_CHECK_NAME --port=HEALTHCHECK_PORT_NUM \
      --proxy-header=NONE --check-interval=10 --timeout=10 --unhealthy-threshold=2 \
      --healthy-threshold=2
  2. 确认已创建健康检查:

    $ gcloud compute health-checks describe HEALTH_CHECK_NAME

    您应该会看到类似于以下示例的输出:

    checkIntervalSec: 10
    creationTimestamp: '2020-05-20T21:03:06.924-07:00'
    healthyThreshold: 2
    id: '4963070308818371477'
    kind: compute#healthCheck
    name: hana-health-check
    selfLink: https://www.googleapis.com/compute/v1/projects/example-project-123456/global/healthChecks/hana-health-check
    tcpHealthCheck:
     port: 60000
     portSpecification: USE_FIXED_PORT
     proxyHeader: NONE
    timeoutSec: 10
    type: TCP
    unhealthyThreshold: 2

为健康检查创建防火墙规则

为专用范围内的端口定义防火墙规则,用于允许从 Compute Engine 健康检查使用的 IP 地址范围(35.191.0.0/16130.211.0.0/22)访问您的主机虚拟机。如需了解详情,请参阅为健康检查创建防火墙规则

  1. 如果您还没有为主机虚拟机添加网络标记,请先添加。此网络标记由防火墙规则用于健康检查。

    $ gcloud compute instances add-tags PRIMARY_HOST_NAME \
      --tags NETWORK_TAGS \
      --zone PRIMARY_ZONE
    $ gcloud compute instances add-tags SECONDARY_HOST_NAME \
      --tags NETWORK_TAGS \
      --zone SECONDARY_ZONE
    
  2. 如果您还没有防火墙规则,请创建一条防火墙规则来允许健康检查:

    $ gcloud compute firewall-rules create RULE_NAME \
      --network NETWORK_NAME \
      --action ALLOW \
      --direction INGRESS \
      --source-ranges 35.191.0.0/16,130.211.0.0/22 \
      --target-tags NETWORK_TAGS \
      --rules tcp:HLTH_CHK_PORT_NUM

    例如:

    gcloud compute firewall-rules create  fw-allow-health-checks \
    --network example-network \
    --action ALLOW \
    --direction INGRESS \
    --source-ranges 35.191.0.0/16,130.211.0.0/22 \
    --target-tags cluster-ntwk-tag \
    --rules tcp:60000

配置负载均衡器和故障切换组

  1. 创建负载均衡器后端服务:

    $ gcloud compute backend-services create BACKEND_SERVICE_NAME \
      --load-balancing-scheme internal \
      --health-checks HEALTH_CHECK_NAME \
      --no-connection-drain-on-failover \
      --drop-traffic-if-unhealthy \
      --failover-ratio 1.0 \
      --region CLUSTER_REGION \
      --global-health-checks
  2. 将主实例组添加到后端服务:

    $ gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
      --instance-group PRIMARY_IG_NAME \
      --instance-group-zone PRIMARY_ZONE \
      --region CLUSTER_REGION
  3. 将辅助故障切换实例组添加到后端服务:

    $ gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
      --instance-group SECONDARY_IG_NAME \
      --instance-group-zone SECONDARY_ZONE \
      --failover \
      --region CLUSTER_REGION
  4. 创建临时转发规则。对于 IP 地址,请指定您为测试预留的临时 IP 地址。如果您需要从下面指定的区域外部访问 SAP HANA 系统,请在定义中添加 --allow-global-access 标志:

    $ gcloud compute forwarding-rules create RULE_NAME \
      --load-balancing-scheme internal \
      --address VIP_ADDRESS \
      --subnet CLUSTER_SUBNET \
      --region CLUSTER_REGION \
      --backend-service BACKEND_SERVICE_NAME \
      --ports ALL

    如需详细了解跨区域访问 SAP HANA 高可用性系统,请参阅内部 TCP/UDP 负载均衡

测试负载均衡器配置

即使您的后端实例组在稍后完成相应配置之前不会被注册为运行状况良好,您仍然可以通过设置监听器响应健康检查来测试负载均衡器配置。设置监听器后,如果负载均衡器配置正确,则后端实例组的状态会变为运行状况良好。

以下部分介绍了可用于测试配置的各种不同方法。

使用 socat 实用程序测试负载均衡器

您可以使用 socat 实用程序来临时监听健康检查端口。无论如何,您都需要安装 socat 实用程序,因为稍后在配置集群资源时会用到它。

  1. 在两个主机虚拟机上,以根用户的身份安装 socat 实用程序:

    # zypper install -y socat

  2. 启动 socat 进程以监听健康检查端口 60 秒:

    # timeout 60s socat - TCP-LISTEN:HLTH_CHK_PORT_NUM,fork

  3. 在 Cloud Shell 中,等待几秒钟,让健康检查检测到监听器,然后检查后端实例组的运行状况:

    $ gcloud compute backend-services get-health BACKEND_SERVICE_NAME \
      --region CLUSTER_REGION

    您将看到如下所示的输出:

    ---
    backend: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-a/instanceGroups/hana-ha-ig-1
    status:
     healthStatus:
     ‐ healthState: HEALTHY
       instance: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-a/instances/hana-ha-vm-1
       ipAddress: 10.0.0.35
       port: 80
     kind: compute#backendServiceGroupHealth
    ---
    backend: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-c/instanceGroups/hana-ha-ig-2
    status:
     healthStatus:
     ‐ healthState: HEALTHY
       instance: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-c/instances/hana-ha-vm-2
       ipAddress: 10.0.0.34
       port: 80
     kind: compute#backendServiceGroupHealth

使用端口 22 测试负载均衡器

如果主机虚拟机上的端口 22 对于 SSH 连接是打开的,则您可以将健康检查程序临时修改为使用端口 22,该端口上具有可以响应健康检查程序的监听器。

若要临时使用端口 22,请按以下步骤操作:

  1. 点击控制台中的健康检查:

    转到“健康检查”页面

  2. 点击修改

  3. 端口字段中,将端口号更改为 22。

  4. 点击保存,然后等待一两分钟。

  5. 在 Cloud Shell 中,检查后端实例组的运行状况:

    $ gcloud compute backend-services get-health BACKEND_SERVICE_NAME \
      --region CLUSTER_REGION

    您将看到如下所示的输出:

    ---
    backend: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-a/instanceGroups/hana-ha-ig-1
    status:
     healthStatus:
     ‐ healthState: HEALTHY
       instance: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-a/instances/hana-ha-vm-1
       ipAddress: 10.0.0.35
       port: 80
     kind: compute#backendServiceGroupHealth
    ---
    backend: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-c/instanceGroups/hana-ha-ig-2
    status:
     healthStatus:
     ‐ healthState: HEALTHY
       instance: https://www.googleapis.com/compute/v1/projects/example-project-123456/zones/us-central1-c/instances/hana-ha-vm-2
       ipAddress: 10.0.0.34
       port: 80
     kind: compute#backendServiceGroupHealth
  6. 完成后,将健康检查端口号更改回原始端口号。

迁移 VIP 实现以使用负载均衡器

以下步骤会修改 Pacemaker 集群配置和负载均衡器转发规则,以便完成 VIP 迁移。

准备系统进行修改

  1. 如果可以,停止 SAP 应用连接到 SAP HANA 数据库,因为您将暂时中断连接以交换 IP 地址。NetWeaver 工作流程能够重新连接到该数据库,但您可能会遇到故障或挂起的情况,这会中断连接。确保您的 IP 在目标地区中属于您的 VPC 的内部范围中注册。

  2. 在活跃主实例上以根用户身份将集群置于维护模式:

    $ crm configure property maintenance-mode="true"

  3. 备份集群配置:

    $ crm configure show > clusterconfig.backup

取消分配别名 IP

  1. 在 Cloud Shell 中,确认分配给 SAP HANA 主实例的别名 IP 范围:

    $ gcloud compute instances describe \
        primary-host-name \
        --zone primary-zone \
        --format="flattened(name,networkInterfaces[].aliasIpRanges)"
  2. 在 Google Cloud 控制台中,更新网络接口。如果您不需要保留任何别名 IP,请指定 --aliases ""

    $ gcloud compute instances network-interfaces update primary-host-name \
    --zone primary-zone \
    --aliases "ip-ranges-to-retain"

创建 VIP 转发规则和清理 VIP 转发规则

  1. 在 Google Cloud 控制台中,为负载均衡器创建新的前端转发规则,并将之前用于别名 IP 的 IP 地址指定为 IP 地址。这是您的 VIP。

    $ gcloud compute forwarding-rules create rule-name \
      --load-balancing-scheme internal \
      --address vip-address \
      --subnet cluster-subnet \
      --region cluster-region \
      --backend-service backend-service-name \
      --ports ALL
  2. 确认转发规则的创建并记下要删除的临时转发规则的名称:

    $ gcloud compute forwarding-rules list
  3. 删除临时转发规则:

    $ gcloud compute forwarding-rules delete rule-name --region=cluster-region
  4. 释放您预留的临时 IP 地址:

    $ gcloud compute addresses delete temp-ip-name --region=cluster-region

在集群配置中修改 VIP 原初资源

  1. 在主实例上以根用户身份修改 VIP 原初资源定义。如果集群由 Google Cloud 提供的 Deployment Manager 模板创建,则 VIP 原始资源名称为 rsc_vip_gcp-primary

    $ crm configure edit rsc_name

    资源定义会在文本编辑器中打开,例如 vi。

  2. 对 Pacemaker HA 集群配置中的 VIP 资源进行以下更改:

    • 将资源类 ocf:gcp:alias 替换为 anything
    • op monitor 间隔更改为 interval=10s
    • op monitor 超时更改为 timeout=20s
    • 移除 op startop stop 操作定义
    • 移除meta priority=10
    • 将别名 IP 参数:
      alias_ip="10.0.0.10/32" hostlist="example-ha-vm1 example-ha-vm2" gcloud_path="/usr/bin/gcloud" logging=yes
      替换为健康检查服务参数:
      binfile="/usr/bin/socat" cmdline_options="-U TCP-LISTEN:healthcheck-port-num,backlog=10,fork,reuseaddr /dev/null"

    例如,替换以下别名 IP 示例中的粗体条目:

    primitive rsc_vip_gcp-primary ocf:gcp:alias \
        op monitor interval=60s timeout=60s \
        op start interval=0 timeout=180s \
        op stop interval=0 timeout=180s \
        params alias_ip="10.0.0.10/32" hostlist="example-ha-vm1 example-ha-vm2" gcloud_path="/usr/bin/gcloud" logging=yes \
        meta priority=10

    完成修改后,健康检查服务的资源定义应如以下示例所示:

    primitive rsc_vip_gcp-primary anything \
        op monitor interval=10s timeout=20s \
        params binfile="/usr/bin/socat" cmdline_options="-U TCP-LISTEN:healthcheck-port-num,backlog=10,fork,reuseaddr /dev/null"

    在上述示例中,HC port 是您在创建健康检查和配置 Socat 实用程序时指定的健康检查端口。

  3. 让集群退出维护模式:

    $ crm configure property maintenance-mode="false"

测试更新后的 HA 集群

在应用实例中,通过发出以下任一命令来确认您是否可以访问数据库:

  • sidadm 用户身份:

    > R3trans -d
  • 以任意用户身份:

    telnet VIP HANA SQL port

    nc -zv VIP HANA SQL port