SQL Server 可用性グループ用の RHEL クラスターを構成する

適用対象: はいSQL Server (サポートされているすべてのバージョン) - Linux

このドキュメントでは、Red Hat Enterprise Linux 上の SQL Server 用に 3 ノードの可用性グループ クラスターを作成する方法について説明します。 高可用性を実現するため、Linux 上の可用性グループには 3 つのノードが必要です。可用性グループ構成の高可用性とデータ保護に関するページを参照してください。 クラスタリング レイヤーは、Pacemaker の上に構築された Red Hat Enterprise Linux (RHEL) HA アドオンに基づいています。

注意

Red Hat の完全なドキュメントにアクセスするには、有効なサブスクリプションが必要です。

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

注意

SQL Server は、Windows Server フェールオーバー クラスタリングと同じように、Linux 上の Pacemaker と密接に統合されていません。 SQL Server インスタンスはクラスターを認識しません。 Pacemaker は、クラスター リソース オーケストレーションを提供します。 また、仮想ネットワーク名は Windows Server フェールオーバー クラスタリングに固有のものであり、Pacemaker には対応するものがありません。 クラスター情報のクエリを実行する可用性グループの動的管理ビュー (DMV) では、Pacemaker クラスター上の空の行が返されます。 フェールオーバー後に透過的な再接続用のリスナーを作成するには、仮想 IP リソースの作成に使用される IP を使用して、リスナー名を DNS に手動で登録します。

以下のセクションでは、Pacemaker クラスターを設定し、高可用性のためにクラスターのリソースとして可用性グループを追加する手順について説明します。

ロードマップ

高可用性のために Linux サーバー上に可用性グループを作成する手順は、Windows Server フェールオーバー クラスターでの手順とは異なります。 以下に、おおまかな手順を説明します。

  1. クラスター ノードで SQL Server を構成します

  2. 可用性グループを作成します

  3. Pacemaker などのクラスター リソース マネージャーを構成します。 これらの手順についてはこのドキュメントで説明します。

    クラスター リソース マネージャーを構成する方法は、特定の Linux ディストリビューションによって異なります。

    重要

    運用環境では、高可用性のために STONITH のようなフェンス エージェントが必要です。 このドキュメントに含まれているデモでは、フェンス エージェントは使用しません。 このデモはテストと検証専用です。

    Linux クラスターでは、フェンスを使用して、クラスターが既知の状態に戻されます。 フェンスを構成する方法は、ディストリビューションと環境によって異なります。 現時点では、一部のクラウド環境ではフェンスを利用できません。 詳細については、RHEL 高可用性クラスターのサポート ポリシー (仮想化プラットフォーム) に関するページをご覧ください。

  4. 可用性グループをクラスターのリソースとして追加します

RHEL の高可用性を構成する

RHEL の高可用性を構成するには、高可用性サブスクリプションを有効にしてから、Pacemaker を構成します。

RHEL の高可用性サブスクリプションを有効にする

クラスター内の各ノードには、RHEL の適切なサブスクリプションと高可用性アドオンが必要です。 Red Hat Enterprise Linux に高可用性クラスター パッケージをインストールする方法に関するページで要件を確認してください。 サブスクリプションとリポジトリを構成するには、次の手順を実行します。

  1. システムを登録します。

    sudo subscription-manager register
    

    ユーザー名とパスワードを入力します。

  2. 登録に使用できるプールを一覧表示します。

    sudo subscription-manager list --available
    

    使用可能なプールの一覧から、高可用性サブスクリプションのプール ID を書き留めます。

  3. 次のスクリプトを更新します。 <pool id> を、前の手順の高可用性のプール ID に置き換えます。 スクリプトを実行してサブスクリプションをアタッチします。

    sudo subscription-manager attach --pool=<pool id>
    
  4. リポジトリを有効にします。

    RHEL 7

    sudo subscription-manager repos --enable=rhel-ha-for-rhel-7-server-rpms
    

    RHEL 8

    sudo subscription-manager repos --enable=rhel-8-for-x86_64-highavailability-rpms
    

詳細については、「Pacemaker - The Open Source, High Availability Cluster」を参照してください。

