11/1, 2 で開催されていた Tech Summit 2016 で、「進化した AlwaysOn! SQL Server 2016 の AlwaysOn 可用性グループの新機能を一挙紹介」という内容で登壇させていただきました。
後日、資料や動画が公開されるはずですので、興味のある方がいらっしゃいましたら公開されましたらご確認いただければ幸いです。
ちなみに最大の見どころは、途中で「0 → Enter」を押してしまって、タイトルスライドを表示して慌てているところです。
# Enter の隣にテンキーがあって、間違って押しました。
セッションの内容のフォローアップを軽く。
今回、お話しさせていただいた内容は以下になります。
公開後に詳細を確認されたい場合はこれらの情報を確認していただければと思います。
新機能
新しい初期同期方法
- AlwaysOn 可用性グループを自動的に初期化する
https://msdn.microsoft.com/ja-jp/library/mt735149.aspx
可用性グループの新しい構成
- Workgroup and Multi-domain clusters in Windows Server 2016
https://blogs.msdn.microsoft.com/clustering/2015/08/17/workgroup-and-multi-domain-clusters-in-windows-server-2016/ - 基本的な可用性グループ (AlwaysOn 可用性グループ)
https://msdn.microsoft.com/ja-jp/library/mt614935.aspx - 分散型可用性グループ (Always On 可用性グループ)
https://msdn.microsoft.com/ja-jp/library/mt651673.aspx - Configure one or more Always On Availability Group Listeners – Resource Manger
https://azure.microsoft.com/en-us/documentation/articles/virtual-machines-windows-portal-sql-ps-alwayson-int-listener/
可用性グループの機能強化
- SQL Server 2016 ? It Just Runs Faster: Always On Availability Groups Turbocharged
https://blogs.msdn.microsoft.com/sqlserverstorageengine/2016/09/26/sql-server-2016-it-just-runs-faster-always-on-availability-groups-turbocharged/ - 可用性グループの圧縮の調整
https://msdn.microsoft.com/ja-jp/library/mt736907.aspx - CREATE AVAILABILITY GROUP (Transact-SQL)
https://msdn.microsoft.com/en-us/library/ff878399.aspx - Always On 可用性グループとデータベースミラーリングでの複数データベースにまたがるトランザクションと分散トランザクション (SQL Server)
https://msdn.microsoft.com/ja-jp/library/ms366279(v=sql.130).aspx
セカンダリの利用方法の強化
- ALTER DATABASE SCOPED CONFIGURATION (Transact-SQL)
https://technet.microsoft.com/ja-jp/library/mt629158.aspx - 読み取り専用レプリカ間の負荷分散の構成
https://msdn.microsoft.com/ja-jp/library/hh710054.aspx#loadbalancing
Ignite 2016
- Design a private and hybrid cloud for High Availability and Disaster Recovery with SQL Server 2016
https://myignite.microsoft.com/sessions/5932
デモ環境
デモの環境ですが、すべて Azure 上で構築をしています。
構成としては、
- Windows Server 2016 + SQL Server 2016 Enterprise Edition × 3 の可用性グループ
- Windows Server 2016 + SQL Server 2016 Enterprise Edition × 2 の可用性グループ
- Windows Server 2016 + SQL Server 2016 Standard Edition × 2 の可用性グループ
を使っており、各環境用に Internal ロードバランサーを設定しています。
各ロードバランサーには、複数のリスナーを設定するためにマルチ IP のロードバランサーとして設定していますが、それ以外はシンプルな構成となっています。
デモのスクリプトについては https://1drv.ms/f/s!ArLODcpbx8HegbNUlCOReN-LS10uCQ にアップロードしましたので、こちらからご確認いただければと思います。
Standard Edition の可用性グループについて
Ask the Speaker で、複数の方からご質問いただいたのが、Standard Edition の可用性グループになります。
Standard Edition の基本的な可用性グループでは、DB 単位に可用性グループが作成されるため、データベースが異なるサーバーに配置される可能性があるということは意識しておく必要があるのではと思います。
上記のスライドのような配置になった場合、AG01 のリスナーに接続している状態では、DB1 と DB3 を結合した情報の取得を SQL 的に実行しようとしても、DB3 がセカンダリレプリカの状態となっているため、アクセスをすることができません。
基本的な考え方は、ミラーリングと同じになるかと思います。
ミラーリングについては Database Mirroring Automating Failover for Multiple SQL Server Databases というような方法を使う必要がありましたが、これを可用性グループ向けに考慮する必要があります。
そのための解決方法としてデモでは、以下のような方法で実装していました。
- リンクサーバーとしてリスナーを設定し、他の DB にアクセスする場合は、リスナー経由でアクセスをする
- リスナー経由でアクセスをすれば、透過的にプライマリにアクセスされますので、それをリンクサーバーで利用しています。
- この方法はリモートクエリとして OLEDB での実行となるため、処理のオーバーヘッドを考慮する必要があります。また、フェールオーバー後の初回のクエリ実行時にはエラーとなるため、エラートラップを考慮する必要があります。
:Connect STD-AG01-LN01 SELECT *, (SELECT name FROM sys.servers WHERE server_id = 0) AS A1, (SELECT name FROM [STD-AG01-LN03].master.sys.servers WHERE server_id = 0) AS A3 FROM AGDB01..AGDB01_T1 AS A1 LEFT JOIN [STD-AG01-LN03].AGDB03.dbo.AGDB03_T1 AS A3 ON A1.Col1 = A3.Col1 GO
- 可用性グループを特定のサーバーに寄せて配置できるようにする
- デモでは AGMonitor というクラスターリソースで実装をしていました。
de:code 2016 に続いての登壇でしたが、SQL Server のデータベースエンジンだけでも、常に調べることがたくさんあり、日々勉強ですね。