次の方法で共有


SQL Server on Linux の可用性グループを作成および構成する

適用対象:SQL Server on Linux

このチュートリアルでは、SQL Server on Linux 用の可用性グループ (AG) を作成して構成する方法について説明します。 WINDOWS 上の SQL Server 2016 (13.x) 以前のバージョンとは異なり、基になる Pacemaker クラスターを最初に作成するか、または作成せずに AG を有効にすることができます。 必要に応じて、クラスターとの統合は後で行われます。

チュートリアルには次のタスクが含まれます。

  • 可用性グループを有効にします。
  • 可用性グループのエンドポイントと証明書を作成します。
  • SQL Server Management Studio (SSMS) または Transact-SQL を使用して可用性グループを作成します。
  • Pacemaker の SQL Server ログインとアクセス許可を作成します。
  • Pacemaker クラスターに可用性グループのリソースを作成します (外部タイプのみ)。

前提条件

Pacemaker 高可用性クラスターを「SQL Server on Linux の Pacemaker クラスターをデプロイする」の説明に従ってデプロイします。

可用性グループ機能を有効にする

Windows とは異なり、PowerShell または SQL Server Configuration Manager を使用して可用性グループ (AG) 機能を有効にすることはできません。 Linux では、 mssql-conf ユーティリティを使用するか、 mssql.conf ファイルを手動で編集する 2 つの方法で可用性グループ機能を有効にすることができます。

重要

SQL Server Express でも、構成のみのレプリカに対して AG 機能を有効にする必要があります。

mssql-conf ユーティリティを使用する

プロンプトで、次のコマンドを実行します。

sudo /opt/mssql/bin/mssql-conf set hadr.hadrenabled 1

mssql ファイルを編集する

mssql.conf フォルダーの下にある/var/opt/mssql ファイルを変更することもできます。 次の行を追加します。

[hadr]

hadr.hadrenabled = 1

SQL Server を再起動する

可用性グループを有効にした後、SQL Server を再起動する必要があります。 次のコマンドを使用します。

sudo systemctl restart mssql-server

可用性グループのエンドポイントと証明書を作成する

可用性グループは通信に TCP エンドポイントを使用します。 Linux では、AG のエンドポイントがサポートされるのは、認証に証明書が使用される場合のみです。 同じ AG のレプリカとして参加している他のすべてのインスタンス上の 1 つのインスタンスから証明書を復元する必要があります。 証明書のプロセスは構成専用レプリカでも必要です。

エンドポイントを作成し、Transact-SQL を使用して証明書を復元することのみが可能です。 SQL Server で生成されていない証明書を使用することもできます。 また、証明書を管理したり有効期限が切れた証明書を置き換えるプロセスも必要です。

重要

SQL Server Management Studio ウィザードを使用して AG を作成する予定の場合でも、Linux で Transact-SQL を使用して証明書を作成および復元する必要があります。

さまざまなコマンドで使用できるオプション (追加のセキュリティなど) の完全な構文については、次を参照してください。

可用性グループを作成する場合でも、エンドポイントの種類として FOR DATABASE_MIRRORING を使用します。特徴の一部が、現在非推奨となっているこの機能と共通しているためです。

