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

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

如果您有現有的 Red Hat Enterprise Linux (RHEL) HA 叢集,用於 Google Cloud 上的 SAP,且使用的是透過別名 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 地址

以 root 身分,在主要 VM 執行個體上顯示現有的別名 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 位址已保留並分配給主要 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 公用程式,暫時監聽健康狀態檢查埠。

  1. 在兩個主機 VM 上安裝 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 號通訊埠測試負載平衡器

如果主機 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 身分,將叢集設為維護模式:

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

  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

安裝事件監聽器並建立健康檢查資源

如要設定健康狀態檢查資源,您必須先安裝事件監聽器。

安裝監聽器

負載平衡器會使用每個主機健康狀態檢查通訊埠上的監聽器,判斷 SAP HANA 叢集的主要執行個體執行的位置。1. 在主要和次要系統的 master 執行個體上以 root 身分安裝 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. 以 root 身分在每個主機上啟動服務,確認服務設定正確無誤:

    # systemctl start haproxy.service
  3. 在 Google Cloud 控制台的「負載平衡器」頁面中,按一下負載平衡器項目:

    「負載平衡」頁面

    在「負載平衡器詳細資料」頁面的「後端」部分,如果 HAProxy 服務在兩個主機上都處於有效狀態,則每個執行個體群組項目的「Healthy」欄會顯示 1/1

    螢幕截圖顯示兩個執行個體群組的「Healthy」(健康) 欄位中顯示「1/1」,表示兩者均為健康狀態。

  4. 在每個主機上停止 HAProxy 服務:

    # systemctl stop haproxy.service

    在每個主機上停止 HAProxy 服務後,每個執行個體群組的「Healthy」欄會顯示 0/1

    螢幕截圖顯示各執行個體群組的「Healthy」欄中顯示「0/1」,表示沒有有效的事件監聽器。

    稍後,在設定健康狀態檢查後,叢集會重新啟動主節點上的監聽器。

建立健康狀態檢查資源

  1. 在任一主機上以 root 身分,為 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

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

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

  • sidadm 使用者:

    > R3trans -d
  • 任何使用者:

    telnet VIP HANA SQL port

    nc -zv VIP HANA SQL port