SUSE Linux Enterprise Server 上の Azure VM での NFS の高可用性

この記事では、仮想マシンのデプロイと構成、クラスター フレームワークのインストール、可用性の高い SAP システムの共有データを格納するために使用できる高可用性 NFS サーバーのインストールの方法について説明します。 このガイドでは、NW1 と NW2 の 2 つの SAP システムで使用される高可用性 NFS サーバーを設定する方法について説明します。 この例のリソース (仮想マシン、仮想ネットワークなど) の名前は、リソース プレフィックスが prodSAP ファイル サーバー テンプレートを使用していることを想定しています。

注意

この記事には、Microsoft が使用しなくなった "スレーブ" と "マスター" という用語への言及があります。 ソフトウェアからこれらの用語が削除された時点で、この記事から削除します。

はじめに、次の SAP Note およびガイドを確認してください

概要

高可用性を実現するため、SAP NetWeaver には NFS サーバーが必要です。 NFS サーバーは別のクラスターで構成されており、複数の SAP システムが使用できます。

SAP NetWeaver の高可用性の概要

NFS サーバーは、この NFS サーバーを使用するすべての SAP システムに専用の仮想ホスト名と仮想 IP アドレスを使用します。 Azure では、仮想 IP アドレスを使用するためにロード バランサーが必要になります。 ロード バランサーの構成を次に示します。

  • フロントエンドの構成
    • IP アドレス 10.0.0.4 (NW1)
    • IP アドレス 10.0.0.5 (NW2)
  • バックエンドの構成
    • NFS クラスターに含める必要のあるすべての仮想マシンのプライマリ ネットワーク インターフェイスに接続済み
  • プローブ ポート
    • ポート 61000 (NW1)
    • ポート 61001 (NW2)
  • 負荷分散規則 (基本的なロード バランサーを使用している場合)
    • 2049 TCP (NW1)
    • 2049 UDP (NW1)
    • 2049 TCP (NW2)
    • 2049 UDP (NW2)

高可用性 NFS サーバーの設定

GitHub にある Azure テンプレートを使用して、仮想マシン、可用性セット、ロード バランサーなどの必要なすべての Azure リソースをデプロイできます。また、各リソースを手動でデプロイすることもできます。

Azure テンプレートを使用した Linux のデプロイ

Azure Marketplace には、SUSE Linux Enterprise Server for SAP Applications 12 のイメージが含まれており、新しい仮想マシンのデプロイに使用できます。 GitHub にあるいずれかのクイック スタート テンプレートを使用して、必要なすべてのリソースをデプロイできます。 テンプレートでは、仮想マシン、ロード バランサー、可用性セットなどをデプロイできます。テンプレートをデプロイするには、次の手順に従います。

  1. Azure portal で SAP ファイル サーバー テンプレートを開きます
  2. 次のパラメーターを入力します
    1. Resource Prefix (リソース プレフィックス)
      使用するプレフィックスを入力します。 この値は、デプロイされるリソースのプレフィックスとして使用されます。
    2. SAP System Count (SAP システム数)
      このファイル サーバーを使用する SAP システムの数を入力します。 これにより、必要な量のフロントエンド構成、負荷分散規則、プローブ ポート、ディスクなどがデプロイされます。
    3. OS の種類
      いずれかの Linux ディストリビューションを選択します。 この例では、SLES 12 を選択します。
    4. [管理ユーザー名] と[管理パスワード]
      コンピューターへのログオンで使用できる新しいユーザーが作成されます。
    5. サブネット ID
      VM を既存の VNet にデプロイする場合、その VNet で VM の割り当て先サブネットが定義されているときは、その特定のサブネットの ID を指定します。 通常、この ID は、/subscriptions/ <サブスクリプション ID> /resourceGroups/ <リソース グループ名> /providers/Microsoft.Network/virtualNetworks/ <仮想ネットワーク名> /subnets/ <サブネット名> のようになります。

Azure Portal を使用した手動による Linux のデプロイ

