SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Availability Group Listener in Windows Azure で読み取り専用ルーティングを使用する

leave a comment

前回の投稿で、Windows Azure の Virtual Machine で AlwaysOn のリスナーを設定するための方法をまとめてみました。

プライマリに障害が発生した場合にセカンダリに自動的に切り替えることはこの設定で可能ですが、読み取り可能にしたセカンダリに接続をすることはこの状態ではできません。

今回の投稿ではセカンダリを読み取りとして使用するための設定についてまとめてみたいと思います。
現状、この辺の手順が MSDN 等でまとめられてはいないようでしたので、後日ほかの方法が公開されるかもしれません。

■エンドポイントの設定


現状は以下のようなエンドポイントの設定になっています。
image

 

この状態だとパブリックポートとプライベートポートのそれぞれに対して 1433 を指定することができません。

image
image
image

そのため、今回は以下のような設定をしています。
image
image

  • Public Port の [TCP:50001] でアクセスがあった場合はインスタンス A の [TCP:50000]
  • Public Port の [TCP:50002] でアクセスがあった場合はインスタンス B の [TCP:50000]

にロードバランスするように設定しています。
プライベートポートとして、[TCP:1433] が設定できればよかったのですが、設定ができなかったため今回は [TCP:50000] を設定します。

 

■SQL Server のポート設定


今回は以下のような構成をとってみます。
SQL Server は既定の 1433 だけでなく、50000 もポートとして利用するように設定します。

image

読み取り専用ルーティングでは

[SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N’TCP://<FQDN or サーバー名>:ポート番号’)]

というような指定をする必要があります。
通常であれば、サーバー名を指定すればよいのですが、クラウドサービスの場合は FQDN がアクセス先の設定となります。接続先のポートについては各インスタンス向けのパブリックポートを指定して、接続をするようにしています。

SQL Server のインスタンスのポートですが複数のポートを設定することができ、SQL Server 構成マネージャーから、インスタンスのポートを複数設定できます。
image

[IPAll] の [TCP ポート] にカンマ区切りで複数指定することで複数のポートで SQL Server をりっすんすることができますので、今回は各インスタンスで [1433,50000] を設定し、両ポートで SQL Server に接続ができるようにしています。
image

Windows Firewall の設定も以下のように複数ポートを許可するように設定しておきます。
image

これで以下の設定が完了したことになります。
image

■読み取り専用ルーティングの設定


最後に読み取り専用ルーティングを設定します。

インスタンス A のルーティング URL としては、インスタンス  A の SQL Server に接続ができるパブリックポート、インスタンス B のルーティング URL としては、インスタンス B の SQL Server に接続ができるパブリックポートを指定しています。

ALTER AVAILABILITY GROUP [AG1]
MODIFY REPLICA ON
N’NAWAGAMI-SQL-01′ WITH
(SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY));
ALTER AVAILABILITY GROUP [AG1]
MODIFY REPLICA ON
N’NAWAGAMI-SQL-01′ WITH
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N’TCP://<クラウドサービス>.cloudapp.net:50001′));

ALTER AVAILABILITY GROUP [AG1]
MODIFY REPLICA ON
N’NAWAGAMI-SQL-02′ WITH
(SECONDARY_ROLE (ALLOW_CONNECTIONS = READ_ONLY));
ALTER AVAILABILITY GROUP [AG1]
MODIFY REPLICA ON
N’NAWAGAMI-SQL-02′ WITH
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N’TCP://<クラウドサービス>.net:50002′));

ALTER AVAILABILITY GROUP [AG1]
MODIFY REPLICA ON
N’NAWAGAMI-SQL-01′ WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=(‘NAWAGAMI-SQL-02′,’NAWAGAMI-SQL-01’)));

ALTER AVAILABILITY GROUP [AG1]
MODIFY REPLICA ON
N’NAWAGAMI-SQL-02′ WITH
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=(‘NAWAGAMI-SQL-01′,’NAWAGAMI-SQL-02’)));
GO

[ApplicationIntent=ReadOnly] を指定した場合、ルーティングリストの設定に応じて、接続先としてルーティング URL の接続先が返され、そこに対して接続がされます。
# 可用性グループ リスナー、クライアント接続、およびアプリケーションのフェールオーバー (SQL Server)

ここに各インスタンスに直接接続ができるパブリックポートを指定しておけば、読み取りの負荷分散をすることができるようになります。

以上で設定は完了です。

それではテストをしてみたいと思います。
現在は以下のような設定になっています。

image

まずは普通にクラウドサービス名だけを設定して接続をしてみます。

image

この場合はプライマリに接続がされますので、サーバー名を取得した場合はプライマリのサーバー名となります。

image

それでは次に読み取りのサーバーに接続をしてみます。
接続のサーバー名としてはクラウドサービス名を指定しています。
image

オプションをクリックして追加の接続パラメーターとして [ApplicationIntent=ReadOnly;Initial Catalog=TEST] を設定して接続をします。
image

これで接続をするとルーティング URL に設定されているセカンダリの URL (今回は TCP://<クラウドサービス>.net:50002) に接続がされますので、セカンダリのサーバー名が取得されます。
image

[sys.dm_exec_connections] を確認するとセカンダリに接続した際には、[50000] で接続がされていることが確認できます。
image

なお、プライマリに接続した場合は、[1433] で接続されていることが確認できます。
# この際はリスナーを介しての接続ですので [local_net_address] はリスナーに割り当てている、クラウドサービスのパブリック IP になります。
image

Azure 上に構築した AlwaysOn はオンプレミスに設定した場合と同様にセカンダリを読み取りとして利用することもできそうですね。

Written by masayuki.ozawa

8月 14th, 2013 at 2:52 pm

Leave a Reply

*