この例では、3 ノード構成の証明書を作成します。 インスタンス名は、LinAGN1LinAGN2、および LinAGN3 です。

  1. LinAGN1 で次のスクリプトを実行して、マスター キー、証明書、およびエンドポイントを作成し、証明書をバックアップします。 この例では、標準の TCP ポート 5022 がエンドポイントに使用されています。

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<master-key-password>';
    GO
    
    CREATE CERTIFICATE LinAGN1_Cert
    WITH SUBJECT = 'LinAGN1 AG Certificate';
    GO
    
    BACKUP CERTIFICATE LinAGN1_Cert
    TO FILE = '/var/opt/mssql/data/LinAGN1_Cert.cer';
    GO
    
    CREATE ENDPOINT AGEP
    STATE = STARTED
    AS TCP
    (
        LISTENER_PORT = 5022,
        LISTENER_IP = ALL
    )
    FOR DATABASE_MIRRORING
    (
        AUTHENTICATION = CERTIFICATE LinAGN1_Cert,
        ROLE = ALL
    );
    GO
    
  2. LinAGN2 で同じ操作を行います。

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<master-key-password>';
    GO
    
    CREATE CERTIFICATE LinAGN2_Cert
    WITH SUBJECT = 'LinAGN2 AG Certificate';
    GO
    
    BACKUP CERTIFICATE LinAGN2_Cert
    TO FILE = '/var/opt/mssql/data/LinAGN2_Cert.cer';
    GO
    
    CREATE ENDPOINT AGEP
    STATE = STARTED
    AS TCP
    (
        LISTENER_PORT = 5022,
        LISTENER_IP = ALL
    )
    FOR DATABASE_MIRRORING
    (
        AUTHENTICATION = CERTIFICATE LinAGN2_Cert,
        ROLE = ALL
    );
    GO
    
  3. 最後に、LinAGN3 で同じ手順を実行します。

    CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<master-key-password>';
    GO
    
    CREATE CERTIFICATE LinAGN3_Cert
    WITH SUBJECT = 'LinAGN3 AG Certificate';
    GO
    
    BACKUP CERTIFICATE LinAGN3_Cert
    TO FILE = '/var/opt/mssql/data/LinAGN3_Cert.cer';
    GO
    
    CREATE ENDPOINT AGEP
    STATE = STARTED
    AS TCP
    (
        LISTENER_PORT = 5022,
        LISTENER_IP = ALL
    )
    FOR DATABASE_MIRRORING
    (
        AUTHENTICATION = CERTIFICATE LinAGN3_Cert,
        ROLE = ALL
    );
    GO
    
  4. scp または別のユーティリティを使用して、証明書のバックアップを AG の一部となる各ノードにコピーします。

    この例の場合は次のとおりです。

    • LinAGN1_Cert.cerLinAGN2LinAGN3 にコピーします。
    • LinAGN2_Cert.cerLinAGN1LinAGN3 にコピーします。
    • LinAGN3_Cert.cerLinAGN1LinAGN2 にコピーします。
  5. 所有権と、コピーした証明書ファイルに関連付けられているグループを mssql に変更します。

    sudo chown mssql:mssql <CertFileName>
    
  6. LinAGN2LinAGN3 に関連付けられたインスタンスレベルのログインとユーザーを LinAGN1 上に作成します。

    CREATE LOGIN LinAGN2_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN2_User
    FOR LOGIN LinAGN2_Login;
    GO
    
    CREATE LOGIN LinAGN3_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN3_User
    FOR LOGIN LinAGN3_Login;
    GO
    

    注意事項

    パスワードは SQL Server の既定のパスワード ポリシーに従う必要があります。 既定では、パスワードの長さは少なくとも 8 文字で、大文字、小文字、10 進数の数字、記号の 4 種類のうち 3 種類を含んでいる必要があります。 パスワードには最大 128 文字まで使用できます。 パスワードはできるだけ長く、複雑にします。

  7. LinAGN2_CertLinAGN3_CertLinAGN1 を復元します。 他のレプリカの証明書があることが、AG の通信とセキュリティの重要な側面です。

    CREATE CERTIFICATE LinAGN2_Cert
        AUTHORIZATION LinAGN2_User
        FROM FILE = '/var/opt/mssql/data/LinAGN2_Cert.cer';
    GO
    
    CREATE CERTIFICATE LinAGN3_Cert
        AUTHORIZATION LinAGN3_User
        FROM FILE = '/var/opt/mssql/data/LinAGN3_Cert.cer';
    GO
    
  8. LinAGN2LinAGN3 に関連付けられたログインに、LinAGN1 のエンドポイントに接続するアクセス許可を付与します。

    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN2_Login;
    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN3_Login;
    
  9. LinAGN1LinAGN3 に関連付けられたインスタンスレベルのログインとユーザーを LinAGN2 上に作成します。

    CREATE LOGIN LinAGN1_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN1_User
    FOR LOGIN LinAGN1_Login;
    GO
    
    CREATE LOGIN LinAGN3_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN3_User
    FOR LOGIN LinAGN3_Login;
    GO
    
  10. LinAGN1_CertLinAGN3_CertLinAGN2 を復元します。

    CREATE CERTIFICATE LinAGN1_Cert
        AUTHORIZATION LinAGN1_User
        FROM FILE = '/var/opt/mssql/data/LinAGN1_Cert.cer';
    GO
    
    CREATE CERTIFICATE LinAGN3_Cert
        AUTHORIZATION LinAGN3_User
        FROM FILE = '/var/opt/mssql/data/LinAGN3_Cert.cer';
    GO
    
  11. LinAGN1LinAGN3 に関連付けられたログインに、LinAGN2 のエンドポイントに接続するアクセス許可を付与します。

    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN1_Login;
    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN3_Login;
    GO
    
  12. LinAGN1LinAGN2 に関連付けられたインスタンスレベルのログインとユーザーを LinAGN3 上に作成します。

    CREATE LOGIN LinAGN1_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN1_User
    FOR LOGIN LinAGN1_Login;
    GO
    
    CREATE LOGIN LinAGN2_Login
    WITH PASSWORD = '<password>';
    
    CREATE USER LinAGN2_User
    FOR LOGIN LinAGN2_Login;
    GO
    
  13. LinAGN1_CertLinAGN2_CertLinAGN3 を復元します。

    CREATE CERTIFICATE LinAGN1_Cert
        AUTHORIZATION LinAGN1_User
        FROM FILE = '/var/opt/mssql/data/LinAGN1_Cert.cer';
    GO
    
    CREATE CERTIFICATE LinAGN2_Cert
        AUTHORIZATION LinAGN2_User
        FROM FILE = '/var/opt/mssql/data/LinAGN2_Cert.cer';
    GO
    
  14. LinAG1LinAGN2 に関連付けられたログインに、LinAGN3 のエンドポイントに接続するアクセス許可を付与します。

    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN1_Login;
    GRANT CONNECT ON ENDPOINT::AGEP TO LinAGN2_Login;
    GO
    