まず、この NFS クラスターの仮想マシンを作成する必要があります。 その後、ロード バランサーを作成し、バックエンド プール内の仮想マシンを使用します。

  1. リソース グループを作成します
  2. 仮想ネットワークを作成します
  3. 可用性セットを作成します
    更新ドメインの最大数を設定します
  4. 仮想マシン 1 を作成します。SLES4SAP 12 SP3 以上を使用してください。この例では、SLES4SAP 12 SP3 BYOS イメージ SLES For SAP Applications 12 SP3 (BYOS) が使用されています
    前に作成された可用性セットを選択します
  5. 仮想マシン 2 を作成します。SLES4SAP 12 SP3 以上を使用してください。この例では、SLES4SAP 12 SP3 BYOS イメージを使用します
    SLES For SAP Applications 12 SP3 (BYOS) が使用されています
    前に作成された可用性セットを選択します
  6. SAP システムごとに 1 つのデータ ディスクを両方の仮想マシンに追加します。
  7. ロード バランサー (内部) を作成します。 Standard Load Balancer をお勧めします。
    1. Standard Load Balancer を作成するには、こちらの手順に従います。
      1. フロントエンド IP アドレスを作成します
        1. IP アドレス 10.0.0.4 (NW1)
          1. ロード バランサーを開き、[フロントエンド IP プール] を選択して [追加] をクリックします
          2. 新規のフロントエンド IP プールの名前を入力します (例: nw1-frontend)
          3. 割り当てを "静的" に設定し、IP アドレスを入力します (例: 10.0.0.4)
          4. [OK] をクリックします
        2. IP アドレス 10.0.0.5 (NW2)
          • NW2 に対して上記の手順を繰り返します
      2. バックエンド プールを作成します
        1. NFS クラスターに含める必要のあるすべての仮想マシンのプライマリ ネットワーク インターフェイスに接続済み
          1. ロード バランサーを開き、[バックエンド プール] を選択して [追加] をクリックします
          2. 新規のバックエンド プールの名前を入力します (例: nw-backend)
          3. [仮想ネットワーク] を選択します
          4. [仮想マシンの追加] をクリックします
          5. NFS クラスターの仮想マシンとその IP アドレスを選択します。
          6. [追加] をクリックします。
      3. 正常性プローブを作成します
        1. ポート 61000 (NW1)
          1. ロード バランサーを開き、[正常性プローブ] を選択して [追加] をクリックします
          2. 新しい正常性プローブの名前を入力します (例: nw1-hp)
          3. プロトコルに TCP、ポートに 610 00 を選択し、[間隔] は 5、[異常] のしきい値は 2 のままにしておきます
          4. [OK] をクリックします
        2. ポート 61001 (NW2)
          • 上記の手順を繰り返して、NW2 に対して正常性プローブを作成します
      4. 負荷分散規則
        1. ロード バランサーを開き、負荷分散規則を選択して [追加] をクリックします
        2. 新しいロード バランサー規則の名前を入力します (例: nw1-lb)
        3. 前の手順で作成したフロントエンド IP アドレス、バックエンド プール、正常性プローブを選択します (例: nw1-frontend)。 nw-backendnw1-hp)
        4. [HA ポート] を選択します。
        5. Floating IP を有効にします
        6. [OK] をクリックします
        • 上記の手順を繰り返して、NW2 の負荷分散規則を作成します
    2. または、シナリオに基本的なロード バランサーが必要な場合は、次の手順に従ってください。
      1. フロントエンド IP アドレスを作成します
        1. IP アドレス 10.0.0.4 (NW1)
          1. ロード バランサーを開き、[フロントエンド IP プール] を選択して [追加] をクリックします
          2. 新規のフロントエンド IP プールの名前を入力します (例: nw1-frontend)
          3. 割り当てを "静的" に設定し、IP アドレスを入力します (例: 10.0.0.4)
          4. [OK] をクリックします
        2. IP アドレス 10.0.0.5 (NW2)
          • NW2 に対して上記の手順を繰り返します
      2. バックエンド プールを作成します
        1. NFS クラスターに含める必要のあるすべての仮想マシンのプライマリ ネットワーク インターフェイスに接続済み
          1. ロード バランサーを開き、[バックエンド プール] を選択して [追加] をクリックします
          2. 新規のバックエンド プールの名前を入力します (例: nw-backend)
          3. [仮想マシンの追加] をクリックします
          4. 前の手順で作成した可用性セットを選択します
          5. NFS クラスターの仮想マシンを選択します
          6. [OK] をクリックします
      3. 正常性プローブを作成します
        1. ポート 61000 (NW1)
          1. ロード バランサーを開き、[正常性プローブ] を選択して [追加] をクリックします
          2. 新しい正常性プローブの名前を入力します (例: nw1-hp)
          3. プロトコルに TCP、ポートに 610 00 を選択し、[間隔] は 5、[異常] のしきい値は 2 のままにしておきます
          4. [OK] をクリックします
        2. ポート 61001 (NW2)
          • 上記の手順を繰り返して、NW2 に対して正常性プローブを作成します
      4. 負荷分散規則
        1. 2049 TCP (NW1)
          1. ロード バランサーを開き、[負荷分散規則] を選択して [追加] をクリックします
          2. 新しいロード バランサー規則の名前を入力します (例: nw1-lb-2049)
          3. 前の手順で作成したフロントエンド IP アドレス、バックエンド プール、正常性プローブを選択します (例: nw1-frontend)
          4. プロトコルは TCP のままにし、ポートに「2049」を入力します
          5. アイドル タイムアウトを 30 分に増やします
          6. Floating IP を有効にします
          7. [OK] をクリックします
        2. 2049 UDP (NW1)
          • 上記の手順を繰り返して、NW1 に対してポート 2049 と UDP を設定します
        3. 2049 TCP (NW2)
          • 上記の手順を繰り返して、NW2 に対してポート 2049 と TCP を設定します
        4. 2049 UDP (NW2)
          • 上記の手順を繰り返して、NW2 に対してポート 2049 と UDP を設定します

