Share via


SQL Server の RHEL フェールオーバー クラスター インスタンス (FCI) クラスターを構成する

適用対象:SQL Server - Linux

このガイドでは、Red Hat Enterprise Linux 上の SQL Server 用に 2 ノードの共有ディスク フェールオーバー クラスターを作成する手順について説明します。 クラスタリング レイヤーは、Pacemaker の上に構築された Red Hat Enterprise Linux (RHEL) HA アドオンに基づいています。 SQL Server インスタンスは、一方のノードでのみアクティブになります。

Note

Red Hat HA アドオンとドキュメントにアクセスするには、サブスクリプションが必要です。

次の図に示すように、2 台のサーバーに対してストレージが提示されます。 クラスタリング コンポーネント (Corosync と Pacemaker) によって、通信とリソース管理が調整されます。 1 台のサーバーで、ストレージ リソースと SQL Server へのアクティブ接続が行われます。 Pacemaker で障害が検出されると、クラスタリング コンポーネントによって他のノードにリソースが移動します。

Red Hat Enterprise Linux 7 共有ディスク SQL クラスター。

クラスター構成、リソース エージェント オプション、および管理の詳細については、RHEL リファレンス ドキュメントを参照してください。

Note

現時点では、Pacemaker との SQL Server の統合は、Windows 上の WSFC との統合ほどには連携していません。 SQL Server 内からは、クラスターの存在を認識することがなく、すべてのオーケストレーションはアウトサイドインで実行され、サービスは Pacemaker によりスタンドアロン インスタンスとして制御されます。 また、たとえば、dmvs sys.dm_os_cluster_nodes をクラスター化すると、sys.dm_os_cluster_properties はレコードを記録しません。 IP ではなく、文字列サーバー名をポイントする接続文字列を使用するには、仮想 IP リソースを作成するために使用する IP (以下のセクションで説明します) を、選択したサーバー名と共に DNS サーバーに登録する必要があります。

次のセクションでは、フェールオーバー クラスター ソリューションを設定する手順について説明します。

前提条件

次のエンドツーエンドのシナリオを完了するには、2 つのノード クラスターともう 1 つのサーバーをデプロイして NFS サーバーを構成するために、2 台のマシンが必要です。 次の手順では、これらのサーバーを構成する方法を示します。

各クラスター ノードでオペレーティング システムをセットアップして構成する

最初の手順は、クラスター ノード上のオペレーティング システムを構成することです。 このチュートリアルでは、HA アドオンの有効なサブスクリプションで RHEL を使用します。

各クラスター ノードに SQL Server をインストールして構成する

  1. 両方のノードに SQL Server をインストールしてセットアップします。 詳細については、SQL Server on Linux のインストールに関するページを参照してください。

  2. 構成目的の場合は、1 つのノードをプライマリ、もう 1 つをセカンダリとして指定します。 このガイドでは、以降でこれらの用語を使用します。

  3. セカンダリ ノードで SQL Server を停止して無効にします。

    次の例では、SQL Server を停止して無効にしています。

    sudo systemctl stop mssql-server
    sudo systemctl disable mssql-server
    

Note

セットアップ時に、SQL Server インスタンスのサーバー マスター キーが生成され、/var/opt/mssql/secrets/machine-key に配置されます。 Linux では、SQL Server は常に mssql というローカル アカウントとして実行されます。 ローカル アカウントであるため、その ID はノード間で共有されません。 したがって、プライマリ ノードから各セカンダリ ノードに暗号化キーをコピーして、サーバー マスター キーの暗号化を解除するために各ローカル mssql アカウントがそれにアクセスできるようにする必要があります。

  1. プライマリ ノードで、Pacemaker の SQL Server ログインを作成し、sp_server_diagnostics を実行するログイン権限を付与します。 Pacemaker は、このアカウントを使用して、SQL Server が実行されているノードを確認します。

    sudo systemctl start mssql-server
    

    sa アカウントを使用して SQL Server master データベースに接続し、次のように実行します。

    USE [master]
    GO
    CREATE LOGIN [<loginName>] with PASSWORD= N'<loginPassword>'
    
    ALTER SERVER ROLE [sysadmin] ADD MEMBER [<loginName>]
    

    または、より細かなレベルでアクセス許可を設定することもできます。 Pacemaker ログインでは、sp_server_diagnostics で正常性状態のクエリを実行するための VIEW SERVER STATE と、setupadmin と、ALTER ANY LINKED SERVER および sp_dropserver を実行することで FCI インスタンス名をリソース名で更新するための sp_addserver が必要です。

  2. プライマリ ノードで SQL Server を停止して無効にします。

  3. クラスター ノードごとにホスト ファイルを構成します。 ホスト ファイルには、すべてのクラスター ノードの IP アドレスと名前が含まれている必要があります。

    各ノードの IP アドレスを確認します。 次のスクリプトを実行すると、現在のノードの IP アドレスが表示されます。

    sudo ip addr show
    

    各ノードのコンピューター名を設定します。 各ノードに 15 文字以下の一意の名前を指定します。 コンピューター名は /etc/hosts に追加することで設定します。 次のスクリプトを使うと、vi/etc/hosts を編集できます。

    sudo vi /etc/hosts
    

    次の例では、sqlfcivm1 および sqlfcivm2 という名前の 2 つのノードが追加された /etc/hosts を示します。

    127.0.0.1   localhost localhost4 localhost4.localdomain4
    ::1       localhost localhost6 localhost6.localdomain6
    10.128.18.128 sqlfcivm1
    10.128.16.77 sqlfcivm2
    