可用性グループを作成する

このセクションでは、SQL Server Management Studio (SSMS) または Transact-SQL を使用して SQL Server の可用性グループを作成する方法について説明します。

SQL Server Management Studio を使用します

このセクションでは、新しい可用性グループ ウィザードを使用して、SSMS を使用する外部タイプのクラスターの AG を作成する方法を説明します。

  1. SSMS で、[Always On 高可用性] を展開し、[可用性グループ] を右クリックし、[新しい可用性グループ ウィザード] を選びます。

  2. [はじめに] ダイアログで [次へ] を選びます。

  3. [可用性グループ オプションの指定] ダイアログに、可用性グループの名前を入力し、ドロップダウンでクラスターのタイプとして [EXTERNAL] または [NONE] を選択します。 Pacemaker をデプロイするときに EXTERNAL を使用します。 NONEは、読み取りスケールアウトなどの特殊なシナリオに使用します。データベース レベルの正常性検出のオプションの選択は省略可能です。 このオプションについて詳しくは、「可用性グループのデータベース レベルの正常性検出フェールオーバー オプション」をご覧ください。 [次へ] を選択します。

    クラスターの種類を示す [可用性グループの作成] のスクリーンショット。

  4. [データベースの選択] ダイアログで、AG に参加するデータベースを選択します。 AG に追加するには、各データベースに完全バックアップが必要です。 [次へ] を選択します。

  5. [レプリカの指定] ダイアログで [レプリカの追加] を選びます。

  6. [サーバーに接続] ダイアログで、セカンダリ レプリカにする SQL Server の Linux インスタンスの名前と、接続するための資格情報を入力します。 [接続] を選択します。

  7. 前の 2 つの手順を、構成専用レプリカまたは別のセカンダリ レプリカを格納するインスタンスに対して繰り返します。

  8. 3 つのインスタンスはすべて、[レプリカの指定] ダイアログに表示されます。 クラスターの種類として External を使用する場合は、真のセカンダリとなるセカンダリ レプリカに対して、可用性モードがプライマリ レプリカの可用性モードと一致し、フェールオーバー モードが [外部] に設定されていることを確認します。 構成専用レプリカについては、可用性モードとして [構成のみ] を選択します。

    次の例に示す AG には、クラスター タイプ が [外部] のものと構成専用レプリカの 2 つのレプリカが含まれます。

    読み取り可能なセカンダリ オプションを示す可用性グループの作成のスクリーンショット。

    次の例に示す AG には、クラスター タイプ が [なし] のものと構成専用レプリカの 2 つのレプリカが含まれます。

    [レプリカ] ページを示す [可用性グループの作成] のスクリーンショット。

  9. バックアップの設定を変更する場合は、[バックアップの設定] タブを選びます。AG のバックアップ設定の詳細については、Always On 可用性グループのセカンダリ レプリカでのバックアップ構成に関する記事を参照してください。

  10. 読み取り可能なセカンダリを使用する場合、または読み取りスケール用にクラスターの種類が None の AG を作成する場合は、[リスナー] タブを選択して リスナー を作成できます。後でリスナーを追加することもできます。 リスナーを作成するには、[ 可用性グループ リスナーの作成 ] オプションを選択し、名前、TCP/IP ポート、静的または自動的に割り当てられた DHCP IP アドレスのどちらを使用するかを入力します。 クラスターの種類が None の AG の場合、IP は静的で、プライマリの IP アドレスに設定する必要があります。

    リスナー オプションを示す [可用性グループの作成] のスクリーンショット。

  11. 読み取り可能なシナリオのリスナーを作成する場合、SSMS ではウィザードで読み取り専用ルーティングを作成できます。 後で SSMS または Transact-SQL を使用して追加することもできます。 すぐに読み取り専用ルーティングを追加にするには:

    1. [読み取り専用ルーティング] タブを選択します。

    2. 読み取り専用レプリカの URL を入力します。 これらの URL はエンドポイントに似ていますが、エンドポイントではなくインスタンスのポートを使用する点が異なります。

    3. 各 URL を選択し、下部で読み取り可能なレプリカを選択します。 複数選択するには、Shift キーを押すか、選んでドラッグします。

  12. [次へ] を選択します。

  13. セカンダリ レプリカの初期化方法を選択します。 既定では、自動シード処理が使用されます。この場合、AG に参加しているすべてのサーバーで同じパスが必要になります。 また、ウィザードでバックアップ、コピー、復元を実行したり (2 番目の方法)、データベースを手動でバックアップし、コピーして、レプリカに復元した場合に、ウィザードを使用して参加させたり (3 番目の方法)、後からデータベースを追加したりすることもできます (最後の方法)。 証明書と同様に、バックアップを手動で作成してコピーする場合は、他のレプリカのバックアップ ファイルに対するアクセス許可を設定します。 [次へ] を選択します。

  14. [検証] ダイアログで、すべてが成功として返されない場合は調査します。 リスナーを作成しない場合など、一部の警告は許容され致命的ではありません。 [次へ] を選択します。

  15. [概要] ダイアログで [完了] を選びます。 これで、AG を作成するプロセスが開始されます。

  16. AG の作成が完了したら、[結果] で [閉じる] を選びます。 これで、動的管理ビューでレプリカに対する AG を表示することも、SSMS の [Always On 高可用性] フォルダーに AG を表示することもできるようになりました。

