可用性を高めるために、AlwaysOn 可用性グループとレプリケーションを組み合わせて利用したいというご要望を聞くことがよくあります。一例として、AlwaysOn 可用性グループを構成しているデータベースをパブリケーションとして、トランザクション レプリケーションを構築することが可能です。この記事では以下のような構成を前提としてご紹介します。
手順は、AlwaysOn 可用性グループ用のレプリケーションの構成 (SQL Server)でご案内しています。また、英語ですが、米国の AlwaysOn サポートチームが公開しているブログ記事 Setting up Replication on a database that is part of an AlwaysOn Availability Groupで、スクリーンショット付きで分かりやすい手順もあります。
この構成のポイントとしては、次の点があります。
<ポイント1> ディストリビューターは、可用性グループを構成しているサーバー以外のサーバーで稼動させる必要がある。
<ポイント2> 可用性グループがフェールオーバーしてもレプリケーションの配信は続行される。
<ポイント3> 可用性グループのセカンダリ レプリカのサーバーが停止していると、レプリケーションの配信は行われない。
ここで、<ポイント3> の動作について注意が必要なため、今回はこの動作についてご案内します。
「AlwaysOn 可用性グループを構成しているサーバーが停止しているときのレプリケーションの配信タイミング」
通常であれば、変更対象のログ レコードがレプリケーション ログ リーダー エージェントによって読み取られ、ディストリビューターを経由してサブスクライバーにトランザクション情報が配信されますが、可用性グループのセカンダリ レプリカが停止している場合には、配信されません。状況により、次のような動作の違いがあります。
平常稼動時:
変更対象のログ レコードがログ リーダー エージェントによって読み取られ、ディストリビューター/サブスクライバーに配信されます。
可用性グループのフェールオーバー後:
変更対象のログ レコードがログ リーダー エージェントによって読み取られ、ディストリビューター/サブスクライバーに配信されます。
可用性グループのセカンダリ レプリカが停止している場合:
AlwaysOn としては同期待ち状態となります。この場合、変更対象のログ レコードがログ リーダー エージェントで読み取れず、ディストリビューター/サブスクライバーに配信が行われません。レプリケーション モニターで、ログ リーダー エージェントの詳細表示を見ると、「レプリケートされたトランザクションは、次のログ バックアップまたはミラーリング パートナーが遅延を解消するのを待機しています。」というメッセージが表示されています。
「AlwaysOn 可用性グループを構成するサーバー停止しているときも、レプリケーションを配信する方法」
停止したセカンダリ レプリカがすぐに復旧してくれば、セカンダリ レプリカへ再接続し、レプリケーションの配信は再開されます。しかし、障害によってはセカンダリ レプリカの復旧に時間が必要なこともあります。セカンダリ レプリカの復旧に時間がかかる時にも、レプリケーションの配信は続行したい場合には、下記のいずれかの方法で対処します。
A. 可用性グループからセカンダリ レプリカを削除する
B. 可用性グループからデータベースを削除する
A. 可用性グループからセカンダリ レプリカを削除する
1) 停止したセカンダリ レプリカを可用性グループから削除します。
その結果、パブリッシャからサブスクライバへのレプリケーションは続行されます。
セカンダリ レプリカが復旧して使用可能になった際に、次の方法で再度可用性グループにセカンダリ レプリカを追加します。
2) 停止していたレプリカに残っているデータベースを削除します。
3) 停止していたレプリカを、可用性グループにレプリカとして追加します。
B. 可用性グループからデータベースを削除する
1) 対象のデータベースを可用性グループから削除します。
その結果、パブリッシャからサブスクライバへのレプリケーションは続行されます。
セカンダリ レプリカが復旧して使用可能になった際に、次の方法で再度可用性グループにデータベースを追加します。
2) 可用性グループにデータベースを追加します。
※ 本 Blog の内容は、2014年10月現在の内容となっています。