こんにちは、昨年末 Azure Cosmos DB のハンズオンセミナーに参加する機会がありましたので、セミナーレポートをしたいと思います。
『話題の Cosmos DB と App Service によるグローバル分散アプリ構築のコツ』
渋谷ヒカリエのエレベーターで8F、8/(ハチ)のイベントスペースの一角に今回の会場はありました。
今回参加したのは、日本Microsoft株式会社さんと株式会社ゼンアーキテクツさん主催の「話題の Cosmos DB と App Service によるグローバル分散アプリ構築のコツ」ということで、Cosmos DB と App Service を使って障害に強い環境を作ってみようという会です。
話して頂いたのはゼンアーキテクツCTOの三宅和之さんです。(三宅さんのブログ→PaaSがかりの部屋)
Azure Cosmos DB とは
さて、今回テーマになっている Azure Cosmos DB とはなんぞや、というところですが、Cosmos DB とは、Azure 上で提供されているグローバル分散型のマルチモデルデータベースサービスです。
グローバル分散というだけあり、用意されているリージョンは日本の「東日本」「西日本」だけでなく、アメリカ・ヨーロッパなど世界各国にリージョンがあり、全てのリージョンを簡単に利用することができます。 さらに、応答速度がSLAで保証されているという珍しいデータベースサービスです。例えば、読み取りであれば、50%は2ms以下に応答が返ってくることが保証されているそうです。10ms以下でよければ、99%がこの速度とのこと。書き込みでも、50%が6ms以下、99%が15ms以下という速度です。
冗長構成設定はとても簡単
Cosmos DB では複数のリージョンをまたいで冗長構成を作ることができます。今回のセミナーでは「東日本」と「西日本」で作成してみました。設定はポータルの地図上で使いたいリージョンを追加で選択するだけです。とても簡単。数分待てば、自動的にレプリケーションされ、全く別のリージョンに同じデータベースを作成することができます。
Cosmos DB で冗長構成の設定をした場合、書き込みと読み込みのリージョンは別々に設定されます。書き込みリージョンはどこかメインになっている1箇所で、読み取りリージョンは設定しているリージョンの中で最も近いリージョン(どういう仕組で決定されているのかは気になりますがあわかりません)という形です。つまり、書き込みと読み込みで別々のリージョンが使用されるという状況も普通に発生します。セミナーは渋谷だったので、書き込みリージョンを「西日本」にしたしところ、読み取りリージョンは「東日本」になっており、読み書きで別のリージョンになって動いていました。
リージョン間のデータ同期はどの程度かというと、数秒程度で全てのリージョンへ反映されます。とは言え、数秒はかかります。そのため、書き込んですぐに読み出して・・・というようなことした場合は、読み書きのリージョンが違うとまだ反映されていない可能性があります。というか、そう言うトランザクションが必要な処理には Cosmos DB は向いていませんので、その場合は別途SQLサーバーも用意して、トランザクションの必要な一部はSQLサーバー、それ以外は Cosmos DB、と併用するのが良いとのことです。
フェイルオーバーしてもサービスが全く止まらない
書き込みリージョンはフェイルオーバーが発生した場合は、新たにメインになったリージョンへ自動的に切り替わります。読み取りリージョンは、使おうとしたリージョンが障害等で使えない場合は自動的に別のリージョンが使用されます。
試しに、セミナーに従って構築したアプリにアクセスしながらポータルから手動でフェイルオーバーさせてみたり、一方のリージョンを削除してみたり、と障害想定のことを色々やってみましたが、一切エラーが起こることはありませんでした。実際、データセンターなどの要因で特定のリージョンが使えなくなるという事は過去にあったそうなのですが、その場合でも別リージョンと冗長化していると全く止まらないので、Cosmos DB の SLA は 99.999% に引き上げられたとのことです。
これはすごい。自分たちでも色んな冗長化策を取ってはいますが、データベースの部分はいつも難しいので、こんなに簡単にデータベースの強力な冗長化が出来るのはとても魅力的です。
最後に
現状、普段データベースはRDBMを利用しています。色んな箇所でトランザクションを必要としてるため、手放しで Cosmos DB へ移行することは出来ませんが、移行を検討する価値は十分にあります。今後利用できないか検討していきたいと思います。
最後になりましたが、セミナーを開催して頂きましたマイクロソフト様、ゼンアーキテクツ様、ありがとうございました。