Transact-SQL の使用

このセクションでは、Transact-SQL を使用して AG を作成する例を示します。 AG の作成後に、リスナーと読み取り専用ルーティングを構成できます。 ALTER AVAILABILITY GROUPを使用して AG 自体を変更できますが、SQL Server 2017 (14.x) でクラスターの種類を変更することはできません。 タイプが [外部] のクラスターを含む AG を作成する予定ではなかった場合は、削除して、クラスター タイプ [なし] を含む AG を再作成する必要があります。 詳細およびその他のオプションについては、次のリンクを参照してください。

例 A - 構成専用レプリカの 2 つのレプリカ ([外部] クラスター タイプ)

この例では、構成専用レプリカを使用する、2 つのレプリカの AG を作成する方法を示します。

  1. プライマリ レプリカとして機能し、データベースの完全な読み取り/書き込みコピーを含むノードで、次のステートメントを実行します。 この例では自動シード処理を使用します。

    CREATE AVAILABILITY GROUP [<AGName>]
    WITH (CLUSTER_TYPE = EXTERNAL)
    FOR DATABASE <DBName>
    REPLICA ON
    N'LinAGN1' WITH (
       ENDPOINT_URL = N' TCP://LinAGN1.FullyQualified.Name:5022',
       FAILOVER_MODE = EXTERNAL,
       AVAILABILITY_MODE = SYNCHRONOUS_COMMIT
    ),
    N'LinAGN2' WITH (
       ENDPOINT_URL = N'TCP://LinAGN2.FullyQualified.Name:5022',
       FAILOVER_MODE = EXTERNAL,
       AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
       SEEDING_MODE = AUTOMATIC
    ),
    N'LinAGN3' WITH (
       ENDPOINT_URL = N'TCP://LinAGN3.FullyQualified.Name:5022',
       AVAILABILITY_MODE = CONFIGURATION_ONLY
    );
    GO
    
  2. 他のレプリカに接続されているクエリ ウィンドウで、次のステートメントを実行してレプリカを AG に参加させ、プライマリからセカンダリ レプリカへのシード処理を開始します。

    ALTER AVAILABILITY GROUP [<AGName>]
    JOIN WITH (CLUSTER_TYPE = EXTERNAL);
    GO
    
    ALTER AVAILABILITY GROUP [<AGName>]
    GRANT CREATE ANY DATABASE;
    GO
    
  3. 構成のみのレプリカに接続されているクエリ ウィンドウで、次のステートメントを実行して AG に参加させます。

    ALTER AVAILABILITY GROUP [<AGName>]
    JOIN WITH (CLUSTER_TYPE = EXTERNAL);
    GO
    

