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

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

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

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

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

前提条件

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

步骤概述

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

确认现有 VIP 地址

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

$ pcs configure show

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

Resource rsc_alias (class=ocf provider=heartbeat type=gcp-vpc-move-vip) \
               Attributes: alias_ip=10.10.0.90/32
               Operations: monitor interval=60s timeout=60s (vip_hkn_00-monitor-interval-60s)
               start interval=0s timeout=600s
               stop interval=0s timeout=20s
Resource rsc_vip(class=ocf provider=heartbeat type=IPaddr2) \
               Attributes: cidr_netmask=32 ip=10.10.0.90 nic=eth0
               Operations: monitor interval=10s timeout=20s (vip_hkn_00-monitor-interval-10s)
               start interval=0s timeout=20s (vip_hkn_00-start-interval-0s)
               stop interval=0s timeout=20s (vip_hkn_00-stop-interval-0s)

在 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 实用程序来临时侦听健康检查端口。

  1. 在两个主机虚拟机上,安装 socat 实用程序:

    $ sudo yum install -y socat

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

    $ sudo 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. 在活跃主实例上以根用户身份将集群置于维护模式:

    $ pcs property set maintenance-mode="true"

  3. 备份集群配置:

    $ pcs config 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

安装侦听器并创建健康检查资源

如需配置健康检查资源,您需要先安装侦听器。

安装侦听器

负载均衡器在每个主机的健康检查端口上使用侦听器来确定 SAP HANA 集群主实例的运行位置。 1. 在主要和辅助系统上,以主实例上的根用户身份安装 TCP 监听器。这些说明将安装 HAProxy 并将其用作监听器。

# yum install haproxy

  1. 打开配置文件 haproxy.cfg 进行修改:

    # vi /etc/haproxy/haproxy.cfg
    1. haproxy.cfg默认值部分中,将 mode 更改为 tcp

    2. 默认值部分后,通过添加以下内容创建一个新部分:

      #---------------------------------------------------------------------
      # Health check listener port for SAP HANA HA cluster
      #---------------------------------------------------------------------
      listen healthcheck
        bind *:healthcheck-port-num

      绑定端口与您在创建健康检查时使用的端口相同。

      完成后,更新应类似于以下示例:

      #---------------------------------------------------------------------
      # common defaults that all the 'listen' and 'backend' sections will
      # use if not designated in their block
      #---------------------------------------------------------------------
      defaults
        mode                    tcp
        log                     global
        option                  tcplog
        option                  dontlognull
        option http-server-close
        # option forwardfor       except 127.0.0.0/8
        option                  redispatch
        retries                 3
        timeout http-request    10s
        timeout queue           1m
        timeout connect         10s
        timeout client          1m
        timeout server          1m
        timeout http-keep-alive 10s
        timeout check           10s
        maxconn                 3000
      
      #---------------------------------------------------------------------
      # Set up health check listener for SAP HANA HA cluster
      #---------------------------------------------------------------------
      listen healthcheck
       bind *:60000
  2. 在每个主机上,以根用户身份启动服务以确认其配置正确无误:

    # systemctl start haproxy.service
  3. 在 Google Cloud 控制台中的“负载均衡器”页面上,点击您的负载均衡器条目:

    “负载均衡”页面

    负载均衡器详情页面的后端部分中,如果两个主机上的 HAProxy 服务都处于活跃状态,则您会在每个实例组条目的运行状况良好列中看到 1/1

    该屏幕截图在两个实例组的“运行状况良好”列中都显示了“1/1”,这表示它们都运行状况良好。

  4. 在每个主机上,停止 HAProxy 服务:

    # systemctl stop haproxy.service

    在每个主机上停止 HAProxy 服务后,每个实例组的运行状况良好列中都会显示 0/1

    该屏幕截图在每个实例组的“运行状况良好”列中都显示了“0/1”,这表示没有处于活跃状态的监听器。

    稍后,在配置健康检查后,集群将在主节点上重启监听器。

创建健康检查资源

  1. 在任一主机上,以根用户身份为 HAProxy 服务创建健康检查资源:

    # pcs resource create healthcheck_resource_name service:haproxy op monitor interval=10s timeout=20s

修改集群配置以使用健康检查资源并移除别名资源

  1. 移除包含映射到 SAP HANA 主实例的别名 IP 资源的现有群组的 Colocation Constraints

    # pcs constraint remove colocation-alias-vip-group-sap_hana_resource_name
  2. 创建新的资源组,将 VIP 和健康检查资源组合在一起:

    # pcs resource group add rsc-group-namehealthcheck_resource_namevip_resource_name

    此命令会将别名 IP 和 VIP 资源的先前组名称替换为集群配置中的新资源组名称。

  3. 在集群配置中验证新的资源组名称:

    # pcs config show

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

    Group: ilb-vip-group
    Resource: vip_hkn_00 (class=ocf provider=heartbeat type=IPaddr2)
     Attributes: cidr_netmask=32 ip=10.10.0.90 nic=eth0
     Operations: monitor interval=10s timeout=20s (vip_hkn_00-monitor-interval-10s)
                 start interval=0s timeout=20s (vip_hkn_00-start-interval-0s)
                 stop interval=0s timeout=20s (vip_hkn_00-stop-interval-0s)
    Resource: ilb-health-check (class=service type=haproxy)
     Operations: monitor interval=60 timeout=100 (ilb-health-check-monitor-interval-60)
                 start interval=0s timeout=100 (ilb-health-check-start-interval-0s)
                 stop interval=0s timeout=100 (ilb-health-check-stop-interval-0s)
     
  4. 删除别名资源:

    # pcs resource delete alias_resource_name
  5. 验证集群状态:

    # pcs status

    您应该在输出中看到“资源组”部分,类似于以下示例:

    STONITH-hana-ha-vm-1   (stonith:fence_gce):    Started hana-ha-vm-2
    STONITH-hana-ha-vm-2   (stonith:fence_gce):    Started hana-ha-vm-1
    Clone Set: SAPHanaTopology_HA1_22-clone [SAPHanaTopology_HA1_22]
        Started: [ hana-ha-vm-1 hana-ha-vm-2 ]
    Master/Slave Set: SAPHana_HA1_22-master [SAPHana_HA1_22]
        Masters: [ hana-ha-vm-1 ]
        Slaves: [ hana-ha-vm-2 ]
    Resource Group: g-primary
        rsc_healthcheck_HA1        (service:haproxy):      Started hana-ha-vm-1
        rsc_vip_HA1_22     (ocf::heartbeat:IPaddr2):       Started hana-ha-vm-1
    

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

    # pcs property set maintenance-mode=false

测试更新后的 HA 集群

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

  • sidadm 用户身份:

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

    telnet VIP HANA SQL port

    nc -zv VIP HANA SQL port