Azure SQL Databaseで、Elastic PoolにGEOレプリケーションする時にハマった話

はじめに

Azure SQL Databaseは単独リージョンへの展開のみで 99.99% の可用性をSLAで保証しています。(SQL Database の SLA

とはいえ「2017年3月 のAzure障害祭り」のようなことが発生することも事実です。
(私個人としては、”Azure(やクラウド)批判派”ではなく”Azure(クラウド)推進派”であり、障害は起こる前提を想定すべき、との立場です)

単独で 99.99% のアベイラビリティに加えて「GEOレプリケーション」を組んでおく事が、さらなる安心、さらなるアベイラビリティの向上につながります。

という事で(仕事上のこともあり)、Azure SQL DatabaseのGEOレプリケーションについて調べる中で、少しハマった事がありましたので、ここにメモしておきます。

行おうとした事は以下です。

  • 複数のデータベースを東日本リージョンに作成する
  • 複数のデータベースは、1つのエラスティック データベース プールを利用する
  • 複数のデータベースは、それぞれ西日本リージョンにGEOレプリケーションする
  • 西日本リージョンのGEOレプリケーション先は、マスターより eDTU値 を落としたエラスティック データベース プールとする

1. マスターのSQL Databaseを作成

Azureポータルを表示します。

1.1. 1つ目のSQL Databaseを作成

「新規作成 → SQL Databaseを検索」します。

f:id:daigo-knowlbo:20170615235444p:plain

SQL Database」を作成します。

f:id:daigo-knowlbo:20170615235542p:plain

作成するSQL Databaseは以下の設定とします。

データベース名: RdExampleSQL1
リソースグループ: RdExampleSQL
サーバー: サーバー名 rdsqlsrv1 / 場所 東日本

f:id:daigo-knowlbo:20170615235901p:plain

SQLエラスティックプールを使用。
エラスティックプールデータベース: 名前 RdSqlPool1 / 価格レベル Standard Pool / プールの構成 200 eDTU

f:id:daigo-knowlbo:20170616000324p:plain

「作成」ボタンをクリックしたら、デプロイが完了するまでしばらく待ちます・・・

1.2. 2つ目のSQL Databaseを作成

先程と同様の手順にてSQL Databaseの作成を行います。
構成内容は以下とします。

データベース名: RdExampleSQL2
リソースグループ: RdExampleSQL
SQLエラスティックプール使用: あり
エラスティックプールデータベースプール: RdSqlPool1(先程作成したRdExampleSQL1と共通のプール)

f:id:daigo-knowlbo:20170616003622p:plain

以上で東日本リージョンに「RdSqlPool1」というエラスティック データベース プール上に、2つのデータベース「RdExampleSQL1」と「RdExampleSQL2」が作成されました。

f:id:daigo-knowlbo:20170616004004p:plain

1.3. [NG!!]Geoレプリケーションを構成

ここからが、私がちょっとハマった点です。。。
「RdExampleSQL1」SQLデータベースを西日本リージョンにGEOレプリケーションさせようとしました。

「RdExampleSQL1」を選択します。

f:id:daigo-knowlbo:20170616004133p:plain

「geoレプリケーション」を選択します。

f:id:daigo-knowlbo:20170616004303p:plain

レプリケーション先として「西日本」リージョンを選択します。

f:id:daigo-knowlbo:20170616004508p:plain

すると、「エラスティック データベース プール」が選択できません。
「対象サーバー」を構成しても「エラスティック データベース プール」はロックされた状態のままです。

f:id:daigo-knowlbo:20170616004618p:plain

ここで一度、私は「GEOレプリケーションにはエラスティック データベース プールが使えないのではないか?」と考えてしまいました・・・
が、事実はそうではなく以下の手順を行うことで可能でした。
(ちなみに、以下の方法は帰宅途中の電車の中で突然「もしかして!?」と思いつきました。人間の突然の思いつき、は不思議・・・^^;)

2. レプリケーション先のエラスティック データベース プールを作成

正しい手順としては、「1.2. 2つ目のSQL Databaseを作成」の続きになります。

「新規作成 → SQL エラスティック データベース プール」を検索・作成します。

f:id:daigo-knowlbo:20170616005113p:plain

f:id:daigo-knowlbo:20170616005130p:plain

f:id:daigo-knowlbo:20170616005150p:plain

以下の画面で、「サーバー」をクリックし、「新しいサーバーの作成」を選択します。
サーバー構成は以下とします。

サーバー: rdsqlsrv2
場所: 西日本

f:id:daigo-knowlbo:20170616005430p:plain

「プールの構成」をクリックします。eDTU を 50 に設定します(マスターの eDTU 200 より低い値)。

f:id:daigo-knowlbo:20170616005533p:plain

「作成」ボタンをクリックしたら、デプロイが完了するまでしばらく待ちます・・・

以下が、西日本リージョンに「エラスティック データベース プール(RdSqlPool2)/ サーバー(rdsqlsrv2)」が作成された画面です。

f:id:daigo-knowlbo:20170616005923p:plain

3. Geoレプリケーションを構成

では RdExampeSQL1(東日本リージョン) を西日本リージョンにGEOレプリケーションしましょう。

RdExampleSQL1(SQLデータベース)を選択し、「geoレプリケーション」メニューをクリックします。

f:id:daigo-knowlbo:20170616010101p:plain

レプリケーション先として「西日本」リージョンを選択します。

f:id:daigo-knowlbo:20170616010159p:plain

以下の画面で、「対象サーバー」をクリックすると、先程作成した「rdsqlsrv2」が選択することができます。
「rdsqlsrv2」を選択します。

f:id:daigo-knowlbo:20170616010241p:plain

「エラスティック データベース プール」をクリックします。

f:id:daigo-knowlbo:20170616010502p:plain

「RdSqlPool2」を選択します。

f:id:daigo-knowlbo:20170616010548p:plain

「OK」ボタンをクリックすると、デプロイが開始されます。

f:id:daigo-knowlbo:20170616010627p:plain

RdExampeSQL2 についても同様の geoレプリケーション 設定を行います。

4. 作成結果

以上の操作により、以下のようなAzure SQL Database構成が完成しました。

f:id:daigo-knowlbo:20170616014440p:plain

  • 東日本リージョンのエラスティック データベース プールは 200eDTU

f:id:daigo-knowlbo:20170616014515p:plain

f:id:daigo-knowlbo:20170616014542p:plain

  • 東日本リージョンの2つのデータベース「RdExampleSQL1 / RdExampleSQL2」は西日本リージョンの 50 eDTU 環境のレプリケーションされている
    f:id:daigo-knowlbo:20170616011717p:plain
    f:id:daigo-knowlbo:20170616011800p:plain

まとめ

ということで、Azure SQL Databaseにおいて、無事、2リージョン間で「エラスティック データベース プールによるGeoレプリケーション」が完成しました。
エラスティック データベース プールを使うか、データベース個別にDTUを確保するか等はシステム規模や要件、コストにより要検討事項ですが、決した安くはないクラウドにおいて、適切なプランや構成を選択していきたいですね。

また、今回「Amazon RDS」も並行して調べてみたのですが、RDSの場合はMulti-AZ構成にしても「SQL Serverを使用した場合には、アベイラビリティに関するSLAが付かない」という点にちょっとびっくりしました。「MySQL, MariaDB, Oracle or PostgreSQL」の場合には 99.95% のアベイラビリティSLAされます。

という個人的にハマったことを含めての投稿でした。

※週末にはまたCosmos DB入門の続きを書きますー、ではー。