SE の雑記

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

Managed Instance のレプリケーション設定時のポイント

leave a comment

Managed Instance は SQL Database と異なり、レプリケーションのパブリッシャー / ディストリビューターとして設定することができ、レプリケーションでデータを配布する際の起点 / 基盤として使用することができるようになっています。
(SQL Database はプッシュサブスクリプションのサブスクライバーとしてのみ使用できるのですが、MI には、この制限がありません)

本投稿を書いている時点では、Feature comparison: Azure SQL Database versus SQL Server に記載のある通り、Public Preview となっていますが、サポートに問い合わせをしながら、ひとまずトランザクションレプリケーションを動かすところまではできたのでポイントをまとめておきたいと思います。
image
細かな内容は、Replication with SQL Database Managed Instance を参照してください。
日本語のドキュメントには記載されていない内容がありますので、英語版を見ておいた方がよいです。

レプリケーションのサポートバージョン

Box の SQL Server の場合、サブスクライバーとして使用できるバージョンは、2 世代後のバージョンまでとなっています。
レプリケーションの旧バージョンとの互換性
SR で確認したところ、Managed Instance がサポートする SQL Server のバージョンですが、SQL Database のレプリケーションと同等となるようです。
SQL Database の単一およびプールされたデータベースへのレプリケーション
SQL Server 2012 の特定のバージョン以降がサポート対象となり、残念ながら SQL Server 2008 R2 以前は非サポートとなるようですね。
 

使用する SSMS のバージョン

上述の MS の手順では、T-SQL を順次実行する方法で設定が記載されています。
現時点の、一般提供が開始されている最新の SSMS である 17.9.1 では GUI による設定はサポートされていないのですが、プレビュー中の SSMS 18.0 Preview 5 で、MI のレプリケーションの GUI 設定に対応しています。
image
GUI ベースで設定を行いたい場合は、SSMS 18.0 を使用すると楽だと思います。
 

ネットワークセキュリティグループ (NSG) の設定のポイント

最初のポイントですが、NSG の設定に注意が必要です。
今の MI は、デフォルトの設定で作成すると、NSG が設定された状態でデプロイされてくるはずです。
この NSG ですが、デフォルトの設定では、許可していない送信のトラフィックをすべて拒否する「deny_all_outbound」の設定が行われています。
この状態ですと、「スナップショットレプリケーションの初期データの作成」が NSG でブロックされてしまい実施することができません。
レプリケーションを実行する際には、データ同期の起点となるデータをサブスクライバー側に登録する必要があります。
この際に、一般的にはスナップショットレプリケーションが使われます。
(他の方法で初期データの同期を行うことも、Box の SQL Server では可能です)
Box の SQL Server の場合、ローカルストレージか、共有ディレクトリにスナップショットを作成することになるのですが、MI では、これらのストレージは使用することができません。
これらのストレージの代わりに「Azure Files」を使用することになります。
次の画面は、MI でディストリビューションを構成しようとした際の GUI の内容になるのですが、スナップショットフォルダーとして、Azure Files を指定するような UI となっています。
image
スナップショットフォルダーには、Azure Files の共有を指定していただき、ストレージ接続文字列については、ポータルの「アクセス キー」から確認できる「接続文字列」を指定する必要があります。
image
これで、スナップショットの取得先が設定できるのですが、デフォルトですと NSG で Azure Files への接続が拒否されています。
NSG の設定を変更しないでスナップショットを取ろうとすると、次のようなエラーが発生するはずです。

Failed to connect to Azure Storage ” with OS error: 53.

このエラーが発生した場合は、NSG で Azure Files への接続が許可されているかを確認してみてください。
image
日本語のドキュメントには、現時点では記載がないのですが、英語版のドキュメントでは、さらっと次の記載があります。
image
 

レプリケーションエージェントの接続のタイムアウトの対応

NSG で Auzre Files 向けの設定を追加しても、スナップショットが Azure Files 上に取得できない可能性があります。
この時、スナップショットエージェントの SQL Server Agent のジョブの履歴には次のようなエラーが出力されています。

2019-01-10 15:39:08.83 Exception Type: Microsoft.SqlServer.Replication.ConnectionFailureException
2019-01-10 15:39:08.83 Exception Message: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 0 – A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.)
2019-01-10 15:39:08.83 Message Code: 10060

スナップショットレプリケーションを使用する場合、次のエージェントが起動され、同期が行われます。

  • ディストリビューター エージェント
  • ログリーダーエージェント
  • スナップショットエージェント

上記のエラーですが、スナップショットエージェントが Distributor データベースの接続時にタイムアウトとなってしまい、接続ができないものとなっています。
デフォルトでは接続のタイムアウトが「15 秒」となっており、接続を試みてから 15 秒後に上記のエラーが出力されているはずです。
この対応なのですが、SQL Server Agent の レプリケーションについてのジョブを開き、各ジョブの「Step 2」の内容に「-LoginTimeout 150」を追加して、各ジョブを再実行 (停止 → 開始) をしてみてください。
image
これで、各ジョブから正常に Distributor DB に接続ができるはずです。
私が試したところでは、「スナップショットエージェント」と「ディストリビューターエージェント」のジョブについては Step 2 に「-LoginTimeout 60」を追加し、60 秒ぐらいまでタイムアウトを伸ばせば、タイムアウトのエラーが発生することなく接続することができていました。
わからなくて SR で確認をしたのが「ログリーダーエージェント」です。
最初「-LoginTimeout 60」と設定していたのですが、これでは接続ができず、次のエラーが発生していました。

Named Pipes Provider: Could not open a connection to SQL Server [53]. A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online.Query timeout expired, Failed Command:

そこで SR で確認をしたところ「-LoginTimeout 150」で接続ができたとのご連絡をいただいたので、ログリーダーエージェントの Step 2 に設定を追加して試してみたところ、ログリーダーエージェントが無事に Distributor に接続され、レプリケーションを開始することができました。
私の環境ですとログリーダーエージェントの接続に 120 秒程度かかっているようで、このエージェントだけ「-LoginTimeout」を 60 から伸ばさないとエージェントが接続できないようでした。
ディストリビューションエージェントとログリーダーエージェントは一度接続してしまえば、接続を明示的に切断するまでは、常駐型の接続となりますので、何かデータを送るたびに接続に時間がかかるということはないはずです。
これらのポイントを押さえておけば、MI でレプリケーションを実行するための環境を作ることができるかと。
SQL Server をディストリビューター / パブリッシャーとして、SQL Server → MI にデータを送る場合は、このようなタイムアウトの調整は必要なかったのですが、MI を起点とした場合、ちょっと設定のポイントがありましたので、簡単ではありますがまとめてみました。

Share

Written by Masayuki.Ozawa

1月 11th, 2019 at 1:11 am

Posted in Managed Instance

Tagged with

Leave a Reply