サブスクリプションを構成したら、次の手順を実行して Pacemaker を構成します。

Pacemaker を構成する

サブスクリプションを登録したら、次の手順を実行して Pacemaker を構成します。

  1. すべてのクラスター ノードで、Pacemaker のファイアウォール ポートを開きます。 firewalld を使用してこれらのポートを開くには、次のコマンドを実行します。

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

    ファイアウォールに高可用性構成が組み込まれていない場合、Pacemaker 用に次のポートを開きます。

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

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

    sudo passwd hacluster
    
  4. 再起動後にノードがクラスターに再度参加できるように、pcsd サービスと Pacemaker を有効にして開始します。 すべてのノードで次のコマンドを実行します。

    sudo systemctl enable pcsd
    sudo systemctl start pcsd
    sudo systemctl enable pacemaker
    
  5. クラスターを作成します。 クラスターを作成するには、次のコマンドを実行します。

    RHEL 7

    sudo pcs cluster auth <node1> <node2> <node3> -u hacluster -p <password for hacluster>
    sudo pcs cluster setup --name <clusterName> <node1> <node2> <node3> 
    sudo pcs cluster start --all
    sudo pcs cluster enable --all
    

    RHEL8

    RHEL 8 では、ノードを個別に認証する必要があります。 プロンプトが表示されたら、hacluster のユーザー名とパスワードを手動で入力します。

    sudo pcs host auth <node1> <node2> <node3>
    sudo pcs cluster setup <clusterName> <node1> <node2> <node3>
    sudo pcs cluster start --all
    sudo pcs cluster enable --all
    

    注意

    前に同じノードでクラスターを構成した場合は、pcs cluster setup を実行するときに --force オプションを使用する必要があります。 このオプションは、pcs cluster destroy を実行するのと同等です。 Pacemaker を再度有効にするために、sudo systemctl enable pacemaker を実行します。

  6. SQL Server の SQL Server リソース エージェントをインストールします。 すべてのノードで次のコマンドを実行します。

    sudo yum install mssql-server-ha
    

Pacemaker を構成した後、pcs を使用してクラスターを操作します。 クラスターから 1 つのノードですべてのコマンドを実行します。

フェンスを構成する (STONITH)

Pacemaker クラスターのベンダーは、STONITH を有効にして、サポートされているクラスター セットアップ用にフェンス デバイスを構成する必要があります。 STONITH は "Shoot the Other Node in The Head" の略です。 クラスター リソース マネージャーがノードまたはノード上のリソースの状態を判断できない場合は、フェンスによりクラスターが既知の状態に戻ります。

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

リソース レベルのフェンスは、リソースを構成することによって障害が発生した場合にデータが破損しないことを保証します。 たとえば、リソース レベルのフェンスを使用して、通信リンクがダウンしたときにノード上のディスクを期限切れとしてマークすることができます。

ノード レベルのフェンスでは、ノードによってリソースが実行されないことが保証されます。 これを行うには、ノードをリセットします。 Pacemaker は、さまざまなフェンス デバイスをサポートしています。 例として、無停電電源装置やサーバーの管理インターフェイスカードなどがあります。

STONITH、およびフェンスの詳細については、次の記事を参照してください。

注意

ノード レベルのフェンス構成は環境に大きく依存しているため、このチュートリアルでは無効にします (後で構成できます)。 次のスクリプトは、ノード レベルのフェンスを無効にします。

sudo pcs property set stonith-enabled=false

STONITH を無効にするのは、テスト目的の場合だけです。 運用環境で Pacemaker を使用する予定がある場合は、環境に応じて STONITH の実装を計画し、有効にしておく必要があります。

クラスター プロパティ cluster-recheck-interval を設定する

cluster-recheck-interval は、クラスターによってリソース パラメーター、制約、またはその他のクラスター オプションの変更が確認されるポーリング間隔を示します。 レプリカがダウンした場合、クラスターでは、failure-timeout 値と cluster-recheck-interval 値によってバインドされた間隔でレプリカの再起動が試みられます。 たとえば、failure-timeout が 60 秒に設定されていて、cluster-recheck-interval が 120 秒に設定されている場合、再起動は 60 秒より大きく 120 秒未満の間隔で試行されます。 failure-timeout は 60 秒、cluster-recheck-interval は 60 秒より大きい値に設定することをお勧めします。 cluster-recheck-interval を小さい値に設定することは推奨されません。