重要

フローティング IP は、負荷分散シナリオの NIC セカンダリ IP 構成ではサポートされていません。 詳細については、Azure Load Balancer の制限事項に関する記事を参照してください。 VM に追加の IP アドレスが必要な場合は、2 つ目の NIC をデプロイします。

注意

パブリック IP アドレスのない VM が、内部 (パブリック IP アドレスがない) Standard の Azure Load Balancer のバックエンド プール内に配置されている場合、パブリック エンドポイントへのルーティングを許可するように追加の構成が実行されない限り、送信インターネット接続はありません。 送信接続を実現する方法の詳細については、「SAP の高可用性シナリオにおける Azure Standard Load Balancer を使用した Virtual Machines のパブリック エンドポイント接続」を参照してください。

重要

Azure Load Balancer の背後に配置された Azure VM では TCP タイムスタンプを有効にしないでください。 TCP タイムスタンプを有効にすると正常性プローブが失敗することになります。 パラメーター net.ipv4.tcp_timestamps0 に設定します。 詳しくは、「Load Balancer の正常性プローブ」を参照してください。

Pacemaker クラスターの作成

Azure の SUSE Linux Enterprise Server に Pacemaker をセットアップする」の手順に従って、この NFS サーバーに対して基本的な Pacemaker クラスターを作成します。

NFS サーバーの構成

