オンプレミス上の SQL Server から Azure SQL Database への移行や、災対目的としてデータベースのレプリカを作成する目的などにより、SQL Serverのレプリケーション機能を検討することがあると思います。
Azure Private Link 機能が提供される前は、オンプレミス環境上の SQL Server から Azure SQL Database へのプライベート通信によるレプリケーションを構築する場合、色々と工夫する必要がありましたが、Azure Private Link 機能を使用することで、直接 オンプレミス環境上の SQL Server から Azure SQL Database へのレプリケーションを構成することが可能になります。
今回は、Azure Private Link を利用して、SQL Server から Azure SQL Database へのトランザクション レプリケーションを構築する手順をまとめてみようと思います。
[前提条件]
- オンプレミス環境からAzureに対して、VPN もしくは Express Routeにより、プライベート通信が行える状態になっていること。
- Azure SQL Database をデプロイ済みであること。
プライベート リンクの作成
1) Azure ポータルに接続し、「Private Link」を選択します。
2) 「プライベート エンド ポイント」- 「+ 追加」を選択します。
3) インスタンスの証明 : 「名前」欄にインスタンス名を入力後、「地域」欄でリージョンを選択後、「次:リソース」を選択します。
4) 「リソースの種類」欄に「Microsoft.Sql/servers」、「リソース」欄に「Azure SQL Server名」、「対象サブリソース」欄に「sqlServer」を選択後、「次:構成」を選択します。
5) 「仮想ネットワーク」欄に「プライベート エンドポイントにリンクさせる仮想ネットワーク」の選択、「サブネット」欄に「該当のサブネット」の選択、「プライベートDNSゾーンと統合」欄に「はい」を選択し、プライベートDNSゾーンを選択 (既存のプライベートDNSゾーンが存在しない場合は新規作成) 後、「確認および作成」を選択し、プライベート エンド ポイントを作成します。
6) 「プライベート エンド ポイント」-「接続の状態」が「承認済み」になっていることを確認します。
プライベート リンク経由による Azure SQL Database への接続確認
※ 今回は、オンプレミス環境からではなく、SQL Serverがインストールされた Azure 仮想マシン から プライベート リンク 経由で Azure SQL Database への接続確認を実施します。
1) SQL Server がインストールされた Azure 仮想マシンにログインします。
2) コマンド プロンプトを起動し、「nslookup <Azure SQL Server名>.database.windows.net」 コマンドを実行します。
本例の場合、プライベート DNS ゾーンに登録された「sqlje***.database.windows.net」 のアリアス 「sqlje***.privatelink.database.windows.net」(10.1.0.4) で名前解決されていることが確認できます。
3) SQL Server Management Studio (以下 SSMS) を起動し、管理者権限(sysadmin)が付与されたログインで、2) で確認した「sqlje***.privatelink.database.windows.net」で接続できることを確認します。
SQL Server トランザクション レプリケーションの構築
1) SQL Server がインストールされた Azure 仮想マシンにログインします。
2) SQL Server Management Studio (以下 SSMS) を起動し、管理者権限(sysadmin)が付与されたログインで、Azure 仮想マシンにインストールされた SQL Server にログインします。
3) 「レプリケーション」-「ローカル パブリッシャ」-「右クリック」-「新しいパブリケーション」を選択します。
4) ウィザードを進め「ディストリビュータ」画面で「独自のディストリビュータとする」を選択し、「次へ」を選択します。
5) 「SQL Server エージェントの起動」画面で「はい、SQL Server エージェント サービスを自動的に開始するように構成します」を選択し、「次へ」を選択します。
6) 「スナップショット フォルダ」画面でスナップショットを配置するパスを指定後、「次へ」を選択します。
※ 今回は既定値のままにします。
7) 「パブリケーション データベース」画面で、レプリケーションを構成するデータベースを選択し、「次へ」を選択します。
8) 「パブリケーションの種類」画面、「パブリケーションの種類」:「トランザクション パブリケーション」を選択し、「次へ」を選択します。
9) 「アーティクル」画面、「パブリッシュするオブジェクト」でレプリケーション対象のテーブルなどを選択後、「次へ」を選択します。
10) ウィザードを進め「スナップショット エージェント」画面で「スナップショットをすぐに作成し、サブスクリプションを初期化できるようにそのスナップショットを保持する」にチェックし、「次へ」を選択します。
11) 「エージェント セキュリティ」画面で「スナップショット エージェント」、「ログリーダー エージェント」のセキュリティ設定を実施後、「完了」を選択します。
※ 今回は、SQL Server エージェント アカウントのサービス起動アカウントの権限を使用して、スナップショット エージェントのプロセス処理 および ログリーダー エージェントからパブリッシャーへ接続するように設定します。
12) 「ウィザードの完了」画面、「パブリケーション名」欄にパブリケーション名を入力後、「完了」を選択します。
13) 正常にパブリケーションの作成が完了後、「閉じる」を選択します。
14) 「作成したパブリケーション」 - 「右クリック」-「新しいサブスクリプション」を選択します。
15) 「パブリケーション」画面、「パブリッシャー」欄で作成したパブリッシャー、「データベースとパブリケーション」欄で作成したパブリケーションを選択後、「次へ」を選択します。
16) 「ディストリビューション エージェントの場所」画面で「プッシュ サブスクリプション」を選択後、「次へ」を選択します。
17) 「サブスクライバ」画面で「サブスクライバーの追加」-「SQL Server サブスクライバの追加」を選択します。
18) 「サーバー名」欄に プライベート リンク経由で Azure SQL Databaseヘ接続するFQDN名 (sqlje***.privatelink.database.windows.net) を入力後、ログイン名、パスワードを入力し、「接続」を選択します。
19) 「サブスクライバ」欄、Azure SQL Database サーバーにチェックが入っていることを確認後、「サブスクリプション データベース」欄でサブスクリプション データベース名を指定し、「次へ」を選択します。
※ 今回は Azure SQL Database サーバーに既に存在している「db1」データベースを指定します。
20) 「ディストリビューション エージェントのセキュリティ」画面で、「....」を選択します。
21) 以下のように設定し、「サブスクライバに接続」欄で、「次の SQL Server ログインを使用する」を選択後、該当の Azure SQL Database サーバーに接続するログイン、パスワードを入力後、「OK」を選択します。
21) 「次へ」を選択します。
22) 既定値のままで 「次へ」を選択します。
23) 既定値のままで 「次へ」を選択します。
24) 「ウィザードのアクション」画面で、「ウィザードの終了時の処理」-「サブスクリプションを作成する」にチェックし、 「次へ」を選択します。
25) 「ウィザードの完了」画面で入力内容が正しいことを確認後、「完了」を選択します。
26) 正常にサブスクリプションの作成が完了することを確認し、「閉じる」を選択します。
27) SQL Server Management Studio (以下 SSMS) を起動し、管理者権限(sysadmin)が付与されたログインで サブスクリプション (Azure SQL Database サーバー) に接続し、正しくレプリケーション対象のオブジェクトが作成され、パブリケーション データベース側で挿入したデータがサブスクリプション データベース側に反映されることを確認します。
まとめ
今回は、Azure 仮想マシンにインストールされた SQL Server から Azure SQL Database への トランザクション レプリケーションを構成しましたが、オンプレミス環境 から Azure SQL Database への トランザクション レプリケーションについても、同様の手順にて構成することが可能です。
なお、オンプレミス環境から構成する場合においては、オンプレミス環境からプライベート リンク経由で Azure SQL Database ヘ接続するFQDN名 (今回の場合は、sqlje***.privatelink.database.windows.net) で名前解決ができるように設定してもらえればと思います。