プロパティ値を 2 minutes に更新するには、次を実行します。

sudo pcs property set cluster-recheck-interval=2min

重要

使用可能な最新の Pacemaker パッケージ 1.1.18-11.el7 を使用しているすべてのディストリビューションでは、値が false の場合は start-failure-is-fatal クラスター設定の動作が変更されることにご注意ください。 この変更は、フェールオーバー ワークフローに影響します。 プライマリ レプリカで障害が発生した場合、クラスターは使用可能なセカンダリ レプリカのいずれかにフェールオーバーする必要があります。 代わりに、クラスターが失敗したプライマリ レプリカを起動しようとしていることがユーザーに通知されます。 そのプライマリが永久に停止したためにオンラインにならない場合は、クラスターが別の使用可能なセカンダリ レプリカにフェールオーバーすることはありません。 この変更により、以前に start-failure-is-fatal を設定するために推奨されていた構成が有効ではなくなったため、この設定を既定値の true に戻す必要があります。 さらに、failover-timeout プロパティを含めるには、AG リソースを更新する必要があります。

プロパティ値を true に更新するには、次を実行します。

sudo pcs property set start-failure-is-fatal=true

ag_cluster リソース プロパティ failure-timeout60s に更新するには、次を実行します。

pcs resource update ag_cluster meta failure-timeout=60s

Pacemaker クラスターのプロパティの詳細については、「Pacemaker クラスターのプロパティ」を参照してください。

Pacemaker 用の SQL Server ログインを作成する

  1. すべての SQL Server で、Pacemaker 用サーバー ログインを作成します。 次の Transact-SQL がログインを作成します。

    USE [master]
    GO
    CREATE LOGIN [pacemakerLogin] with PASSWORD= N'ComplexP@$$w0rd!'
    
    ALTER SERVER ROLE [sysadmin] ADD MEMBER [pacemakerLogin]
    

Pacemaker ユーザーには、可用性グループの作成時、作成後のそれへのノードの追加前に、可用性グループに対する ALTER、CONTROL、VIEW DEFINITION 権限が必要です。

  1. すべての SQL Server に、SQL Server ログインの資格情報を保存します

    echo 'pacemakerLogin' >> ~/pacemaker-passwd
    echo 'ComplexP@$$w0rd!' >> ~/pacemaker-passwd
    sudo mv ~/pacemaker-passwd /var/opt/mssql/secrets/passwd
    sudo chown root:root /var/opt/mssql/secrets/passwd
    sudo chmod 400 /var/opt/mssql/secrets/passwd # Only readable by root
    

可用性グループのリソースを作成する

可用性グループ リソースを作成するには、pcs resource create コマンドを使用し、リソースのプロパティを設定します。 次のコマンドを実行すると、ag1 という名前の可用性グループに対して、ocf:mssql:ag というマスター/下位タイプのリソースが作成されます。

RHEL 7

sudo pcs resource create ag_cluster ocf:mssql:ag ag_name=ag1 meta failure-timeout=60s master notify=true

RHEL 8

RHEL 8 が使用できるようになると共に、create 構文が変更されました。 RHEL 8 を使用している場合は、用語 masterpromotable に変更されています。 上記のコマンドの代わりに、次の create コマンドを使用します。

sudo pcs resource create ag_cluster ocf:mssql:ag ag_name=ag1 meta failure-timeout=60s promotable notify=true

注意

リソースを作成すると、以降は定期的に、可用性グループの構成に基づいて可用性グループの REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT の値を Pacemaker リソース エージェントが自動的に設定します。 たとえば、可用性グループに 3 つの同期レプリカがある場合、エージェントは REQUIRED_SYNCHRONIZED_SECONDARIES_TO_COMMIT1 に設定します。 詳細およびその他の構成オプションについては、「High availability and data protection for availability group configurations」 (可用性グループ構成の高可用性とデータ保護) を参照してください。

