このエントリはQiita Advent Calendar 2017 Microsoft Azureサービスいちから紹介 の6日目です。
ナレッジコミュニケーションの大柳です(@oyngtmhr)。
6日目はAzure Cosomos DBです。昨日のSQL Databaseに続きデータベース系サービスです。
概要
Azure Cosomos DBは、低レイテンシで、世界中のデータセンターにグローバルに分散したデータベースをクラウド上で構築できるサービスです。AWSでいうとDynamoDB、GCPだとCloud Spannerに相当するサービスです。
・データモデル
ドキュメント、グラフ、キーと値、テーブル、列指向の各データモデルを利用できます。
DocumentDB:JSONベースのデータに対してSQLクエリによる操作ができます。
MongoDB:ドキュメント指向のデータベース。名前の通りMongoDBライブラリ、ドライバー、ツール、アプリケーションと互換性があります。
Table API:Key-Value型データベースです。Storageサービスの一部だったTable StorageがCosmos DBに統合されました。
Graph (Gremlin):グラフ型データベースを提供します。
Cassandra API: Apache Cassandra実装で構築されたKey-Value型データベースです。
・グローバル分散
一部のリージョンを除いて、全リージョンに対してレプリケートできます。どのリージョンにレプリケートするか、フェールオーバー時にどのリージョンを優先的に使うかなどの設定も可能です。
・性能・スケール
Cosmos DBでは、要求ユニットという単位でCPU、メモリ、IOPSが割り当てられます。新しいコレクション、テーブル、グラフを使い始める時に、1秒あたりの要求ユニット(RU/秒) を指定します。
ストレージについては、容量の上限はありません。テーブルなどデータが作った分だけ、GB単位で課金されます。
Cosmos DBは割り当てられた要求ユニット数に基づいて、物理パーティションを割り当て、データの増加に応じてデータ分割やバランス調整を行います。
この要求ユニットですが、データベースに対する読み取り、書き込み、クエリなど操作の種類によって、消費される要求ユニット数は変わってきます。ある操作で使用された要求ユニット数は、リクエストに対するレスポンスヘッダーに含まれており、そこで確認できます。要求ユニット数に影響を与える要因は下表のようなものがあります。
https://docs.microsoft.com/ja-jp/azure/cosmos-db/request-units から引用
事前に指定した秒間の要求ユニット数を超えた場合は、操作は実行できず、超過が解消するまで待機となります。このスロットルが発生すると、RequestRateTooLargeException (HTTP状態コード 429) のレスポンスを返し、ヘッダの x-ms-retry-after-ms で待機しなければならない時間がミリ秒で返ってきます。なお、.NET クライアントSDKを使っている場合は、SDKが待機と再試行を行ってくれるため、アプリロジックでの考慮は不要になります。
・整合性レベル
5つの整合性レベルが提供されます。レベルによって、整合性、可用性、待ち時間、スループットが変わってきます。
厳密(Strong)、有界整合性制約(Bounded Staleness)、セッション(Session)、一貫性のあるプレフィックス(Consistent Prefix)、、結果的(Eventual Consistency)の順に一貫性は弱くなりますが、低レイテンシでIO性能、スループットは良くなっていきます。
https://docs.microsoft.com/ja-jp/azure/cosmos-db/consistency-levels から引用
・バックアップ
Cosmos DBは4時間ごと自動バックアップを取得し、最新2世代のバックアップが保存されます。データの破損などで自動バックアップから復旧させたい場合は、ユーザ自身の操作ではできず、8時間以内にAzureサポートに連絡する必要があります。
・セキュリティ
データはCosmos DBへの保存時に暗号化されます。ユーザで意識する必要はありません。
その他
・Strong一貫性を使用する場合は、複数のリージョン分散はできない。
・Azure Cosmos DB Emulatorというローカル マシンでCosmos DBを使ったアプリケーションの開発とテストを行うことができるツールも提供されている。AWSのDynamo DBにもDynamoDBローカルがあるけど、NoSQL系だけローカル開発ツールが提供されている理由を知りたい。 https://docs.microsoft.com/ja-jp/azure/cosmos-db/local-emulator
・要求ユニットの計算ツールも提供されている https://www.documentdb.com/capacityplanner
・インデックスの指定有無、パーティションの分割もできる模様。
料金
・データが格納されたSSDストレージにGBあたりで課金される(¥25.50 GB/月)
・予約済みの要求ユニット数(RU)に対して課金される(100RUごと、最低400R)
・他リージョンにレプリケーションを持つ場合は、リージョン数分に課金される
・レプリケーションに伴うリージョン間データ転送にも課金される。
まとめ
AWS、GCPでもグローバル分散型のデータベースは提供されますが、Cosmos DBはドキュメントDB、グラフ型DB、キー・バリュー型など様々なデータモデルを1サービスで使えるところは他クラウドにはなく魅力的です。Azure FunctionsとCosmos DBを組み合わせれば、今流行りのサーバレス構成も、すぐに構築できます。さらにMachine LearningやCognitiveサービスも組み合わせて、サーバレスでいろいろできるアプリを作ってみたいです!