Azure設計プラクティス2: SQL Databaseのgeoレプリケーションによる冗長構成

Azure SQL Databaseはgeoレプリケーションをサポートしており管理ポータルから数クリックで冗長構成を実現できます。

レプリケーションとは同じデータを持つデータベース(レプリカ)を2つ以上別のデータセンターなどに配置しておくことによって、データを保証したり可用性を実現するものです。

例えば1つのデータベースに障害が発生したとき、同じデータを持つデータベースが別のサーバーにあれば即座に元のデータを復元できます。

さらに、データベースに障害が発生した時にレプリカのデータベースが障害が発生したデータベースの代わりにマスターDBになることでフェールオーバーを実現します。

geoレプリケーションとは地理的に離れたデータセンター間でデータをレプリケーションすることを指します。

今回はAzure SQL Databaseをつかってgeoレプリケーションを実現してみましょう。

今回の構成はこのようにします。

SQL Databaseは東日本リージョンと米国西部リージョンの2つでレプリケーションすることとし、App Serviceからのトランザクションをさばきます。

上記の構成では東日本リージョンにあるDBのみにデータを書き込むことができ、このようなDBをMaster(Azureの場合はプライマリ)と呼びます。

米国西部にあるリージョンは読み込み専用とし、App Serviceからの読み込みのみのトランザクションを受け付けます。このようなDBをSlave(Azureの場合はセカンダリ)と呼びます。

もし東日本リージョンで障害が発生し、Masterが機能しなくなったとき、SlaveのDBがMasterに昇格し、書き込み可能となることでフェールオーバーを実現します。

WebAppsを作る

まず最初に、DBにアクセスするためのWebアプリケーションを作成します。

リージョンは東日本とします。

Master DBを作る

東日本に置くMaster DBを作ります。

リージョンは東日本とし、サーバーも新しく作成してください。

価格レベルは一番安いもので大丈夫です。

Slave DBを作る

続いてレプリカ用のSlave DBを作ります。

先ほど作成したMaster DBの管理画面を開き、「geo レプリケーション」を選択します。

ターゲットリージョンから「米国西部」を選択します。

Slave DBの構成を聞かれますがMasterと同じ性能にしなければいけないのでそのままにします。

サーバーは米国西部に新しく作成します。

Slave DBを作成することができたらレプリケーションは完了です。

プライマリと表示されているのがMasterでセカンダリと表示されているのがSlave DBです。

ASP.net MVCから接続するアプリケーションを作る

ではこれらの冗長構成のSQL DatabaseのMaster DBにデータを入れるアプリをASP.netで作ってみます。

ASP.net MVCで新規プロジェクトを作成します。

NugetからEntityFrameworkを追加します。

Web.configを編集し、接続文字列を追加します。

接続文字列は作成したMaster DBの管理画面から取得することができます。

接続文字列の中にはユーザー名とパスワードが埋まっていないので自身のDBServerに設定したユーザー名とパスワードを設定します。

接続文字列の名前は後ほど作成するDbContextと同じものにする必要があります。今回はItemContextとしました。

Modelフォルダ内に下記のモデルを作成します。

今回はItemというモデルで1つのメッセージを管理します。

ItemContextは接続文字列と同じ名前にしてください。

下記の場合、データベースにItemsというテーブルができます。

HomeControllerを以下のようにします。

Indexは通常ページを返し、AddItemはajaxから呼び出され、DBに値を追加するアクションメソッドです。

Index.cshtmlを下記のようにします。

アクセスされるとDB内の値を表示し、buttonがクリックされるとAddItemアクションメソッドにajaxでアクセスしてデータベースに1つ値を追加します。

これでASP.netのアプリは完成です。

VisualStudioのメニューバー>[ビルド]>[{project名}の発行]から先ほど作成したWebAppsへデプロイを行いましょう。

データ追加を押すたびに[moge]が1つ増えます。

DBを見てみる

ではデータベースにデータが入っているかMaster DBを見てみましょう。

今回はDataGripというツールを使ってデータを見ていますがWindowsの方はSQL Server Management Serviceというツールを使うのが良いかと思います。

データが入っていました。

ではレプリケーション先のslaveのDBを見てみましょう。

データが入っていませんでした。

レプリケーションされているならslaveにも同じデータが入っているはずですがはいっていないのはとても気になります。

@Masayuki_Ozawa さんいわくレプリケーションには多少タイムラグがあるそうです。それが原因でまだ反映されてないと思われます。

数時間ほど待ったところ、無事レプリケーションできていました。

フェールオーバーしてみる

geoレプリケーションをしている場合、slave DBをボタン1つでMasterに昇格することができます。

セカンダリのDBの右端をクリックして「フェールオーバー」を押します。

セカンダリDBがプライマリDBへと昇格しました。

アプリケーションの接続文字列はMasterとSlaveで違うので切り替える必要があります。