仮想 IP リソースを作成する

仮想 IP アドレス リソースを作成するには、1 つのノードで次のコマンドを実行します。 ネットワークから使用可能な静的 IP アドレスを使用します。 <10.128.16.240> 間の IP アドレスは有効な IP アドレスに置き換えてください。

sudo pcs resource create virtualip ocf:heartbeat:IPaddr2 ip=<10.128.16.240>

Pacemaker では、仮想サーバー名に相当するものはありません。 IP アドレスではなく文字列サーバー名を指す接続文字列を使用するには、DNS の仮想 IP リソース アドレスと必要な仮想サーバー名を登録します。 DR 構成の場合は、必要な仮想サーバー名と IP アドレスを、プライマリ サイトと DR サイトの両方の DNS サーバーに登録します。

コロケーション制約を追加する

リソースを実行する場所の選択など、Pacemaker クラスターでのほぼすべての決定は、スコアを比較することによって行われます。 スコアはリソースごとに計算されます。 クラスター リソース マネージャーは、特定のリソースのスコアが最も高いノードを選択します。 ノードにリソースの負のスコアがある場合、そのノードではリソースを実行できません。

Pacemaker クラスターでは、制約を使用してクラスターの決定を操作できます。 制約にはスコアがあります。 制約のスコアが INFINITY より低い場合、Pacemaker は推奨設定とみなします。 INFINITY のスコアは必須です。

プライマリ レプリカと仮想 IP リソースが同じホスト上で実行されるようにするには、INFINITY のスコアを持つコロケーション制約を定義します。 コロケーション制約を追加するには、1 つのノードで次のコマンドを実行します。

RHEL 7

RHEL 7 で ag_cluster リソースを作成すると、リソースが ag_cluster-masterとして作成されます。 RHEL 7 では、次のコマンドを使用します。

sudo pcs constraint colocation add virtualip ag_cluster-master INFINITY with-rsc-role=Master

RHEL 8

RHEL 8 で ag_cluster リソースを作成すると、リソースが ag_cluster-cloneとして作成されます。 RHEL 8 では、次のコマンドを使用します。

sudo pcs constraint colocation add virtualip with master ag_cluster-clone INFINITY with-rsc-role=Master

順序制約を追加する

コロケーション制約には、暗黙的な順序制約があります。 これにより、可用性グループ リソースが移動する前に、仮想 IP リソースが移動します。 既定では、イベントの順序は次のとおりです。

  1. ユーザーは、ノード 1 からノード 2 の可用性グループのプライマリに pcs resource move を発行します。

  2. 仮想 IP リソースがノード 1 で停止します。

  3. 仮想 IP リソースがノード 2 で開始します。

    注意

    この時点で、IP アドレスは一時的にノード 2 を指しますが、ノード 2 はフェールオーバー前のセカンダリのままです。

  4. ノード 1 の可用性グループのプライマリは、セカンダリに降格されます。

  5. ノード 2 の可用性グループのセカンダリは、プライマリに昇格されます。

IP アドレスが事前フェールオーバー セカンダリのノードを一時的に指さないようにするには、順序制約を追加します。

順序制約を追加するには、1 つのノードで次のコマンドを実行します。

RHEL 7

sudo pcs constraint order promote ag_cluster-master then start virtualip

RHEL 8

sudo pcs constraint order promote ag_cluster-clone then start virtualip

重要

クラスターを構成し、可用性グループをクラスター リソースとして追加した後は、Transact-SQL を使用して可用性グループ リソースをフェールオーバーすることはできません。 Linux 上の SQL Server クラスター リソースは、Windows Server フェールオーバー クラスター (WSFC) ほど、オペレーティング システムと緊密に結合されていません。 SQL Server サービスでは、クラスターの存在は認識されません。 すべてのオーケストレーションは、クラスター管理ツールを使用して実行されます。 RHEL または Ubuntu では pcs を使用し、SLES では crm ツールを使用します。

pcs を使用して可用性グループの手動フェールオーバーを行います。 Transact-SQL を使用してフェールオーバーを開始しないでください。 手順については、フェールオーバーに関するページを参照してください。

次のステップ

HA 可用性グループの操作