米マイクロソフトが「Build 2017」で発表した新しいクラウドNoSQLデータベース「Azure Cosmos DB」。Microsoft Azureの世界40リージョン(計画中6カ所を含む)にデータを分散保存し、分散された各リージョンのデータが一貫性を保って利用できるように設計されている。
もともとは、マイクロソフトが自社のアプリケーションをグローバルに提供するために、社内向けに2010年頃から開発してきたものだ。世界中のリージョンから同時に書き込まれたデータに、最寄りのリージョンからアクセスできるため、応答性の高いアプリケーションを構築することができる。
Build 2017で紹介されたCosmos DBの次の特徴について、日本マイクロソフトクラウドプラットフォーム技術部 テクノロジースペシャリストの廣瀬一海氏(デプロイ王子)に一問一答形式で教えてもらった。
- 惑星規模でスケール
- マルチモデル、マルチAPI
- Turn-key global distribution
- 5つの一貫性モデル
- 大規模アプリケーションの開発を支援
“惑星規模”でスケールするデータベースとは?
この惑星(地球)にあるAzureリージョンで、データを分散保存するデータベース基盤という意味です。
ユーザーは、どのリージョンにデータを分散配置するか、Azure Cosmos DBでデータベースを作成する際に選択でき、いつでも追加・変更することができます。Cosmos DBは現在、25リージョンへのレプリケーションが可能です。まだAzureの全リージョンには対応していませんが、理論上、すべてのリージョンに分散することができます。日本の東西リージョンは対応済みで、今後、利用できるリージョンが順次拡大することを期待しています。
マルチモデル、マルチAPIとは?
Cosmos DBは、「データの保存方式とAPIを選べる」分散データベース基盤です。この特徴をマルチモデル、マルチAPIと表現しています。
保存方式は、Document、Graph、Key-Valueの3つのNoSQLデータモデルから選択できます。そして、それぞれのデータモデルで利用できるAPIを提供しています。DocumentではDocumentDB APIとオープンソースのMongoDB API、GraphではオープンソースのGremlin API、Key-ValueではTable APIというように対応します。
これまで、分散NoSQLデータベースサービス「DocumentDB」として提供されていたものは、Cosmos DB分散データベース基盤上で構築され、今後DocumentDBはCosmos DBに統合され、選択肢の1つとして提供されます。
データの保存方式とAPIは、Cosmos DBでデータベースを作成する際に指定します。現状は作成後の変更はできません。
Turn-key global distributionとは?
Cosmos DBは、Azureポータルの地図上でリージョンをポチポチとクリックするだけで、データを分散保存するリージョンの選択が完了します。新しいリージョンを追加している間も、Cosmos DBは停止しませんし、スループットも維持されます。これをTurn-key global distributionと呼んでいます。
5つの一貫性モデルとは?
分散データベース全般の話ですが、「データの一貫性」と「パフォーマンス」はトレードオフの関係にあります。日本と米国に分散されたデータベースがあるとして、日本からデータが書き込まれたとき、データの一貫性を確実に保証するためには、日本と米国のデータベースの同期が完了するのを待つ必要があります。同期完了を待ってから次の処理が実行されるため、当然パフォーマンスが落ちます。スピードを重視したいシステムでは、一貫性の条件を少し緩めて、例えば何ミリ秒まではデータの不整合を認めるといった調整によって、性能を高めることができます。
Cosmos DBでは、この一貫性の強弱のレベルを、5段階から選択できるようになっています。確実に一貫性を保証する「Strong」から、t秒以降はk世代以内のデータが読めることを保証する(tとkはユーザーが指定)「Bounded Staleness」、書き込み終了後に書き込んだリージョンではデータが読める「Session」、読めない場合もある「Consistent Prefix」、読めない「Eventual」まで提供しています(日本語画面では強固、有界整合性制約、セッション、CONSISTENTPREFIX、最終的)。
一貫性が強いほどパフォーマンスは悪くなり、逆に弱いほどパフォーマンスは向上します。このように、パフォーマンスと可用性をアルゴリズムで管理できるのが、Cosmos DBの大きな特徴です。
大規模アプリケーションの開発を支援とは?
例えば、世界中に同じアプリケーションを展開して、それをブラジルから使うケースを考えてみてください。このアプリのデータベースAPIのアクセス先が日本だったら、アプリからデータベースへのアクセスは相当の時間がかかっていました。
ひとつの解決方法として、従来は、各国に個別にデータベースを設置して、個別に運用したりしてきたわけです。
モバイルファースト、クラウドファーストの時代になり、開発者が世界の市場を対象にしてアプリケーションを構築することが増えてきました。IoTのシステムを例にとると、自動車や航空機に搭載されたデバイスなどは、それこそ世界中を移動して、世界中からデータベースへアクセスします。Cosmos DBによって、これら世界中から届くデータを1つのデータベースとして統合的に管理できるようになります。