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

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

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

如果您使用了 Google Cloud 提供的 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 地址是在 alias_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.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=10s

在 Cloud Console 中,确认与别名 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 故障转移支持

具有故障转移支持的内部 TCP/UDP 负载平衡服务会根据运行状况检查服务将流量路由到 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 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 地址:

    $ 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

测试负载平衡器配置

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

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

使用 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 实例的别名 IP 范围:

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

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

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

  1. 在 Cloud Console 中,为负载平衡器创建新的前端转发规则,并将之前用于别名 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
    • 将别名 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 \
        op start interval=0 timeout=180s \
        op stop interval=0 timeout=180s \
        params binfile="/usr/bin/socat" cmdline_options="-U TCP-LISTEN:healthcheck-port-num,backlog=10,fork,reuseaddr /dev/null" \
        meta priority=10

    在上述示例中,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