SLES HA クラスタ内の VIP を内部ロードバランサに移行する

Google Cloud で SAP 用の OS ベースの高可用性(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 を移行する方法について説明します。

前提条件

以下の手順は、エイリアス IP を使用して VIP を実装している、適切に構成された HA クラスタが Google Cloud 上に存在することを前提としています。

手順の概要:

  • VIP の代わりに一時的な転送ルールと IP アドレスを使用して、ロードバランサの構成とテストを行います。
  • クラスタをメンテナンス モードに設定します。予期しない動作を回避するため、可能な場合は SAP アプリケーション サーバーのインスタンスを停止します。
  • プライマリ ホストのエイリアス IP アドレスの割り当てを解除します。このアドレスはロードバランサの VIP になります。
  • Pacemaker クラスタの構成で次の操作を行います。
    • 既存の VIP リソースのクラスを変更します。
    • エイリアス IP の既存のパラメータをヘルスチェック サービスのパラメータに置き換えます。

既存の VIP アドレスを確認する

プライマリ VM インスタンスで、root 権限を使用して既存のエイリアス 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 アドレスが予約され、プライマリ VM インスタンスに割り当てられている場合、ステータスは IN_USE と表示されます。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 システムをホストしている 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 で 2 つの非マネージド インスタンス グループを作成し、プライマリ ホスト VM を 1 つのグループに、セカンダリ ホスト 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 のヘルスチェックで使用される IP 範囲(35.191.0.0/16130.211.0.0/22)からホスト VM へのアクセスを許可します。詳細については、ヘルスチェック用のファイアウォール ルールの作成をご覧ください。

  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. 両方のホスト VM に、root として 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. コンソールでヘルスチェックをクリックします。

    [ヘルスチェック] ページに移動

  2. [編集] をクリックします。

  3. [ポート] 項目で、ポート番号を 22 に変更します。

  4. [保存] をクリックし、1~2 分待ちます。

  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. アクティブなプライマリ インスタンスで root 権限を使用してクラスタをメンテナンス モードにします。

    $ 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 の転送ルールを作成してクリーンアップする

  1. Cloud Console で、ロードバランサ用の新しいフロントエンド転送ルールを作成します。以前にエイリアス IP 用として使用していた 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. プライマリ インスタンスで root 権限を使用して、VIP の基本リソースの定義を編集します。Google Cloud が提供する Deployment Manager テンプレートを使用してクラスタを作成した場合、VIP の基本リソースの名前は rsc_vip_gcp-primary です。

    $ crm configure edit rsc_name

    リソース定義がテキスト エディタ(vi など)で開きます。

  2. Pacemaker HA クラスタの構成内にある VIP のリソースを次のように変更します。

    • リソースクラス ocf:gcp:aliasanything に置き換えます。
    • 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