Google Cloud で SAP 用の OS ベースの高可用性(HA)クラスタに仮想 IP アドレス(VIP)を実装する場合、内部 TCP / UDP ロードバランサのフェイルオーバー サポートを使用することをおすすめします。
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 を移行する方法について説明します。
前提条件
以下の手順は、エイリアス IP を使用して VIP を実装している、適切に構成された HA クラスタが Google Cloud 上に存在することを前提としています。
手順の概要
- VIP の代わりに一時的な転送ルールと IP アドレスを使用して、ロードバランサの構成とテストを行います。
- クラスタをメンテナンス モードに設定します。予期しない動作を回避するため、可能な場合は SAP アプリケーション サーバーのインスタンスを停止します。
- プライマリ ホストのエイリアス IP アドレスの割り当てを解除します。このアドレスはロードバランサの VIP になります。
- Pacemaker クラスタの構成で次の操作を行います。
- 既存の VIP リソースのクラスを変更します。
- エイリアス IP の既存のパラメータをヘルスチェック サービスのパラメータに置き換えます。
既存の VIP アドレスを確認する
プライマリ VM インスタンスで、root 権限を使用して既存のエイリアス IP ベースのクラスタの構成を表示します。
$
crm configure show
リソース定義では、VIP アドレス範囲が alias
リソースと IPaddr2
リソースにあります。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 をロードバランサに再割り当てする場合は、最初にアクティブ プライマリ インスタンスの割り当てを解除します。この時点でステータスが 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 システムをホストしている VM にルーティングします。
Cloud Shell を開きます。
エイリアス IP と同じサブネット内の一時的な IP アドレスをテスト用として予約します。
--addresses
フラグを省略すると、指定したサブネット内の IP アドレスが自動的に選択されます。$
gcloud compute addresses create VIP_NAME \ --region CLUSTER_REGION --subnet CLUSTER_SUBNET \ --addresses VIP_ADDRESS静的 IP の予約の詳細については、静的内部 IP アドレスの予約をご覧ください。
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 のインスタンス グループを作成する
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インスタンス グループが作成されたことを確認します。
$
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 ヘルスチェックを作成する
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ヘルスチェックが作成されたことを確認します。
$
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/16
と 130.211.0.0/22
)からホスト VM へのアクセスを許可します。詳細については、ヘルスチェック用のファイアウォール ルールの作成をご覧ください。
ホスト 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まだ作成していない場合は、ヘルスチェックを許可するファイアウォール ルールを作成します。
$
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
ロードバランサとフェイルオーバー グループを構成する
ロードバランサのバックエンド サービスを作成します。
$
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プライマリ インスタンス グループをバックエンド サービスに追加します。
$
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --instance-group PRIMARY_IG_NAME \ --instance-group-zone PRIMARY_ZONE \ --region CLUSTER_REGIONセカンダリのフェイルオーバー インスタンス グループをバックエンド サービスに追加します。
$
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --instance-group SECONDARY_IG_NAME \ --instance-group-zone SECONDARY_ZONE \ --failover \ --region CLUSTER_REGION一時的な転送ルールを作成します。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 ALLSAP HANA 高可用性システムへのリージョン間アクセスの詳細については、内部 TCP / UDP ロード バランシングをご覧ください。
ロードバランサの構成をテストする
バックエンド インスタンス グループはすぐには正常として登録されませんが、ヘルスチェックに応答するようにリスナーを設定することで、ロードバランサの構成をテストできます。リスナーを設定した後、ロードバランサが正しく構成されていれば、バックエンド インスタンス グループのステータスは正常に変わります。
以降のセクションでは、構成のテストに使用できるさまざまな方法について説明します。
socat
ユーティリティでロードバランサをテストする
socat
ユーティリティを使用して、ヘルスチェック ポートを一時的にリッスンできます。socat
ユーティリティは、後でクラスタ リソースを構成するときに使用するため、インストールしておく必要があります。
両方のホスト VM に、root として
socat
ユーティリティをインストールします。#
zypper install -y socatsocat
プロセスを開始して、ヘルスチェック ポートで 60 秒間リッスンします。#
timeout 60s socat - TCP-LISTEN:HLTH_CHK_PORT_NUM,forkCloud 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 を一時的に使用するには、次の手順に従います。
コンソールでヘルスチェックをクリックします。
[編集] をクリックします。
[ポート] 項目で、ポート番号を 22 に変更します。
[保存] をクリックし、1~2 分待ちます。
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
完了したら、ヘルスチェックのポート番号を元のポート番号に戻します。
ロードバランサを使用するように VIP の実装を移行する
以下の手順で、Pacemaker クラスタの構成とロードバランサの転送ルールを編集して、VIP の移行を完了します。
編集に向けてシステムの準備をする
可能であれば、SAP アプリケーションから SAP HANA データベースへの接続を一時的に停止します。これは、IP アドレスの交換の際に接続が短時間中断されるためです。NetWeaver のワークプロセスはデータベースに再接続する機能を備えていますが、障害やハングアップが発生する可能性があります。これは、接続を停止することによって回避できます。IP がターゲット リージョンの VPC に含まれる内部範囲に登録されていることを確認してください。
アクティブなプライマリ インスタンスで root 権限を使用してクラスタをメンテナンス モードにします。
$
crm configure property maintenance-mode="true"クラスタの構成をバックアップします。
$
crm configure show > clusterconfig.backup
エイリアス IP の割り振りを解除する
Cloud Shell で、SAP HANA のプライマリ インスタンスに割り振られているエイリアス IP の範囲を確認します。
$
gcloud compute instances describe \ primary-host-name \ --zone primary-zone \ --format="flattened(name,networkInterfaces[].aliasIpRanges)"Google Cloud コンソールで、ネットワーク インターフェースを更新します。保持する必要のあるエイリアス IP がない場合は、
--aliases ""
を指定します。$
gcloud compute instances network-interfaces update primary-host-name \ --zone primary-zone \ --aliases "ip-ranges-to-retain"
VIP の転送ルールを作成してクリーンアップする
Google Cloud コンソールで、ロードバランサ用の新しいフロントエンド転送ルールを作成します。以前にエイリアス 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転送ルールの作成を確認し、削除対象となる一時的な転送ルールの名前を書き留めます。
$
gcloud compute forwarding-rules list一時的な転送ルールを削除します。
$
gcloud compute forwarding-rules delete rule-name --region=cluster-region予約した一時的な IP アドレスを解放します。
$
gcloud compute addresses delete temp-ip-name --region=cluster-region
クラスタ構成内の VIP の基本リソースを編集する
プライマリ インスタンスで root 権限を使用して、VIP の基本リソースの定義を編集します。Google Cloud が提供する Deployment Manager テンプレートを使用してクラスタを作成した場合、VIP の基本リソースの名前は
rsc_vip_gcp-primary
です。$
crm configure edit rsc_nameリソース定義がテキスト エディタ(vi など)で開きます。
Pacemaker HA クラスタの構成内にある VIP のリソースを次のように変更します。
- リソースクラス
ocf:gcp:alias
をanything
に置き換えます。 op monitor
の間隔をinterval=10s
に変更します。op monitor
のタイムアウトをtimeout=20s
に変更します。op start
とop 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 ユーティリティを構成したときに指定したヘルスチェックのポートです。- リソースクラス
クラスタのメンテナンス モードを終了します。
$
crm configure property maintenance-mode="false"
更新された HA クラスタをテストする
アプリケーション インスタンスから、次のいずれかのコマンドを発行してデータベースにアクセスできることを確認します。
sidadm
ユーザーとして:>
R3trans -d任意のユーザーとして:
telnet VIP HANA SQL port
または
nc -zv VIP HANA SQL port