例 B - 読み取り専用ルーティングの 3 つのレプリカ ([外部] クラスター タイプ)

この例では、3 つの完全なレプリカと、最初の AG 作成の一部として読み取り専用ルーティングを構成する方法を示します。

  1. プライマリ レプリカとして機能し、データベースの完全な読み取り/書き込みコピーを含むノードで、次のステートメントを実行します。 この例では自動シード処理を使用します。

    CREATE AVAILABILITY GROUP [<AGName>] WITH (CLUSTER_TYPE = EXTERNAL)
    FOR DATABASE < DBName > REPLICA ON
        N'LinAGN1' WITH (
            ENDPOINT_URL = N'TCP://LinAGN1.FullyQualified.Name:5022',
            FAILOVER_MODE = EXTERNAL,
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(ALLOW_CONNECTIONS = READ_WRITE, READ_ONLY_ROUTING_LIST = (
                (
                    'LinAGN2.FullyQualified.Name',
                    'LinAGN3.FullyQualified.Name'
                    )
                )),
            SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL, READ_ONLY_ROUTING_URL = N'TCP://LinAGN1.FullyQualified.Name:1433')
        ),
        N'LinAGN2' WITH (
            ENDPOINT_URL = N'TCP://LinAGN2.FullyQualified.Name:5022',
            FAILOVER_MODE = EXTERNAL,
            SEEDING_MODE = AUTOMATIC,
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(ALLOW_CONNECTIONS = READ_WRITE, READ_ONLY_ROUTING_LIST = (
                (
                    'LinAGN1.FullyQualified.Name',
                    'LinAGN3.FullyQualified.Name'
                    )
                )),
            SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL, READ_ONLY_ROUTING_URL = N'TCP://LinAGN2.FullyQualified.Name:1433')
        ),
        N'LinAGN3' WITH (
            ENDPOINT_URL = N'TCP://LinAGN3.FullyQualified.Name:5022',
            FAILOVER_MODE = EXTERNAL,
            SEEDING_MODE = AUTOMATIC,
            AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(ALLOW_CONNECTIONS = READ_WRITE, READ_ONLY_ROUTING_LIST = (
                (
                    'LinAGN1.FullyQualified.Name',
                    'LinAGN2.FullyQualified.Name'
                    )
                )),
            SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL, READ_ONLY_ROUTING_URL = N'TCP://LinAGN3.FullyQualified.Name:1433')
        )
        LISTENER '<ListenerName>' (
            WITH IP = ('<IPAddress>', '<SubnetMask>'), Port = 1433
        );
    GO
    

    この構成に関する注意事項:

    • AGName は、可用性グループの名前です。
    • DBName は、可用性グループで使用するデータベースの名前です。 名前をコンマで区切って指定することもできます。
    • ListenerName は、基になる任意のサーバーまたはノードとは異なる名前です。 IPAddressと共に DNS に登録されます。
    • IPAddress は、 ListenerNameに関連付けられている IP アドレスです。 また、一意であり、どのサーバーまたはノードとも同じではありません。 アプリケーションおよびエンド ユーザーは、ListenerName または IPAddress を使用して AG に接続します。
      • SubnetMask は、IPAddress のサブネット マスクです。 SQL Server 2019 (15.x) 以前のバージョンでは、この値は 255.255.255.255。 SQL Server 2022 (16.x) 以降のバージョンでは、この値は 0.0.0.0
  2. 他のレプリカに接続されているクエリ ウィンドウで、次のステートメントを実行してレプリカを AG に参加させ、プライマリからセカンダリ レプリカへのシード処理を開始します。

    ALTER AVAILABILITY GROUP [<AGName>]
    JOIN WITH (CLUSTER_TYPE = EXTERNAL);
    GO
    
    ALTER AVAILABILITY GROUP [<AGName>]
    GRANT CREATE ANY DATABASE;
    GO
    
  3. 3 番目のレプリカに対して手順 2 を繰り返します。

