Azure Cosmos DBの調査

IoT(Internet of Things) システムでは、各種センサーから、秒以下の周期で取得された、大量の時系列データを取り扱います。このようなデータを保持するシステムとして、時系列データベースは求められています。そこで、時系列データを扱える Azure Cosmos について、まとめました。
動作環境やライセンスなど基本情報から、対応プログラム言語、可用性、拡張性など機能情報やセキュリティなど掘り下げて、以下のようにまとめました。

# Azure Cosmos DB

Azure Cosmos DB は、スループットとストレージをエラスティックかつ個別にスケーリングできます。スループットとストレージをエラスティックにスケーリングし、SQL、MongoDB、Cassandra、Tables、Gremlin などの好みの API を使用して、数ミリ秒(1桁) の高速データ アクセスを利用できます。 Cosmos DB では、スループット、待ち時間、可用性、および整合性の保証について包括的なサービス レベル アグリーメント (SLA) が提供されています。

# 基本情報

|項目&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|内容|
|-----|--------|
|URL|https://azure.microsoft.com/ja-jp/services/cosmos-db/|
|データモデル|Cosmos DBは、「データの保存方式とAPIを選べる」分散データベース基盤である。この特徴をマルチモデル、マルチAPIと表現しています。<br>保存方式は、Document、Graph、Key-Valueの３つのNoSQLデータモデルから選択できます。そして、それぞれのデータモデルで利用できるAPIを提供しています。DocumentではDocumentDB APIとオープンソースのMongoDB API、GraphではオープンソースのGremlin API、Key-ValueではTable APIに対応します。|
|動作環境|Cosmos DBは CPUやメモリのような物理リソースではなく、RUという単位の割り当てを行う考え方をします。RUはスループットの単位で、 1 RUは、1 KBのドキュメントを取得するスループットに相当します。<br>コンテナまたはデータベースあたり 最低 400 RU/秒から設定でき、100 RU/秒単位でスケールアップ可能です。<br>参照 : [Azure Cosmos DB の価格](https://azure.microsoft.com/ja-jp/pricing/details/cosmos-db/), [Azure Cosmos DB FAQ](https://docs.microsoft.com/ja-jp/azure/cosmos-db/faq)|
|実装言語|C++|
|ライセンス|製品ライセンス|
|主なバージョン|(2019-05-15) : [強化された SQL API クエリ機能](https://azure.microsoft.com/ja-jp/updates/enhanced-sql-api-query-functionality-in-azure-cosmos-db-is-now-available/), [アップグレード済み Gremlin API 機能](https://azure.microsoft.com/ja-jp/updates/upgraded-gremlin-api-functionality-for-azure-cosmos-db-is-now-available/)<br>(2018-12-04) : [CORS (クロスオリジン リソース共有) サポートを提供](https://azure.microsoft.com/ja-jp/updates/cors-support-in-azure-cosmos-db/)<br>(2018-09-24) : [Cassandra API の GA](https://azure.microsoft.com/ja-jp/updates/azure-cosmos-db-cassandra-api-now-generally-available/), [マルチマスター・サポート](https://azure.microsoft.com/ja-jp/updates/cosmos-db-multi-master-support-now-generally-available/)|
|開発元|Microsoft|
|開発体制|不明|
|活動状況|年間26件の[Azure Cosmos DB の更新情報](https://azure.microsoft.com/ja-jp/updates/?product=cosmos-db)がアナウンスされいます。<br>また、CosmosDB は OSS として公開していないが、関連ツールを公開しています。<br>https://github.com/CosmosDB|
|国内サポート体制|日本マイクロソフトが国内のAzureをサポートします。Azure サポート・オプションが用意されています。 <br>参照 : [Azure のサポート プラン](https://azure.microsoft.com/ja-jp/support/plans/)|
|その他|Azure Cosmos DBはフルマネージドサービスなので、拡張性、高可用性においてユーザが管理する必要がありません。|

# 機能情報

|項目&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|内容|
|-----|--------|
|対応プログラム言語|.NET, Java, Javascrit(Node.js), Python, Go, Xamarin<br>参照 : [Azure Cosmos DB のドキュメント](https://docs.microsoft.com/ja-jp/azure/cosmos-db/)|
|クエリ言語|データのアクセスとクエリ実行には SQL、MongoDB、Cassandra、Gremlin、Etcd、Table 用の API を使用して、世界規模の運用分析を実行するには Apache Spark を使用します。<br>参照 : [Azure Cosmos DB](https://azure.microsoft.com/ja-jp/services/cosmos-db/)|
|データ圧縮|未サポート|
|データ自動集計|SQL API 使用時、トリガーを JavaScript で記述できます。<br>参照 : [ストアド プロシージャ、トリガー、およびユーザー定義関数](https://docs.microsoft.com/ja-jp/azure/cosmos-db/stored-procedures-triggers-udfs)|
|期限解放機能|Azure Cosmos DBは、Time to Live (TTL)を使用して、一定の期間が経過したらアイテムをコンテナーから自動的に削除する機能を提供します。TTL に基づいた項目の削除は無料です。<br>参照 : [Azure Cosmos DB の Time to Live (TTL)](https://docs.microsoft.com/ja-jp/azure/cosmos-db/time-to-live)|
|時系列分析関数|集計演算関数(COUNT, SUM, MIN, MAX, AVG)、日付と時刻関数(GETCURRENTDATETIME、GETCURRENTTIMESTAMP)が利用可能です。<br>参照 : [Azure Cosmos DB の集計関数](https://docs.microsoft.com/ja-jp/azure/cosmos-db/sql-query-aggregates)、 [システム関数](https://docs.microsoft.com/ja-jp/azure/cosmos-db/sql-query-system-functions)|
|インデックス|Azure Cosmos DBでは、範囲インデックスと空間インデックス 2種類のインデックスをサポートします。<br>コンテナー内のすべての項目のすべてのプロパティに自動的にインデックスが作成します。<br>参照 : [Azure Cosmos DB のインデックス作成](https://docs.microsoft.com/ja-jp/azure/cosmos-db/index-overview)|
|トランザクション|Cosmos DB内のDBエンジンでは、スナップショット分離を使用して ACID(原子性、一貫性、分離、持続性)への完全準拠のトランザクションがサポートしています。<br>参照 : [トランザクションとオプティミスティック同時実行制御](https://docs.microsoft.com/ja-jp/azure/cosmos-db/database-transactions-optimistic-concurrency)|
|ストアドプロシジャ|SQL API 使用時、ストアド プロシージャを JavaScript で記述できます。<br>参照 : [ストアド プロシージャ、トリガー、およびユーザー定義関数](https://docs.microsoft.com/ja-jp/azure/cosmos-db/stored-procedures-triggers-udfs)|
|トリガー|SQL API 使用時、トリガーを JavaScript で記述できます。<br>参照 : [ストアド プロシージャ、トリガー、およびユーザー定義関数](https://docs.microsoft.com/ja-jp/azure/cosmos-db/stored-procedures-triggers-udfs)|
|dockerコンテナ|dockerhub で Cosmos DB Emulator の Docker Container イメージが公開されています。あくまでもエミュレータなので、開発とテストを目的としています。<br>https://hub.docker.com/r/microsoft/azure-cosmosdb-emulator/|
|性能拡張|Azure Cosmos DB では、パーティション分割を使用して、データベースの個別のコンテナをスケールアウトします。論理パーティションの物理パーティションへの配置が透過的かつ自動的に管理され、コンテナーのスケーラビリティとパフォーマンスのニーズが効率的に満たされます。<br>参照 : [Azure Cosmos DB でのパーティション分割](https://docs.microsoft.com/ja-jp/azure/cosmos-db/partitioning-overview)|
|高可用性|単一リージョンのデータベースに対して 99.99% 以上の可用性を、複数リージョンのデータベースに対しては 99.999% 以上の可用性を保証し、Azure Cosmos DB での要求の処理や操作の実行を問題なく行えるようにします。<br>参照 : [Azure Cosmos DB の SLA](https://azure.microsoft.com/ja-jp/support/legal/sla/cosmos-db/v1_3/)
|運用|Azure Cosmos DB では、データのバックアップが一定の間隔で自動的に取得されます。 自動バックアップは、データベース操作のパフォーマンスや可用性に影響を与えずに取得されます。 <br>参照 : [Azure Cosmos DB でのオンライン バックアップとオンデマンドのデータ復元](https://docs.microsoft.com/ja-jp/azure/cosmos-db/online-backup-and-restore) |
|出来ないこと|Azureのフルマネージド・サービスであるため、オンプレミス環境での動作は出来ません。動作確認用のエミュレータは存在します。|

# セキュリティ

|項目&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|内容|
|-----|--------|
|通信暗号化|クライアントからのすべての通信は、SSL/TLS 1.2に対応しています。|
|DB格納領域の暗号化|Cosmos DB の保存時の暗号化のリリースにより、すべてのデータベース、メディア添付ファイル、バックアップが暗号化されます。|
|認証機能|2 種類(マスターキー、リソース トークン)のキーを使用してユーザーを認証し、そのデータとリソースへのアクセスを提供しています。|
|権限管理|ユーザ追加とロールの割り当てでアクセス管理を行います。|
|DB監査|監査ログとアクティビティ ログを使用することで、正常なアクティビティと異常なアクティビティを監視できます。|

参照 : [Azure Cosmos DB のセキュリティ - 概要](https://docs.microsoft.com/ja-jp/azure/cosmos-db/database-security)

# まとめ
マネージドサービスということもあり、高可用性、運用性が圧倒的に強いです。多目的なデータベースであるため時系列機能について疑問が残ります。また、データ圧縮機能がないことが、速度性能にどのように影響するのか、気になるポイントです。

掲載内容は、(株)東芝 デジタルイノベーションテクノロジーセンター及びソフトウェア技術センターの見解です。コメント等は広くご意見を頂ければ幸いです。

また、記述について誤りがあったり、気になることがあれば、編集リクエストやコメントでフィードバックしていただけると助かります。