【初心者向け】Azure Cosmos DB をざっくり理解する
この記事の内容
- Azure Cosmos DB はグローバル分散型の NoSQL データベースサービスで、RDB とは異なる特性を持ちます
- スキーマレス・性能保証(RU/s)・グローバル分散が主な特徴です
- 複数の API(SQL、MongoDB、Cassandra など)に対応しており、用途に合わせて選択できます
- パーティション設計や整合性レベルの考え方など、NoSQL 特有の設計ポイントがあります
- Azure ポータルから直感的にデータベース・コンテナ・アイテムの作成とクエリ実行が行えます
Cosmos DB とは?
Azure Cosmos DB は、Microsoft Azure が提供するグローバル分散型の NoSQL データベースサービスです。リレーショナルデータベース(RDB)や SQL データベースは知っているけれど、Cosmos DB はよくわからない…という方に向けて、RDB との違いも含めて概要を説明します。
Cosmos DB は柔軟なスキーマ・高いスケーラビリティ・グローバル分散・性能保証といった特徴を持っており、RDB とは設計思想が異なります。
リレーショナルデータベース(RDB)との違い
RDB の特徴
RDB は Excel のテーブルのように、列やデータ型などの構造を厳密に決めてから使います。同じ構造のデータが追加されていくイメージです。
また、複数人が同時に操作してもデータが矛盾しない仕組み(トランザクション管理)が強力です。銀行口座のように、絶対にデータの矛盾が許されない用途に向いています。
一方で、多くの人が同時に操作するとロックが発生しやすく、性能の維持・保証が難しくなるという側面もあります。
Cosmos DB の特徴
Cosmos DB はデータの構造を事前に決める必要がありません。各アイテムごとに持つ属性が異なっていても保存できます(スキーマレス)。データは JSON 形式で保存されます。
「リクエストユニット/秒(RU/s)」という単位で 1 秒あたりの処理能力を事前に設定することで、性能が保証されます。これは RDB にはない大きな特徴です。
また、世界中の複数リージョンにデータを分散・複製でき、どこからでも高速アクセスが可能です。書き込みも複数リージョンで行えます。
さらに、SQL ライクな API のほか、MongoDB・Cassandra・Gremlin・Table API など、さまざまな API を選択して利用できます。
Cosmos DB のメリットとデメリット
メリット
- 柔軟なデータ構造(スキーマレス)
- 性能保証(RU/s で設定)
- グローバル分散・複製が容易
- 複数 API 対応で開発スタイルに合わせやすい
デメリット
パーティション設計の難しさ:データの分散単位となる「パーティションキー」の設計が重要です。設計が悪いと性能が出ません。
ジョインや集計が苦手:データ構造が自由な分、複雑な集計や結合処理は RDB に比べて不向きです。
整合性レベルが選択式:RDB ほど強い整合性はありません。用途に応じて「最終的整合性」や「セッション整合性」などから選びます。
コスト予測が難しい場合がある:性能を保証するため、使用量に応じてコストが変動します。
Cosmos DB の作成と基本操作
1. サービス選択
Azure ポータルで「Cosmos DB」と検索し、「Azure Cosmos DB」を選択します。MongoDB API や PostgreSQL なども表示されますが、標準の Cosmos DB(NoSQL)を選択します。
2. API の選択
| API | 用途 |
|---|---|
| Core (SQL) API | 一般的な NoSQL 用途。JavaScript・Python 等のライブラリからアクセス可能 |
| MongoDB API | MongoDB 互換で利用したい場合 |
| Table API / Cassandra API / Gremlin API | 用途に応じて選択 |
3. ワークロード・リソース設定
- 学習・開発・テスト・本番など用途を選択します
- サブスクリプションとリソースグループを指定します
- アカウント名を設定します(グローバルで一意である必要があります)
4. 容量モード
プロビジョンドスループット:RU/s を指定して性能を保証します。グローバル分散もサポートしており、本番環境や高いパフォーマンスが必要な場合に推奨されます。
サーバーレス:使った分だけ課金されます。学習や開発用途に向いています。
5. ネットワーク・バックアップ・セキュリティ
- ネットワーク制御(全ネットワーク・特定 IP・VNet・プライベートエンドポイント等)を設定できます
- バックアップ方式として定期バックアップまたは連続バックアップを選択できます
- 認証・暗号化方式も選択できます
データベース・コンテナ・アイテムの作成
データベース・コンテナの作成
新規データベースを作成し、例えば「shopdb」などの名称を付けます。続いてコンテナ(コレクション)を作成します。商品データであれば「products」といった名称が適切です。
パーティションキーの指定が重要なポイントです(例:/category)。これはデータをどのように分散するかを決める設計要素であり、性能に大きく影響します。
データの登録
データは JSON 形式で登録します。アイテムごとに異なる属性を持たせられるのがスキーマレスの強みです。
// ノートPC
{ "id": "1", "name": "laptop", "price": 1200, "category": "electronics" }
// Tシャツ(size 属性あり)
{ "id": "2", "name": "T-shirt", "size": "L", "price": 30, "category": "clothing" }
// コーヒー(brand 属性あり)
{ "id": "3", "name": "coffee", "brand": "Blue Bottle", "price": 15, "category": "food" }
アイテムごとに brand や size など異なる属性があっても問題なく保存できます。
クエリの実行
SQL ライクなクエリでデータを抽出できます。
SELECT * FROM c WHERE price > 50
パーティションキーや属性を活用した効率的な検索が可能です。
グローバル分散と整合性レベル
グローバル分散
Azure ポータルから簡単にリージョンを追加でき、世界中のどこにでもデータを複製できます。書き込みも複数リージョンで可能なため、場所に依存しない高速アクセスが実現できます。
整合性レベル
Cosmos DB では、用途や要件に応じて整合性レベルを選択できます。
| 整合性レベル | 説明 |
|---|---|
| 強い整合性(Strong) | すべてのリージョンで即時に同じデータが見える |
| バウンデッド・ストレイル整合性 | 最大の遅延やバージョン数を指定する |
| セッション整合性(Session) | 同じセッション内での一貫性を確保(デフォルト) |
| 一貫性のあるプレフィックス | 書き込み順序を保証しつつ遅延を許容する |
RDB ほど強い整合性はありませんが、用途に応じてレベルを選択することで、パフォーマンスと整合性のバランスを取ることができます。
まとめ
Azure Cosmos DB は、RDB とは異なる設計思想を持つグローバル分散型の NoSQL データベースサービスです。スキーマレスなデータ構造・RU/s による性能保証・世界規模のグローバル分散・複数 API サポートといった特徴を持ち、大規模かつ柔軟なデータ管理が必要なシナリオに適しています。
一方で、パーティションキーの設計・整合性レベルの選択・コスト管理など、RDB とは異なる考慮点もあります。Azure ポータルから直感的に操作できるため、まずは学習・開発環境でサーバーレスモードを試してみるのがよいでしょう。
RDB との違いを理解した上で、用途に合わせて Cosmos DB を活用してみてください。