前回の投稿で、Windows Azure の Virtual Machine で AlwaysOn のリスナーを設定するための方法をまとめてみました。
プライマリに障害が発生した場合にセカンダリに自動的に切り替えることはこの設定で可能ですが、読み取り可能にしたセカンダリに接続をすることはこの状態ではできません。
今回の投稿ではセカンダリを読み取りとして使用するための設定についてまとめてみたいと思います。
現状、この辺の手順が MSDN 等でまとめられてはいないようでしたので、後日ほかの方法が公開されるかもしれません。
■エンドポイントの設定
この状態だとパブリックポートとプライベートポートのそれぞれに対して 1433 を指定することができません。
- Public Port の [TCP:50001] でアクセスがあった場合はインスタンス A の [TCP:50000]
- Public Port の [TCP:50002] でアクセスがあった場合はインスタンス B の [TCP:50000]
にロードバランスするように設定しています。
プライベートポートとして、[TCP:1433] が設定できればよかったのですが、設定ができなかったため今回は [TCP:50000] を設定します。
■SQL Server のポート設定
今回は以下のような構成をとってみます。
SQL Server は既定の 1433 だけでなく、50000 もポートとして利用するように設定します。
読み取り専用ルーティングでは
[SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N’TCP://<FQDN or サーバー名>:ポート番号’)]
というような指定をする必要があります。
通常であれば、サーバー名を指定すればよいのですが、クラウドサービスの場合は FQDN がアクセス先の設定となります。接続先のポートについては各インスタンス向けのパブリックポートを指定して、接続をするようにしています。
SQL Server のインスタンスのポートですが複数のポートを設定することができ、SQL Server 構成マネージャーから、インスタンスのポートを複数設定できます。
[IPAll] の [TCP ポート] にカンマ区切りで複数指定することで複数のポートで SQL Server をりっすんすることができますので、今回は各インスタンスで [1433,50000] を設定し、両ポートで SQL Server に接続ができるようにしています。
Windows Firewall の設定も以下のように複数ポートを許可するように設定しておきます。
■読み取り専用ルーティングの設定
最後に読み取り専用ルーティングを設定します。
インスタンス A のルーティング URL としては、インスタンス A の SQL Server に接続ができるパブリックポート、インスタンス B のルーティング URL としては、インスタンス B の SQL Server
に接続ができるパブリックポートを指定しています。
ALTER AVAILABILITY GROUP [AG1] ALTER AVAILABILITY GROUP [AG1] ALTER AVAILABILITY GROUP [AG1] ALTER AVAILABILITY GROUP [AG1] |
[ApplicationIntent=ReadOnly] を指定した場合、ルーティングリストの設定に応じて、接続先としてルーティング URL の接続先が返され、そこに対して接続がされます。
# 可用性グループ リスナー、クライアント接続、およびアプリケーションのフェールオーバー (SQL Server)
ここに各インスタンスに直接接続ができるパブリックポートを指定しておけば、読み取りの負荷分散をすることができるようになります。
以上で設定は完了です。
それではテストをしてみたいと思います。
現在は以下のような設定になっています。
まずは普通にクラウドサービス名だけを設定して接続をしてみます。
この場合はプライマリに接続がされますので、サーバー名を取得した場合はプライマリのサーバー名となります。
それでは次に読み取りのサーバーに接続をしてみます。
接続のサーバー名としてはクラウドサービス名を指定しています。
オプションをクリックして追加の接続パラメーターとして [ApplicationIntent=ReadOnly;Initial Catalog=TEST] を設定して接続をします。
これで接続をするとルーティング URL に設定されているセカンダリの URL (今回は TCP://<クラウドサービス>.net:50002) に接続がされますので、セカンダリのサーバー名が取得されます。
[sys.dm_exec_connections] を確認するとセカンダリに接続した際には、[50000] で接続がされていることが確認できます。
なお、プライマリに接続した場合は、[1433] で接続されていることが確認できます。
# この際はリスナーを介しての接続ですので [local_net_address] はリスナーに割り当てている、クラウドサービスのパブリック IP になります。
Azure 上に構築した AlwaysOn はオンプレミスに設定した場合と同様にセカンダリを読み取りとして利用することもできそうですね。