將 SLES HA 叢集中的 VIP 遷移至內部負載平衡器

在 Google Cloud上,建議您使用內部 TCP/UDP 負載平衡器的備援支援功能,為 SAP 的 OS 高可用性 (HA) 叢集實作虛擬 IP 位址 (VIP)。

如果您在 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 地址

以 root 身分,在主要 VM 執行個體上顯示現有的別名 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 位址已保留並分配給主要 VM 執行個體,其狀態會顯示為 IN_USE。將 IP 重新指派給負載平衡器時,您必須先從有效的主要執行個體中釋放 IP,此時其狀態會變更為 RESERVED

如果 IP 位址不在清單指令傳回的 IP 位址中,請立即保留該位址,以免日後發生位址衝突:

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

再次列出地址,確認 IP 位址顯示為 RESERVED

設定 Cloud Load Balancing 容錯移轉支援功能

內部直通式網路負載平衡器服務提供容錯支援,可根據健康檢查服務將流量轉送至 SAP HANA 叢集中的有效主機。

為了避免發生衝突,並在遷移作業完成前進行測試,這些操作說明會讓您建立暫時轉送規則,其中的預留位置 IP 位址來自與 VIP 位址相同的子網路。準備好切換 VIP 實作項目時,請使用 VIP 地址建立新的最終轉送規則。

為虛擬 IP 保留臨時 IP 位址

VIP 位址會追隨啟用的 SAP HANA 系統。負載平衡器會將傳送至 VIP 的流量,路由至目前代管啟用中 SAP HANA 系統的 VM。

  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

為主機 VM 建立執行個體群組

  1. 在 Cloud Shell 中建立兩個非代管執行個體群組,並將主要主機 VM 指派給其中一個,將次要主機 VM 指派給另一個:

    $ 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 健康檢查 35.191.0.0/16130.211.0.0/22 使用的 IP 範圍存取主機 VM。詳情請參閱「建立健康狀態檢查的防火牆規則」。

  1. 如果您尚未建立網路代碼,請在主機 VM 中新增網路代碼。防火牆規則會使用這個網路標記進行健康狀態檢查。

    $ 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. 在兩個主機 VM 上以超級使用者的身分安裝 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 號通訊埠測試負載平衡器

如果主機 VM 上的 SSH 連線已開啟通訊埠 22,您可以暫時編輯健康檢查器,讓它使用通訊埠 22,這個通訊埠有可回應健康檢查器的監聽器。

如要暫時使用 22 個連接埠,請按照下列步驟操作:

  1. 在主控台中按一下健康狀態檢查:

    前往「Health checks」(健康狀態檢查) 頁面

  2. 按一下 [編輯]

  3. 在「Port」欄位中,將通訊埠號碼變更為 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 位址已註冊在目標區域中屬於虛擬私有雲網路的內部範圍。

  2. 以作用中主要執行個體的 root 身分,將叢集設為維護模式:

    $ 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 轉送規則並清理

  1. 在 Google Cloud 主控台中,為負載平衡器建立新的前端轉送規則,並指定先前用於別名 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"

測試更新後的高可用性叢集

從應用程式執行個體,透過發出下列任一指令,確認您可以存取資料庫:

  • sidadm 使用者:

    > R3trans -d
  • 任何使用者:

    telnet VIP HANA SQL port

    nc -zv VIP HANA SQL port