以前、TDS のバージョンによる Azure 内部からの SQL Database への接続の違い という投稿を書きました。
この投稿を書いたときは、Ports beyond 1433 for ADO.NET 4.5, and SQL Database V12 (ADO.NET 4.5、SQL Database V12 における 1433 以外のポート) の内容を元にしていました。
先日、Connect to Azure SQL Database V12 via Redirection という記事が公開され、ダイレクトルート (リダイレクト) についての詳細が解説されています。
これ以前にも、Azure SQL Database Investments and Roadmap という PASS 2015 のセッションでも紹介されていたはずなのですが、このセッションについては PASS の参加者やセッションレコーディングを購入しないと確認することができないものだったのですが、Docs.com の Cloud Roadshow Seoul Use relational database as a service がこのセッションの内容を元にしたものとなっており、こちらでも情報が公開されていました。
いろいろと情報が出てきましたので、ここで一度内容をまとめてみたいと思います。
情報が公開された当初は、
- SQL Database v12 を使用している
- ADO.NET 4.5 以降 (TDS 7.4 以降) を使用している
- Azure 内部からのアクセス
の場合、初期のアクセスはミドルウェアプロキシと行うが、データベースクラスターの動的ポート (11000~11999 または、14000~14999) の特定ができた後は、以降は、ダイレクトルートを使用してミドルウェアプロキシと直接のアクセスを行うというものでした。
冒頭で紹介した Docs.com のスライドの内容を抜粋すると、SQL Database v12 の全体の構成が以下のようになっています。
SQL Database に対して接続を行おうとした場合、以下のようにデータセンターコントロールクラスターに対して 1433 でアクセスが行われます。
このデータセンターコントロールクラスターがミドルウェアプロキシや、TDS ゲートウェイと言われたいたコンポーネントに近いのではないかと。
Azure 外部からのアクセスであれば、接続はコントロールクラスター経由となりますが、Azure 内部からのアクセスではこの後に、実際のデータベースをホストしているデータベースクラスターの内部ポート番号 (Internal Port Number) を返し、そちらに直接リダイレクトをさせます。
以降は、データセンターコントロールクラスターを介さずに、直接接続を行わせるという形になります。
# 厳密には接続された際に作成された、コネクションプールを使用している場合だと思いますが。
この動作は、Azure が使用している IP アドレス空間からしか使用できないと思っていたのですが、そういうことはなく、サーバー接続ポリシーにより、動作を変更できるというインタフェースが追加されていたようです。
これが先日公開された記事の以下の記述となります。
The first restriction is that “redirection” by default is only supported for connections originating within Azure IP address space, so your application and Azure SQL database must both be deployed in Azure. However, an application outside Azure can also use “redirection” when a server connection policy is properly created (connectionType should be set as “Redirect” to enable “redirection”) against the target Azure SQL Database server. Keep in mind though the latency/perf benefit of redirection is very much diminished in the latter scenario since internet connection latency from outside the Azure data center would be much higher.
2016/9/10 時点では、設定を変更するための Azure PowerShell のコマンドレットは提供されていないのですが、REST API は公開されており、REST 経由で外部からのアクセスに関しても、ダイレクトルートで直接接続させる方式をとることができるようになっています。
該当する REST API は以下の二つになります。
投稿を書いている時点ではプレビューの扱いとなっているようですね。
初期の設定では、リダイレクトのポリシーは「Default」となっており、内部からのアクセスはダイレクトルート / 外部からまたは、サポートされていない TDS の場合は、ミドルウェアプロキシを介したプロキシ接続という動作となります。
これを「Redirect」または、「Proxy」に変更することで、ダイレクトルートによる接続やミドルウェアプロキシを介すように変更することができます。
それでは、wireshark を使用して、実際の動作を見ていきたいと思います。
SQL Database に接続する場合、「~.database.windows.net」の「TCP 1433」に対して接続を行います。
こ
のサーバー名ですが、実際には、「~.control.windows.net」という DNS 名に対しての CNAME となっています。
今回のサーバーであれば、「japanwest1-a.control.database.windows.net」となりますが、これがスライドのデータセンターコントロールクラスターとなるかと思います。
今回は、Azure 外部のオンプレミスの環境 (10.200.0.7) から接続をしていますので、データベースへのアクセスは、ミドルウェアプロキシに対しての TCP 1433 による、プロキシによる接続となります。
それでは、設定を「Default」→「Redirect」に変更してみたいと思います。
設定を変更するためのスクリプトは SQL Database のリダイレクト設定の変更.ps1 にサンプルを公開しましたのでこちらをご利用いただければ。
Azure PowerShell が導入されている環境で、組織アカウントのアカウント情報を使用して実行していただければ、設定の変更ができるはずです。
こちらが Redirect の設定を行った場合のパケットとなります。
先ほどと異なり、
「191.238.68.12:11170」「191.238.68.14:11146」に対してもアクセスが行われれていることが確認できます。
# ポートについても公開されている動的ポートの範囲となっていますね。
これが、リダイレクトによる内部ポートに対しての直接アクセスとなります。
今回は、DB1 / DB2 という二つのデータベースに対してアクセスを行っています。
SQL Database のサーバー名は論理サーバー名となり、実際のデータベースは物理的に異なる環境に配置が行われます。今回の環境では、12 に DB1 / 14 に DB2 が配置されており、実際には以下のような名称となります。
- 191.238.68.12 (DB1) : c7c70376a988.tr1.japanwest1-a.worker.database.windows.net
- 191.238.68.14 (DB2) : ba452b7f5e37.tr3.japanwest1-a.worker.database.windows.net
プロキシ接続の場合は、毎回、ミドルウェアプロキシに対して 1433 で接続が行われますが、
リダイレクト接続の場合、最初のみ 1433 でアクセスがされ、接続後のコネクションプールを再利用する場合はミドルウェアプロキシに対して 1433 のアクセスは行わず、ダイレクトルートにより直接接続が行われていることが確認できますね。
ここまでの情報から、今回の検証で使用した環境では、以下の環境となっていることが確認できたかと思います。
- ミドルウェアプロキシ : japanwest1-a.control.database.windows.net:1433
- DB1 のデータベースサーバー : c7c70376a988.tr1.japanwest1-a.worker.database.windows.net:11170
- DB2 のデータベースサーバー : ba452b7f5e37.tr3.japanwest1-a.worker.database.windows.net:11146
Azure 外からの接続について、プロキシを使用しない接続を使うことのメリットについては、試してみないとわからないと思いますが、接続方法を変更することができるという情報については記憶の隅に置いておいてもよさそうですね。
[…] SQL Database v12 の接続のリダイレクトについて […]
Azure Update (2016.09.12) | ブチザッキ
12 9月 16 at 14:55