次の各手順の先頭には、 [A] - 全ノードが該当、 [1] - ノード 1 のみ該当、 [2] - ノード 2 のみ該当、のいずれかが付いています。

  1. [A] ホスト名解決を設定します

    DNS サーバーを使用するか、すべてのノードの /etc/hosts を変更します。 この例では、/etc/hosts ファイルを使用する方法を示しています。 次のコマンドの IP アドレスとホスト名を置き換えます

    sudo vi /etc/hosts
    

    次の行を /etc/hosts に挿入します。 お使いの環境に合わせて IP アドレスとホスト名を変更します

    # IP address of the load balancer frontend configuration for NFS
    10.0.0.4 nw1-nfs
    10.0.0.5 nw2-nfs
    
  2. [A] NFS サーバーを有効にします

    ルートの NFS エクスポート エントリを作成します

    sudo sh -c 'echo /srv/nfs/ *\(rw,no_root_squash,fsid=0\)>/etc/exports'
    
    sudo mkdir /srv/nfs/
    
  3. [A] drbd コンポーネントをインストールします

    sudo zypper install drbd drbd-kmp-default drbd-utils
    
  4. [A] drbd デバイス用のパーティションを作成します

    使用可能なすべてのデータ ディスクを表示します

    sudo ls /dev/disk/azure/scsi1/
    

    出力例

    lun0  lun1
    

    すべてのデータ ディスクのパーティションを作成します

    sudo sh -c 'echo -e "n\n\n\n\n\nw\n" | fdisk /dev/disk/azure/scsi1/lun0'
    sudo sh -c 'echo -e "n\n\n\n\n\nw\n" | fdisk /dev/disk/azure/scsi1/lun1'
    
  5. [A] LVM 構成を作成します

    使用可能なすべてのパーティションを表示します

    ls /dev/disk/azure/scsi1/lun*-part*
    

    出力例

    /dev/disk/azure/scsi1/lun0-part1  /dev/disk/azure/scsi1/lun1-part1
    

    すべてのパーティションに LVM ボリュームを作成します

    sudo pvcreate /dev/disk/azure/scsi1/lun0-part1  
    sudo vgcreate vg-NW1-NFS /dev/disk/azure/scsi1/lun0-part1
    sudo lvcreate -l 100%FREE -n NW1 vg-NW1-NFS
    
    sudo pvcreate /dev/disk/azure/scsi1/lun1-part1
    sudo vgcreate vg-NW2-NFS /dev/disk/azure/scsi1/lun1-part1
    sudo lvcreate -l 100%FREE -n NW2 vg-NW2-NFS
    
  6. [A] drbd を構成します

    sudo vi /etc/drbd.conf
    

    drbd.conf ファイルに次の 2 行が含まれていることを確認します

    include "drbd.d/global_common.conf";
    include "drbd.d/*.res";
    

    グローバルな drbd 構成を変更します

    sudo vi /etc/drbd.d/global_common.conf
    

    ハンドラーと net セクションに次のエントリを追加します。

    global {
         usage-count no;
    }
    common {
         handlers {
              fence-peer "/usr/lib/drbd/crm-fence-peer.sh";
              after-resync-target "/usr/lib/drbd/crm-unfence-peer.sh";
              split-brain "/usr/lib/drbd/notify-split-brain.sh root";
              pri-lost-after-sb "/usr/lib/drbd/notify-pri-lost-after-sb.sh; /usr/lib/drbd/notify-emergency-reboot.sh; echo b > /proc/sysrq-trigger ; reboot -f";
         }
         startup {
              wfc-timeout 0;
         }
         options {
         }
         disk {
              md-flushes yes;
              disk-flushes yes;
              c-plan-ahead 1;
              c-min-rate 100M;
              c-fill-target 20M;
              c-max-rate 4G;
         }
         net {
              after-sb-0pri discard-younger-primary;
              after-sb-1pri discard-secondary;
              after-sb-2pri call-pri-lost-after-sb;
              protocol     C;
              tcp-cork yes;
              max-buffers 20000;
              max-epoch-size 20000;
              sndbuf-size 0;
              rcvbuf-size 0;
         }
    }
    
  7. [A] NFS drbd デバイスを作成します

    sudo vi /etc/drbd.d/NW1-nfs.res
    

    新しい drbd デバイスの構成を挿入し、終了します

    resource NW1-nfs {
         protocol     C;
         disk {
              on-io-error       detach;
         }
         on prod-nfs-0 {
              address   10.0.0.6:7790;
              device    /dev/drbd0;
              disk      /dev/vg-NW1-NFS/NW1;
              meta-disk internal;
         }
         on prod-nfs-1 {
              address   10.0.0.7:7790;
              device    /dev/drbd0;
              disk      /dev/vg-NW1-NFS/NW1;
              meta-disk internal;
         }
    }
    
    sudo vi /etc/drbd.d/NW2-nfs.res
    

    新しい drbd デバイスの構成を挿入し、終了します

    resource NW2-nfs {
         protocol     C;
         disk {
              on-io-error       detach;
         }
         on prod-nfs-0 {
              address   10.0.0.6:7791;
              device    /dev/drbd1;
              disk      /dev/vg-NW2-NFS/NW2;
              meta-disk internal;
         }
         on prod-nfs-1 {
              address   10.0.0.7:7791;
              device    /dev/drbd1;
              disk      /dev/vg-NW2-NFS/NW2;
              meta-disk internal;
         }
    }
    

    drbd デバイスを作成し、起動します

    sudo drbdadm create-md NW1-nfs
    sudo drbdadm create-md NW2-nfs
    sudo drbdadm up NW1-nfs
    sudo drbdadm up NW2-nfs
    
  8. [1] 初期同期をスキップします

    sudo drbdadm new-current-uuid --clear-bitmap NW1-nfs
    sudo drbdadm new-current-uuid --clear-bitmap NW2-nfs
    
  9. [1] プライマリ ノードを設定します

    sudo drbdadm primary --force NW1-nfs
    sudo drbdadm primary --force NW2-nfs
    
  10. [1] 新しい drbd デバイスが同期されるまで待ちます

    sudo drbdsetup wait-sync-resource NW1-nfs
    sudo drbdsetup wait-sync-resource NW2-nfs
    
  11. [1] drbd デバイス上にファイル システムを作成します

    sudo mkfs.xfs /dev/drbd0
    sudo mkdir /srv/nfs/NW1
    sudo chattr +i /srv/nfs/NW1
    sudo mount -t xfs /dev/drbd0 /srv/nfs/NW1
    sudo mkdir /srv/nfs/NW1/sidsys
    sudo mkdir /srv/nfs/NW1/sapmntsid
    sudo mkdir /srv/nfs/NW1/trans
    sudo mkdir /srv/nfs/NW1/ASCS
    sudo mkdir /srv/nfs/NW1/ASCSERS
    sudo mkdir /srv/nfs/NW1/SCS
    sudo mkdir /srv/nfs/NW1/SCSERS
    sudo umount /srv/nfs/NW1
    
    sudo mkfs.xfs /dev/drbd1
    sudo mkdir /srv/nfs/NW2
    sudo chattr +i /srv/nfs/NW2
    sudo mount -t xfs /dev/drbd1 /srv/nfs/NW2
    sudo mkdir /srv/nfs/NW2/sidsys
    sudo mkdir /srv/nfs/NW2/sapmntsid
    sudo mkdir /srv/nfs/NW2/trans
    sudo mkdir /srv/nfs/NW2/ASCS
    sudo mkdir /srv/nfs/NW2/ASCSERS
    sudo mkdir /srv/nfs/NW2/SCS
    sudo mkdir /srv/nfs/NW2/SCSERS
    sudo umount /srv/nfs/NW2
    
  12. [A] drbd スプリット ブレイン検出を設定します

    drbd を使用してあるホストから別のホストにデータを同期するときに、スプリット ブレインと呼ばれる状況が発生することがあります。 スプリット ブレインは、両方のクラスター ノードの drbd デバイスがプライマリに昇格され、非同期になるシナリオです。これはまれな状況かもしれませんが、スプリット ブレインをできるだけ早く処理して解決する必要があります。 したがって、スプリット ブレインが発生したときに通知を受け取ることが重要です。

    スプリット ブレインの通知を設定する方法については、drbd の公式ドキュメントを参照してください。

    さらに、スプリット ブレイン シナリオから自動的に復旧することも可能です。 詳細については、「Automatic split brain recovery policies (自動スプリット ブレイン復旧ポリシー)」を参照してください