例 C - 読み取り専用ルーティングの 2 つのレプリカ ([なし] クラスター タイプ)

この例では、クラスター タイプ [なし] を使用する 2 レプリカ構成を作成しています。 フェールオーバーが想定されない読み取りスケール シナリオでは、この構成を使用します。 この手順では、ラウンド ロビン機能を使用して、実際にはプライマリ レプリカであるリスナーと読み取り専用ルーティングを作成します。

  1. プライマリ レプリカとして機能し、データベースの完全な読み取り/書き込みコピーを含むノードで、次のステートメントを実行します。 この例では自動シード処理を使用します。

    CREATE AVAILABILITY GROUP [<AGName>]
    WITH (CLUSTER_TYPE = NONE)
    FOR DATABASE <DBName> REPLICA ON
        N'LinAGN1' WITH (
            ENDPOINT_URL = N'TCP://LinAGN1.FullyQualified.Name: <PortOfEndpoint>',
            FAILOVER_MODE = MANUAL,
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(
                ALLOW_CONNECTIONS = READ_WRITE,
                READ_ONLY_ROUTING_LIST = (('LinAGN1.FullyQualified.Name'.'LinAGN2.FullyQualified.Name'))
            ),
            SECONDARY_ROLE(
                ALLOW_CONNECTIONS = ALL,
                READ_ONLY_ROUTING_URL = N'TCP://LinAGN1.FullyQualified.Name:<PortOfInstance>'
            )
        ),
        N'LinAGN2' WITH (
            ENDPOINT_URL = N'TCP://LinAGN2.FullyQualified.Name:<PortOfEndpoint>',
            FAILOVER_MODE = MANUAL,
            SEEDING_MODE = AUTOMATIC,
            AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT,
            PRIMARY_ROLE(ALLOW_CONNECTIONS = READ_WRITE, READ_ONLY_ROUTING_LIST = (
                     ('LinAGN1.FullyQualified.Name',
                        'LinAGN2.FullyQualified.Name')
                     )),
            SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL, READ_ONLY_ROUTING_URL = N'TCP://LinAGN2.FullyQualified.Name:<PortOfInstance>')
        ),
        LISTENER '<ListenerName>' (WITH IP = (
                 '<PrimaryReplicaIPAddress>',
                 '<SubnetMask>'),
                Port = <PortOfListener>
        );
    GO
    

    この例では:

    • AGName は、可用性グループの名前です。
    • DBName は、可用性グループで使用するデータベースの名前です。 名前をコンマで区切って指定することもできます。
    • PortOfEndpoint は、作成するエンドポイントで使用されるポート番号です。
      • PortOfInstance は、SQL Server のインスタンスによって使用されるポート番号です。
    • ListenerName は、基になるレプリカとは異なる名前ですが、実際には使用されません。
    • PrimaryReplicaIPAddress は、プライマリ レプリカの IP アドレスです。
      • SubnetMask は、IPAddress のサブネット マスクです。 SQL Server 2019 (15.x) 以前のバージョンでは、この値は 255.255.255.255。 SQL Server 2022 (16.x) 以降のバージョンでは、この値は 0.0.0.0
  2. セカンダリ レプリカを AG に参加させ、自動シード処理を開始します。

    ALTER AVAILABILITY GROUP [<AGName>]
    JOIN WITH (CLUSTER_TYPE = NONE);
    GO
    
    ALTER AVAILABILITY GROUP [<AGName>]
    GRANT CREATE ANY DATABASE;
    GO
    

Pacemaker の SQL Server ログインおよびアクセス許可を作成する

