DBAとして、私たちは通常、現在の本番サーバーがサーバーの負荷を保持できないこと、および負荷がセカンダリサーバーとバランスが取れているかどうかについて不満を言うクライアントに出くわします。これは、ログ配布に読み取り専用データベースがあり、AlwaysOn可用性グループにセカンダリSQLServerレプリカがあるDRServerのデータベースで可能です。 Always Onグループの最大の利点は、任意の数のデータベースに対してグループレベルのHAを設定できることと、最大4つのセカンダリレプリカを作成できることです。これは、データ送信が行われるクラスタリング、ログ配布、およびデータベースミラーリングの組み合わせです。より柔軟で機能的です。
オールウェイズオン読み取り可能セカンダリレプリカには、読み取り専用ルーティングと呼ばれる特定の読み取り専用接続要求を処理する機能があります。通常、デフォルトでは、読み取りと読み取りインテントの両方がプライマリレプリカに送信され、セカンダリレプリカには何も送信されません。現在、セカンダリレプリカは、バックアップ、DBCC、およびレポートの目的で使用できるだけでなく、アプリケーション接続文字列のアプリケーションインテントとして「ReadOnly」を使用することで将来的にクエリを実行することもできます。
Windowsフェールオーバークラスターには、SQL1、SQL2、SQL3の3つのレプリカがあります。各ノードには、スタンドアロンのSQL Server 2012インスタンスがインストールされ、AlwaysOnAGで構成されています。私たちは常に「CODEAG」という名前のAGグループにリスナー名「CODELIS」を付けています
次のスクリーンショットでは、SQL1がプライマリレプリカ、SQL2がセカンダリレプリカ、SQL3がセカンダリレプリカです。
常にオンの可用性グループで読み取り専用ルーティングリストを構成する方法
ステップ1:
リスナー名またはIPを使用して、可用性グループへの接続が確立されます。ここで、1つの可用性グループに対して複数のリスナーを作成するには、以下の手順に従ってください。
可用性グループのリスナーを手動で作成または構成するには
- オブジェクトエクスプローラーで、可用性グループのプライマリレプリカを保持しているインスタンスに接続します。
- AONグループを展開し、リスナーを手動で構成しようとしている可用性グループをクリックして続行します。
- 可用性グループリスナーノードを右クリックし、[新しいリスナーコマンド]を選択します。これにより、リスナーを構成するための新しいダイアログボックスが開きます。
- 既存のリスナーのポート番号は、可用性グループリスナーノードを展開し、リスナーを右クリックしてプロパティを選択することで変更できます。
- ここで、新しいポート番号を入力して[OK]をクリックします。
以下のようにDMVにクエリを実行して、AlwaysOnレプリケーション用に構成されたリスナー名を特定します。
SELECT AV.name AS AVGName , AVGLis.dns_name AS ListenerName , AVGLis.ip_configuration_string_from_cluster AS ListenerIP FROM sys.availability_group_listeners AVGLis INNER JOIN sys.availability_groups AV on AV.group_id = AV.group_id
次のスクリーンショットでは、AGグループ名はCODEAGであり、AGリスナーIPはCODELISです。
ステップ2:
読み取り専用ルーティングを構成するには、セカンダリレプリカへの読み取り専用接続を許可するように、レプリカを読み取り専用に構成する必要があります。
- プライマリレプリカを保持するインスタンスに接続します。
- AON高可用性ノードを拡張し、次にAGグループノードを拡張します。
- レプリカを変更する必要があるAGグループをクリックします。
- レプリカを右クリックし、プロパティを選択して、プライマリロールとセカンダリロールの接続アクセスを次のように変更します。
セカンダリロールには、読み取り可能なセカンダリドロップリストからの新しい値があります。
読み取り-意図のみ
このオプションを使用すると、このレプリカのセカンダリデータベースへの読み取りアクセスが可能になります。読み取り専用接続のみが許可されます。
はい
このオプションでは読み取りアクセスのみが許可されますが、セカンダリレプリカではすべての接続が許可されます。
いいえ
これにより、セカンダリレプリカへのすべてのユーザー接続が停止し、読み取りもできなくなります。
読み取り可能なセカンダリプロパティを読み取り専用に設定します。
次のスクリーンショットでは、各セカンダリレプリカの読み取り可能なセカンダリプロパティが読み取り専用に設定されています。
ステップ3:
読み取り可能な各セカンダリレプリカには、読み取り専用のルーティングURLを割り当てることができます。このURLは、読み取りインテント接続要求を特定の読み取り可能なセカンダリレプリカにルーティングするために使用されます。
T-SQLを使用して、可用性グループ内のすべてのレプリカの読み取り専用ルーティングURLを指定します。
ALTER AVAILABILITY GROUP [CODEAG] MODIFY REPLICA ON N'SQL1' WITH (SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY)); ALTER AVAILABILITY GROUP [CODEAG] MODIFY REPLICA ON N'SQL1' WITH (SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://SQL1.abc.com:17999')); ALTER AVAILABILITY GROUP [CODEAG] MODIFY REPLICA ON N'SQL2' WITH (SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY)); ALTER AVAILABILITY GROUP [CODEAG] MODIFY REPLICA ON N'SQL2' WITH (SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://SQL2.abc.com:17999')); ALTER AVAILABILITY GROUP [CODEAG] MODIFY REPLICA ON N'SQL3' WITH (SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY)); ALTER AVAILABILITY GROUP [CODEAG] MODIFY REPLICA ON N'SQL3' WITH (SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://SQL3.abc.com:17999'));
ステップ4:
プライマリレプリカであるときに読み取り専用ルーティングとしてマークしているレプリカの場合、読み取り専用ルーティングリストを指定する必要があります。これは、ローカルレプリカがプライマリロールで実行されている場合にのみ有効になります。
>ALTER AVAILABILITY GROUP [CODEAG] MODIFY REPLICA ON N'SQL1' WITH (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('SQL2','SQL3'))); ALTER AVAILABILITY GROUP [CODEAG] MODIFY REPLICA ON N'SQL3' WITH (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('SQL2','SQL1'))); ALTER AVAILABILITY GROUP [CODEAG] MODIFY REPLICA ON N'SQL2' WITH (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('SQL3','SQL1')));
上記のスクリプトでは、SQL1がプライマリレプリカである場合の例では、読み取り専用のワークロードが読み取り可能なセカンダリレプリカにリダイレクトされます。それぞれSQL2とSQL3:同様に、SQL3がプライマリレプリカである場合、読み取り専用のワークロードは読み取り可能なセカンダリレプリカにリダイレクトされます。それぞれSQL2とSQL1。
読み取り専用のダイレクトトラフィックは、アクセスできない場合を除いて、ルーティングリスト内の次に利用可能なレプリカにトラフィックを転送するまで、最初に使用可能なレプリカにルーティングされます。複数のレプリカがある場合、SQL Server 2012と2014までは、レプリカ間で負荷を共有することはできません。ただし、SQL Server 2016では、読み取り専用レプリカ間で負荷を分散できます。
例:
ALTER AVAILABILITY GROUP [CODEAG] MODIFY REPLICA ON N'SQL2' WITH (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=(('SQL3','SQL1'), ‘SQL2’)));
このルーティングリストの動作は、SQL3とSQL1の間の読み取り専用接続を「負荷分散」します。上記では、ルーティングリストに2つの埋め込みリストがあります:
リスト1:「SQL3」、「SQL1」
リスト2:「SQL2」
最初のリストのレプリカにルーティングします。 SQL3およびSQL1は、読み取り専用接続にアクセスできます。最初の着信読み取り専用接続はSQL3にルーティングされ、2番目の読み取り専用接続はSQL1にルーティングされ、3番目の読み取り専用接続はSQL3にルーティングされ、4番目の読み取り専用接続はSQL1にルーティングされます。など、最初のリストの2つのレプリカ間の読み取り専用接続の「ラウンドロビン」分散を使用します。
レプリカが使用できなくなった場合、ルーティングは最初のリストに残っているレプリカで続行されます。 SQL3またはSQL1が読み取り専用接続にアクセスできなくなった場合、読み取り専用接続は、最初のリストにあるアクセス可能な読み取り専用レプリカにのみルーティングされます。たとえば、SQL3が同期されていない状態にある場合、またはALLOW_CONNECTIONSがNOに設定されている場合、すべての読み取り専用接続はSQL1にルーティングされます。サーバーの1つが読み取り専用接続に使用できる限り、読み取り専用接続はSQL2にルーティングされません。
最初のリストのすべてのレプリカにアクセスできない場合、 次のリストのレプリカにルーティングします。 SQL3とSQL1が読み取り専用接続にアクセスできなくなった場合、すべての読み取り専用接続は、レプリカの次のリスト(この場合はSQL2)にのみルーティングされます。
レプリカが利用可能になった場合は、最初のリストへのルーティングを再開します。 リスト内で優先度の高いセカンダリレプリカが読み取り専用接続にアクセスできるようになると、将来の読み取り専用接続は必要に応じてそれらに接続します。
SQL Server 2016では、読み取り専用レプリカのセット全体で負荷分散を構成できます。
ステップ5:
sys.availability_read_only_routing_listsDMV。AlwaysOn可用性グループ内の各可用性グループレプリカの読み取り専用ルーティングリストを返します。
SELECT AVGSrc.replica_server_name AS SourceReplica , AVGRepl.replica_server_name AS ReadOnlyReplica , AVGRepl.read_only_routing_url AS RoutingURL , AVGRL.routing_priority AS RoutingPriority FROM sys.availability_read_only_routing_lists AVGRL INNER JOIN sys.availability_replicas AVGSrc ON AVGRL.replica_id = AVGSrc.replica_id INNER JOIN sys.availability_replicas AVGRepl ON AVGRL.read_only_replica_id = AVGRepl.replica_id INNER JOIN sys.availability_groups AV ON AV.group_id = AVGSrc.group_id ORDER BY SourceReplica
次のスクリーンショットでは、結果にルーティングURLとルーティング優先度が示されています。
ステップ6:
SQLCMDを使用して読み取り専用ルーティングをテストするには、ルーティングリストに従って読み取り接続を受信するセカンダリレプリカを示す–KReadOnlyパラメーターを使用します。
次のスクリーンショットでは、セカンダリレプリカが読み取り接続(つまり…SQL2)を受け入れています。
ステップ7:
可用性グループをフェイルオーバーし、読み取り専用ルーティングをテストします。
- オブジェクトエクスプローラーで、フェイルオーバーが必要な可用性グループのセカンダリレプリカをホストするサーバーインスタンスに接続します。サーバーツリーを展開します。
- AlwaysOn高可用性ノードと可用性グループノードを展開します。
- フェイルオーバーする可用性グループを右クリックして、[フェイルオーバー]を選択します。
これで、SQL2がプライマリレプリカになり、接続はSQL1によって処理されます。
アプリケーションが使用する必要のある接続文字列構文は、SQLServerプロバイダーによって異なります。
SQLServer用の.NetFrameworkData Provider 4.0.2の場合、構文は次のようになります。
Server =tcp:MyAgListener、portnumber; Database =SQL1; IntegratedSecurity =SSPI; ApplicationIntent =ReadOnly; MultiSubnetFailover =True
結論:
ワークロードを減らすために、この読み取り専用ルーティングは依然として最良のオプションです。 SharePointでホストされているSQLServerReportingServicesまたはReportServerのネイティブモードインストールを含むアプリケーションは、プライマリノードでの一般的なブロッキング、メモリ、およびCPU使用率を回避する読み取り専用インテントを使用できます。