クラスター フレームワークの構成

  1. [1] SAP システム NW1 の NFS drbd デバイスをクラスター構成に追加します

    重要

    最近のテストで、バックログと 1 つの接続のみを処理するという制限があるため、netcat によって要求への応答が停止される状況があることが明らかになりました。 netcat リソースでは、Azure ロード バランサー要求のリッスンを停止し、フローティング IP は使用できなくなります。
    既存の Pacemaker クラスターについては、以前、netcat を socat に置き換えることをお勧めしました。 現時点では、resource-agents パッケージの一部である azure-lb リソース エージェントを使用することをお勧めしています。パッケージのバージョン要件は次のとおりです。

    • SLES 12 SP4/SP5 の場合、バージョンは resource-agents-4.3.018.a7fb5035-3.30.1 以上である必要があります。
    • SLES 15/15 SP1 の場合、バージョンは resource-agents-4.3.0184.6ee15eb2-4.13.1 以上である必要があります。

    変更には短時間のダウンタイムが必要であることに注意してください。
    既存の Pacemaker クラスターについては、「Azure Load-Balancer の検出のセキュリティ強化」で説明されているように、socat を使用するよう構成が既に変更されていた場合は、すぐに azure-lb リソース エージェントに切り替える必要はありません。

    sudo crm configure rsc_defaults resource-stickiness="200"
    
    # Enable maintenance mode
    sudo crm configure property maintenance-mode=true
    
    sudo crm configure primitive drbd_NW1_nfs \
      ocf:linbit:drbd \
      params drbd_resource="NW1-nfs" \
      op monitor interval="15" role="Master" \
      op monitor interval="30" role="Slave"
    
    sudo crm configure ms ms-drbd_NW1_nfs drbd_NW1_nfs \
      meta master-max="1" master-node-max="1" clone-max="2" \
      clone-node-max="1" notify="true" interleave="true"
    
    sudo crm configure primitive fs_NW1_sapmnt \
      ocf:heartbeat:Filesystem \
      params device=/dev/drbd0 \
      directory=/srv/nfs/NW1  \
      fstype=xfs \
      op monitor interval="10s"
    
    sudo crm configure primitive nfsserver systemd:nfs-server \
      op monitor interval="30s"
    sudo crm configure clone cl-nfsserver nfsserver
    
    sudo crm configure primitive exportfs_NW1 \
      ocf:heartbeat:exportfs \
      params directory="/srv/nfs/NW1" \
      options="rw,no_root_squash,crossmnt" clientspec="*" fsid=1 wait_for_leasetime_on_stop=true op monitor interval="30s"
    
    sudo crm configure primitive vip_NW1_nfs \
      IPaddr2 \
      params ip=10.0.0.4 cidr_netmask=24 op monitor interval=10 timeout=20
    
    sudo crm configure primitive nc_NW1_nfs azure-lb port=61000
    
    sudo crm configure group g-NW1_nfs \
      fs_NW1_sapmnt exportfs_NW1 nc_NW1_nfs vip_NW1_nfs
    
    sudo crm configure order o-NW1_drbd_before_nfs inf: \
      ms-drbd_NW1_nfs:promote g-NW1_nfs:start
    
    sudo crm configure colocation col-NW1_nfs_on_drbd inf: \
      g-NW1_nfs ms-drbd_NW1_nfs:Master
    
  2. [1] SAP システム NW2 の NFS drbd デバイスをクラスター構成に追加します

    # Enable maintenance mode
    sudo crm configure property maintenance-mode=true
    
    sudo crm configure primitive drbd_NW2_nfs \
      ocf:linbit:drbd \
      params drbd_resource="NW2-nfs" \
      op monitor interval="15" role="Master" \
      op monitor interval="30" role="Slave"
    
    sudo crm configure ms ms-drbd_NW2_nfs drbd_NW2_nfs \
      meta master-max="1" master-node-max="1" clone-max="2" \
      clone-node-max="1" notify="true" interleave="true"
    
    sudo crm configure primitive fs_NW2_sapmnt \
      ocf:heartbeat:Filesystem \
      params device=/dev/drbd1 \
      directory=/srv/nfs/NW2  \
      fstype=xfs \
      op monitor interval="10s"
    
    sudo crm configure primitive exportfs_NW2 \
      ocf:heartbeat:exportfs \
      params directory="/srv/nfs/NW2" \
      options="rw,no_root_squash,crossmnt" clientspec="*" fsid=2 wait_for_leasetime_on_stop=true op monitor interval="30s"
    
    sudo crm configure primitive vip_NW2_nfs \
      IPaddr2 \
      params ip=10.0.0.5 cidr_netmask=24 op monitor interval=10 timeout=20
    
    sudo crm configure primitive nc_NW2_nfs azure-lb port=61001
    
    sudo crm configure group g-NW2_nfs \
      fs_NW2_sapmnt exportfs_NW2 nc_NW2_nfs vip_NW2_nfs
    
    sudo crm configure order o-NW2_drbd_before_nfs inf: \
      ms-drbd_NW2_nfs:promote g-NW2_nfs:start
    
    sudo crm configure colocation col-NW2_nfs_on_drbd inf: \
      g-NW2_nfs ms-drbd_NW2_nfs:Master
    

    exportfs クラスター リソースの crossmnt オプションは、旧バージョンの SLES との下位互換性を維持するために、ドキュメントに含まれています。

  3. [1] メンテナンス モードを無効にします

    sudo crm configure property maintenance-mode=false
    

次の手順