Linux 上の SQL Server を使用する Pacemaker 高可用性クラスターには、SQL Server インスタンスへのアクセスと、可用性グループ自体に対するアクセス許可が必要です。 これらの手順では、ログインおよび関連するアクセス許可、さらに SQL Server へのログイン方法を Pacemaker に指示するファイルが作成されます。

  1. 最初のレプリカに接続しているクエリ ウィンドウで、次のスクリプトを実行します。

    CREATE LOGIN PMLogin WITH PASSWORD ='<password>';
    GO
    
    GRANT VIEW SERVER STATE TO PMLogin;
    GO
    
    GRANT ALTER, CONTROL, VIEW DEFINITION
    ON AVAILABILITY GROUP::<AGThatWasCreated> TO PMLogin;
    GO
    
  2. ノード 1 で、次のコマンドを入力します。

    sudo emacs /var/opt/mssql/secrets/passwd
    

    このコマンドを実行すると、Emacs エディターが開きます。

  3. エディターに次の 2 行を入力します。

    PMLogin
    
    <password>
    
  4. Ctrl キーを押したまま、X キー、C キーの順に押し、ファイルを終了して保存します。

  5. 次のように実行します。

    sudo chmod 400 /var/opt/mssql/secrets/passwd
    

    ファイルをロック ダウンします。

  6. レプリカとして機能する他のサーバーで手順 1 から 5 を繰り返します。

Pacemaker クラスターに可用性グループのリソースを作成する (外部タイプのみ)

SQL Server で可用性グループを作成したら、クラスターの種類として External を指定するときに Pacemaker で対応するリソースを作成する必要があります。 可用性グループには、可用性グループ自体と IP アドレスという 2 つのリソースが関連付けられています。 リスナー機能を使用していない場合、IP アドレス リソースの構成は省略可能ですが、推奨されます。

作成する AG リソースは、 複製と呼ばれるリソースの種類です。 AG リソースには、各ノードにコピーがあり、 マスターと呼ばれる 1 つの制御リソースがあります。 マスターは、プライマリ レプリカをホストするサーバーに関連付けられています。 その他のリソースは、セカンダリ レプリカ (標準または構成専用) をホストし、フェールオーバー時にマスターに昇格させることができます。

  1. 次の構文を使用して AG リソースを作成します。

    sudo pcs resource create <NameForAGResource> ocf:mssql:ag ag_name=<AGName> meta failure-timeout=30s promotable notify=true
    

    この例では、 NameForAGResource は AG のこのクラスター リソースに指定する一意の名前で、 AGName は作成した AG の名前です。

  2. リスナー機能に関連付ける AG の IP アドレス リソースを作成します。

    sudo pcs resource create <NameForIPResource> ocf:heartbeat:IPaddr2 ip=<IPAddress> cidr_netmask=<Netmask>
    

    この例では、 NameForIPResource は IP リソースの一意の名前で、 IPAddress はリソースに割り当てる静的 IP アドレスです。

  3. IP アドレスと AG リソースが同じノードで実行されるようにするには、コロケーション制約を構成します。

    sudo pcs constraint colocation add <NameForIPResource> with promoted <NameForAGResource>-clone INFINITY
    

    この例では、 NameForIPResource は IP リソースの名前、 NameForAGResource は AG リソースの名前です。

  4. 順序制約を作成して、IP アドレスよりも前に AG リソースが稼働するようにします。 コロケーション制約は順序付け制約を意味しますが、この手順ではこれを適用します。

    sudo pcs constraint order promote <NameForAGResource>-clone then start <NameForIPResource>
    

    この例では、 NameForIPResource は IP リソースの名前、 NameForAGResource は AG リソースの名前です。

次のステップ

このチュートリアルでは、SQL Server on Linux の可用性グループ (AG) を作成および構成する方法について説明しました。 以下の方法を学習しました。

  • 可用性グループを有効にします。
  • AG エンドポイントと証明書を作成します。
  • SQL Server Management Studio (SSMS) または Transact-SQL を使用して AG を作成します。
  • Pacemaker の SQL Server ログインとアクセス許可を作成します。
  • Pacemaker クラスターに AG リソースを作成します。

アップグレードやフェールオーバーなど、ほとんどの AG 管理タスクについては、以下を参照してください。