SQL Server 2016 の分散可用性グループについては、Distributed Availability Groups (Always On Availability Groups) で公開されている情報が今のところまとめっているものかと思います。
分散可用性グループでは、「SEEDING_MODE= AUTOMATIC」が使用されていますが、自動シードでは、バックアップとリストアを透過的に実行する仕組みのため、異なるディスク構成 (ドライブレターやデータベースの格納場所がサーバーによって異なる) の場合は、自動的な同期を使用することができません。
異なるディスク構成で分散可用性グループを設定する方法を軽くまとめてみたいと思います。
SQL Server 2016 の可用性グループを設定するための基本的なクエリについては、GitHub に公開しておきましたのでこちらがご参考なれば幸いです。
SQL Server 2016 の AlwaysOn 可用性グループ構築のベースクエリ
SQL Server 2016 の 分散可用性グループ構築のベースクエリ
設定の方法ですが、従来までの AlwaysOn 可用性グループの手動によるデータ同期の準備と同じです。
今回はプライマリサーバーについては「C:\AG01」にデータベースを配置していますが、セカンダリにはこのディレクトリが存在していない状態としています。
分散可用性グループでは、セカンダリの可用性グループに事前にデータベースを含めておくことができません。
メッセージ 19511、レベル 16、状態 0、行 27
分散可用性グループ ‘distributedag’ を結合できません。ローカル可用性グループ ‘AG02’ に 1 つ以上のデータベースが含まれています。
すべてのデータベースを削除するか、空の可用性グループを作成し、分散可用性グループを結合します。
そこで、セカンダリでは「WITH NORECOVERY」の状態でデータベースをリストアしておき、可用性グループには含めない状態としておきます。
この状態をスタートとして、分散可用性グループの設定を行います。
今回は、以下の状態の可用性グループを構築しています。
プライマリのサーバー | 可用性グループ名 | リスナー名 |
SQL-01 | AG01 | LN-01.cluster1.local |
SQL-03 | AG02 | LN-02.cluster2.local |
これに対して以下のクエリで分散可用性グループを設定します。
/****************************************************/ /* 分散可用性グループ (プライマリ) */ /****************************************************/ :Connect SQL-01 CREATE AVAILABILITY GROUP [distributedag]?? WITH (DISTRIBUTED) AVAILABILITY GROUP ON??? ??'AG01' WITH ( LISTENER_URL = 'tcp://LN-01.cluster1.local:5022', AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT, FAILOVER_MODE = MANUAL, SEEDING_MODE = AUTOMATIC ), 'AG02' WITH ?( LISTENER_URL = 'tcp://LN-02.cluster2.local:5022', AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT, FAILOVER_MODE = MANUAL, SEEDING_MODE = AUTOMATIC ); GO /****************************************************/ /* 分散可用性グループ (セカンダリ) */ /****************************************************/ :CONNECT SQL-03 ALTER AVAILABILITY GROUP [distributedag] JOIN AVAILABILITY GROUP ON 'AG01' WITH ( LISTENER_URL = 'tcp://LN-01.cluster1.local:5022', AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT, FAILOVER_MODE = MANUAL, SEEDING_MODE = AUTOMATIC ), 'AG02' WITH ( LISTENER_URL = 'tcp://LN-02.cluster2.local:5022', AVAILABILITY_MODE = ASYNCHRONOUS_COMMIT, FAILOVER_MODE = MANUAL, SEEDING_MODE = AUTOMATIC ); GO
セカンダリ側の分散可用性グループを設定したタイミングで、先ほどまで「復元しています」の状態だった DB が可用性グループに組み込まれていることが確認できますね。
データベースを配置するディスクの構成が異なっていても、事前に準備を行っておけば、分散可用性グループを設定することができました。
Azure の仮想マシンに SQL Server をインストールして、BLOB ストレージに直接配置をしたデータベースの構成で、分散可用性グループを組む場合などは、ディスクの構成が異なる環境としての構築が必要となりますので、このような分散可用性グループの設定方法も覚えておくと良いかと。