次のセクションでは、共有ストレージを構成し、データベース ファイルをそのストレージに移動します。

共有ストレージを構成し、データベース ファイルを移動する

共有ストレージを提供するためのさまざまなソリューションがあります。 このチュートリアルでは、NFS を使用した共有ストレージの構成について説明します。 ベスト プラクティスに従い、Kerberos を使用して NFS をセキュリティで保護することをお勧めします (例は https://www.certdepot.net/rhel7-use-kerberos-control-access-nfs-network-shares/ にあります)。

警告

NFS をセキュリティで保護しない場合、ネットワークにアクセスして SQL ノードの IP アドレスになりすますことができるユーザーが、データ ファイルにアクセスできてしまいます。 常に、運用環境で使用する前にシステムの脅威をモデル化するようにしてください。 もう 1 つのストレージ オプションは、SMB ファイル共有を使用することです。

NFS を使用して共有ストレージを構成する

重要

4より前のバージョンの NFS サーバーでデータベース ファイルをホストすることは、このリリースではサポートされていません。 これには、クラスター化されていないインスタンス上のデータベースだけでなく、共有ディスクのフェールオーバー クラスタリングに NFS を使用することも含まれます。 Microsoft では、今後のリリースでその他の NFS サーバー バージョンを有効化することに取り組んでいます。

NFS サーバーで、次の手順を実行します。

  1. nfs-utils のインストール

    sudo yum -y install nfs-utils
    
  2. rpcbind を有効にして起動します

    sudo systemctl enable rpcbind && sudo systemctl start rpcbind
    
  3. nfs-server を有効にして起動します

    sudo systemctl enable nfs-server && sudo systemctl start nfs-server
    
  4. /etc/exports を編集して、共有するディレクトリをエクスポートします。 必要な共有ごとに 1 行が必要です。 次に例を示します。

    /mnt/nfs  10.8.8.0/24(rw,sync,no_subtree_check,no_root_squash)
    
  5. 共有をエクスポートします

    sudo exportfs -rav
    
  6. パスが共有またはエクスポートされていること、NFS サーバーから実行されていることを確認します

    sudo showmount -e
    
  7. SELinux で例外を追加します

    sudo setsebool -P nfs_export_all_rw 1
    
  8. サーバーのファイアウォールを開きます。

    sudo firewall-cmd --permanent --add-service=nfs
    sudo firewall-cmd --permanent --add-service=mountd
    sudo firewall-cmd --permanent --add-service=rpc-bind
    sudo firewall-cmd --reload
    

NFS 共有ストレージに接続するようにすべてのクラスター ノードを構成する

すべてのクラスター ノードで次の手順を実行します。

  1. nfs-utils のインストール

    sudo yum -y install nfs-utils
    
  2. クライアントと NFS サーバーのファイアウォールを開きます

    sudo firewall-cmd --permanent --add-service=nfs
    sudo firewall-cmd --permanent --add-service=mountd
    sudo firewall-cmd --permanent --add-service=rpc-bind
    sudo firewall-cmd --reload
    
  3. クライアント マシンで NFS 共有が表示されていることを確認します

    sudo showmount -e <IP OF NFS SERVER>
    
  4. すべてのクラスター ノードでこれらの手順を繰り返します。

NFS の使用の詳細については、次のリソースを参照してください。

共有ストレージを指すようにデータベース ファイルのディレクトリをマウントする

  1. プライマリ ノードの場合のみ、データベース ファイルを一時的な場所に保存します。次のスクリプトでは、新しい一時ディレクトリを作成し、データベース ファイルを新しいディレクトリにコピーして、古いデータベース ファイルを削除します。 SQL Server はローカル ユーザー mssql として実行されるため、マウントされた共有へのデータ転送後に、ローカル ユーザーが共有に読み取り/書き込みアクセスできるようにする必要があります。

    sudo su mssql
    mkdir /var/opt/mssql/tmp
    cp /var/opt/mssql/data/* /var/opt/mssql/tmp
    rm /var/opt/mssql/data/*
    exit
    
  2. すべてのクラスター ノードで、/etc/fstab ファイルを編集して mount コマンドを入れます。

    <IP OF NFS SERVER>:<shared_storage_path> <database_files_directory_path> nfs timeo=14,intr
    

    次のスクリプトは、この編集の例を示しています。

    10.8.8.0:/mnt/nfs /var/opt/mssql/data nfs timeo=14,intr
    

Note

ここで推奨されているようにファイル システム (FS) のリソースを使用する場合は、マウント コマンドを /etc/fstab に保持する必要はありません。 Pacemaker は、FS クラスター化されたリソースを開始するときに、フォルダーのマウントを処理します。 フェンスを使用すると、FS が 2 回マウントされることがなくなります。

  1. システムの mount -a コマンドを実行して、マウントされたパスを更新します。

  2. /var/opt/mssql/tmp に保存したデータベースとログ ファイルを新しくマウントされた共有 /var/opt/mssql/data にコピーします。 この手順は、プライマリ ノード上でのみ実行する必要があります。 mssql ローカル ユーザーに必ず読み取り/書き込み権限を付与してください。

    sudo chown mssql /var/opt/mssql/data
    sudo chgrp mssql /var/opt/mssql/data
    sudo su mssql
    cp /var/opt/mssql/tmp/* /var/opt/mssql/data/
    rm /var/opt/mssql/tmp/*
    exit
    
  3. SQL Server が新しいファイル パスで正常に起動されることを確認します。 これを各ノードで行います。 この時点では、一度に 1 つのノードだけで SQL Server を実行する必要があります。 両方が同時にデータ ファイルにアクセスしようとするため、両方とも同時に実行することはできません (両方のノードで誤って SQL Server が開始されるのを防ぐために、ファイル システムのクラスター リソースを使用して、共有が異なるノードによって 2 回マウントされないようにしてください)。 次のコマンドでは、SQL Server が起動され、状態が確認されてから、SQL Server が停止されます。

    sudo systemctl start mssql-server
    sudo systemctl status mssql-server
    sudo systemctl stop mssql-server
    

この時点で、SQL Server の両方のインスタンスが、共有ストレージ上のデータベース ファイルを使用して実行されるように構成されています。 次のステップでは、Pacemaker 用に SQL Server を構成します。

各クラスター ノードに Pacemaker をインストールして構成する

  1. 両方のクラスター ノードで、Pacemaker にログインするための SQL Server のユーザー名とパスワードを格納するファイルを作成します。 次のコマンドは、このファイルを作成および設定します。

    sudo touch /var/opt/mssql/secrets/passwd
    echo '<loginName>' | sudo tee -a /var/opt/mssql/secrets/passwd
    echo '<loginPassword>' | sudo tee -a /var/opt/mssql/secrets/passwd
    sudo chown root:root /var/opt/mssql/secrets/passwd
    sudo chmod 600 /var/opt/mssql/secrets/passwd
    
  2. 両方のクラスター ノードで、Pacemaker ファイアウォールのポートを開きます。 firewalld を使用してこれらのポートを開くには、次のコマンドを実行します。

    sudo firewall-cmd --permanent --add-service=high-availability
    sudo firewall-cmd --reload
    

    ビルトインの高可用性構成が備わっていない別のファイアウォールを使用する場合は、Pacemaker がクラスター内の他のノードと通信できるように、次のポートを開く必要があります。

    • TCP: ポート 2224、3121、21064
    • UDP: ポート 5405
  3. 各ノードに Pacemaker パッケージをインストールします。

    sudo yum install pacemaker pcs fence-agents-all resource-agents
    
  4. Pacemaker と Corosync のパッケージをインストールしたときに作成された既定のユーザー用のパスワードを設定します。 両方のノードで同じパスワードを使用します。

    sudo passwd hacluster
    
  5. pcsd サービスと Pacemaker を有効にし、起動します。 これにより、再起動後にノードはクラスターに再度参加できます。 両方のノードで、次のコマンドを実行します。

    sudo systemctl enable pcsd
    sudo systemctl start pcsd
    sudo systemctl enable pacemaker
    
  6. SQL Server の FCI リソース エージェントをインストールします。 両方のノードで、次のコマンドを実行します。

    sudo yum install mssql-server-ha
    

フェンス エージェントを構成する

STONITH デバイスでは、フェンス エージェントが提供されます。 「Azure の Red Hat Enterprise Linux に Pacemaker をセットアップする」では、Azure でこのクラスター用の STONITH デバイスを作成する方法の例が示されています。 環境の手順を変更します。

クラスターを作成する

  1. ノードのいずれかで、クラスターを作成します。

    sudo pcs cluster auth <nodeName1 nodeName2 ...> -u hacluster
    sudo pcs cluster setup --name <clusterName> <nodeName1 nodeName2 ...>
    sudo pcs cluster start --all
    
  2. SQL Server、ファイル システム、および仮想 IP リソースのクラスター リソースを構成し、クラスターに構成をプッシュします。 次の情報が必要です。

    • SQL Server リソース名: クラスター化された SQL Server のリソースの名前。
    • フローティングの IP リソース名: 仮想 IP アドレスのリソースの名前。
    • IP アドレス: SQL Server のクラスター化されたインスタンスに接続するのにクライアントが使用する IP アドレス。
    • ファイル システム リソース名: ファイル システム リソースの名前。
    • デバイス: NFS 共有パス
    • デバイス: 共有へのマウント先を示すローカル パス
    • fstype: ファイル共有のタイプ (つまり nfs)

    実際の環境に合わせて、次のスクリプトの値を更新します。 1 つのノードで実行し、クラスター化されたサービスを構成して開始します。

    sudo pcs cluster cib cfg
    sudo pcs -f cfg resource create <sqlServerResourceName> ocf:mssql:fci
    sudo pcs -f cfg resource create <floatingIPResourceName> ocf:heartbeat:IPaddr2 ip=<ip Address>
    sudo pcs -f cfg resource create <fileShareResourceName> Filesystem device=<networkPath> directory=<localPath> fstype=<fileShareType>
    sudo pcs -f cfg constraint colocation add <virtualIPResourceName> <sqlResourceName>
    sudo pcs -f cfg constraint colocation add <fileShareResourceName> <sqlResourceName>
    sudo pcs cluster cib-push cfg
    

    たとえば、次のスクリプトは、mssqlha という SQL Server のクラスター化されたリソースと、IP アドレスが 10.0.0.99 のフローティング IP のリソースを作成します。 また、ファイル システムのリソースを作成し、制約を追加して、すべてのリソースが SQL リソースと同じノードに併置されるようにします。

    sudo pcs cluster cib cfg
    sudo pcs -f cfg resource create mssqlha ocf:mssql:fci
    sudo pcs -f cfg resource create virtualip ocf:heartbeat:IPaddr2 ip=10.0.0.99
    sudo pcs -f cfg resource create fs Filesystem device="10.8.8.0:/mnt/nfs" directory="/var/opt/mssql/data" fstype="nfs"
    sudo pcs -f cfg constraint colocation add virtualip mssqlha
    sudo pcs -f cfg constraint colocation add fs mssqlha
    sudo pcs cluster cib-push cfg
    

    構成がプッシュされると、1 つのノードで SQL Server が起動します。

  3. SQL Server が起動されていることを確認します。

    sudo pcs status
    

    次の例は、Pacemaker が SQL Server のクラスター化されたインスタンスを正常に開始した場合の結果を示しています。

    fs     (ocf::heartbeat:Filesystem):    Started sqlfcivm1
    virtualip     (ocf::heartbeat:IPaddr2):      Started sqlfcivm1
    mssqlha  (ocf::mssql:fci): Started sqlfcivm1
    
    PCSD Status:
     sqlfcivm1: Online
     sqlfcivm2: Online
    
    Daemon Status:
     corosync: active/disabled
     pacemaker: active/enabled
     pcsd: active/enabled