Azure Cosmos DBのデータモデルとRU

Tech

Azure Cosmos DBのデータモデルとRUは、パフォーマンスとコストを最適化する上で不可欠な要素である。適切な設計により、高いスケーラビリティと効率的な運用が実現可能となる。

Azure Cosmos DBのデータモデルとRU

アーキテクチャ

Azure Cosmos DBは、グローバル分散型、マルチモデルデータベースサービスであり、ドキュメント、キーバリュー、グラフ、カラムナといった多様なデータモデルをサポートする。その中核概念は「Request Unit (RU)」であり、これはデータベース操作のコストを抽象化したものとなる。データモデル設計は、RU消費量、クエリパフォーマンス、およびストレージ利用効率に直接影響を与える。

データモデリングでは、エンティティの格納形式、リレーションシップ、インデックス戦略を検討する。特に、パーティションキーの選択は重要である。パーティションキーは、データを論理パーティションに分散させるために使用され、適切なキー設定により、データの均等な分散とホットパーティションの回避が可能となる。これにより、大規模なワークロードでも高いスループットと低レイテンシーが維持される。

RUはCPU、メモリ、IOPSなどのリソース消費を正規化した単位で、読み取り、書き込み、クエリ、インデックス操作など、あらゆるデータベース操作に適用される。プロビジョニングスループットはRU/秒で指定され、この値がアプリケーションのピーク負荷に対応するように設定されるべきである。オートスケールスループットは、ワークロードに応じてRU/秒を自動的に調整し、コスト効率とパフォーマンスのバランスを取る。

graph LR
    A["クライアントアプリケーション"] -->|CRUD操作| B("Azure Cosmos DB Gateway")
    B --> C{"論理パーティションキーの評価"}
    C --> D1["物理パーティション P1"]
    C --> D2["物理パーティション P2"]
    C --> D3["物理パーティション P3"]
    D1 --> E["データアイテム A(\"パーティションキー=X\")"]
    D2 --> F["データアイテム B(\"パーティションキー=Y\")"]
    D3 --> G["データアイテム C(\"パーティションキー=Z\")"]
    E --> H{"データモデルとインデックス"}
    F --> H
    G --> H
    H --> I["RU消費"]
    I --> J["RU/秒のプロビジョニング"]
    subgraph データモデルとRUの関係
        C --- I
        D1 --- E
        E --- I
    end
    style A fill:#f9f,stroke:#333,stroke-width:2px
    style B fill:#bbf,stroke:#333,stroke-width:2px
    style C fill:#ccf,stroke:#333,stroke-width:2px
    style D1 fill:#fcf,stroke:#333,stroke-width:2px
    style D2 fill:#fcf,stroke:#333,stroke-width:2px
    style D3 fill:#fcf,stroke:#333,stroke-width:2px
    style E fill:#efe,stroke:#333,stroke-width:2px
    style F fill:#efe,stroke:#333,stroke-width:2px
    style G fill:#efe,stroke:#333,stroke-width:2px
    style H fill:#eef,stroke:#333,stroke-width:2px
    style I fill:#fef,stroke:#333,stroke-width:2px
    style J fill:#fdf,stroke:#333,stroke-width:2px

設定手順

Cosmos DBアカウント、データベース、コンテナの作成はAzure CLIまたはPowerShellを用いて実行可能である。パーティションキーはコンテナ作成時に不可逆的に設定されるため、慎重な検討が必要である。

Azure CLIを用いたCosmos DBリソース作成とスループット設定

# 1. リソースグループの作成
az group create --name MyCosmosDBResourceGroup --location japaneast

# 2. Cosmos DBアカウントの作成 (Core (SQL) API)
az cosmosdb create \
  --name mycosmosdbaccount123 \
  --resource-group MyCosmosDBResourceGroup \
  --kind GlobalDocumentDB \
  --default-consistency-level Session \
  --locations RegionName="Japan East" FailoverPriority=0 \
  --enable-free-tier true # 開発/テスト環境向け、本番では非推奨

# 3. データベースの作成
az cosmosdb sql database create \
  --account-name mycosmosdbaccount123 \
  --name MyDatabase \
  --resource-group MyCosmosDBResourceGroup

# 4. コンテナの作成 (パーティションキーは /categoryId、オートスケールRU設定)
az cosmosdb sql container create \
  --account-name mycosmosdbaccount123 \
  --database-name MyDatabase \
  --name MyContainer \
  --partition-key-path /categoryId \
  --resource-group MyCosmosDBResourceGroup \
  --max-throughput 4000 # オートスケール最小400 RU/s、最大4000 RU/s
# または固定RU/sの場合:
# --throughput 400

運用監視

Cosmos DBの運用では、可観測性と継続的な最適化が重要となる。

  • 可観測性: Azure MonitorはCosmos DBの主要な監視ツールである。
    • メトリック: 総RU消費量、正規化されたRU消費量、パーティションのRU消費量、遅延、スループットエラーなどを監視する。特に「正規化されたRU消費量」は、プロビジョニングされたRU/秒に対する実際の消費量の割合を示し、スロットリングの発生可能性を判断するのに役立つ。
    • ログ: 診断ログをAzure Log Analyticsワークスペースに送信し、操作ログ、リクエストログ、整合性ログを収集・分析する。これにより、不正アクセス、パフォーマンス問題、データ整合性に関する詳細な洞察を得る。
  • SLA: Cosmos DBは、スループット、レイテンシー、可用性、整合性に関して99.999%(マルチリージョンアカウント)のSLAを提供する。これを維持するため、RU/sの適切なプロビジョニングと、リージョン間のレプリケーション戦略が重要となる。
  • バックアップとDR:
    • 継続的バックアップ: 最大30日間のポイントインタイムリストアが可能で、予期せぬデータ削除や破損からの回復を支援する。
    • 定期的バックアップ: 自動的に最大2回のバックアップが、追加費用なしで90日間保持される。
    • DR (Disaster Recovery): マルチリージョン書き込み構成を利用することで、リージョン障害時にもアプリケーションの継続的な可用性を確保できる。フェイルオーバーは自動的に行われる。

セキュリティ

Cosmos DBのセキュリティは、Azure Entra IDとの統合を中心に構築される。

  • アイデンティティと権限境界:
    • Azure Entra ID (旧 Azure AD): Cosmos DBの管理プレーンおよびデータプレーンのアクセス制御に利用される。
    • ロールベースアクセス制御 (RBAC):
      • 管理プレーン: Azure組み込みロール(例: Cosmos DB Contributor)をEntra IDユーザー/グループ/サービスプリンシパルに割り当て、アカウント、データベース、コンテナの管理操作を制御する。
      • データプレーン: 特定のデータ操作(例: ドキュメントの読み取り/書き込み)には、Cosmos DBのデータプレーンRBACロール(例: Cosmos DB Built-in Data Reader, Cosmos DB Built-in Data Contributor)を使用し、きめ細かなアクセス制御を実現する。これにより、最小権限の原則が適用される。
  • 条件付きアクセス (CA): Entra IDの条件付きアクセスは、Cosmos DB管理プレーンへのアクセスを保護するために適用可能である。例えば、特定のネットワークロケーションからのアクセスのみを許可したり、多要素認証 (MFA) を必須にしたりするポリシーを設定できる。
  • ネットワークセキュリティ: Azure Private LinkやVNet統合により、Cosmos DBへのトラフィックをパブリックインターネットから分離し、プライベートな接続パスを確保する。
  • Defender for Cloud: Azure Defender for Cosmos DBを有効化することで、異常なデータベースアクセスパターン、SQLインジェクション、資格情報の不正使用など、潜在的な脅威に対するリアルタイムアラートと推奨事項を受け取れる。

コスト

Cosmos DBのコストは主に以下の要素で構成される。

  1. スループット (RU/秒): プロビジョニングされたRU/sまたはオートスケール設定に基づく。
  2. ストレージ: データおよびインデックスに消費されるストレージ容量。
  3. データ転送: リージョン間データ転送、CDNなど。

コスト最適化戦略

  • RU/sの最適化:
    • オートスケールスループット: ワークロードの変動が大きい場合に有効。最小RU/sを設定し、最大RU/sまで自動的にスケールアップ/ダウンする。これにより、ピーク時のパフォーマンスを確保しつつ、アイドル時の過剰なプロビジョニングを回避する。
    • プロビジョニングスループット: 予測可能な安定したワークロードに適している。適切なベースラインRU/sを設定し、必要に応じて手動で調整する。
    • RU消費量の監視: Azure Monitorで正規化されたRU消費量を監視し、スロットリングが発生していないか、あるいは過剰なRUをプロビジョニングしていないかを確認する。
  • リザーブドキャパシティ (Reserved Capacity): 1年または3年の契約で、RU/秒の割引を受けることができる。予測可能な長期的なワークロードを持つ場合に大きなコスト削減効果がある。
  • パーティションキーの最適化: ホットパーティションを回避し、RUを均等に分散させることで、最小限のRU/sで最大のパフォーマンスを引き出す。
  • インデックス戦略の最適化: 不要なインデックスを削除し、必要なインデックスのみを定義することで、ストレージコストと書き込み操作時のRU消費を削減する。
  • TimeToLive (TTL): 古いデータや不要なデータを自動的に削除することで、ストレージコストを削減する。

落とし穴

  • 不適切なパーティションキー: データが均等に分散されず、特定のパーティションにアクセスが集中する「ホットパーティション」が発生し、パフォーマンスボトルネックやスロットリングを引き起こす。
  • 過剰なインデックス: 全てのフィールドにインデックスを設定すると、ストレージ使用量が増加し、書き込み操作のRU消費も増大する。必要なクエリをサポートする最小限のインデックスに留めるべきである。
  • RUの不足または過剰プロビジョニング: 不足するとアプリケーションでスロットリングエラーが発生し、パフォーマンスが低下する。過剰プロビジョニングは不要なコスト増大を招く。
  • グローバル分散時の整合性レベルの選択: 強力な整合性レベルは読み取り時に高コストとなる可能性があり、最終的な整合性レベルは読み取りパフォーマンスを向上させるが、書き込みレプリケーションの遅延を許容する必要がある。アプリケーションの要件に応じて適切に選択すべきである。

まとめ

Azure Cosmos DBのデータモデルとRUは、サービスの性能、スケーラビリティ、およびコスト効率を決定する重要な要素である。最適なパーティションキーの選択、効率的なデータモデル設計、そしてRU消費量の継続的な監視と調整が不可欠となる。また、Entra IDベースのRBACやDefender for Cloudといったセキュリティ機能を活用し、データ保護を強化する必要がある。これらのベストプラクティスを適用することで、堅牢で高性能かつコスト効率の高いアプリケーション基盤を構築できる。

ライセンス:本記事のテキスト/コードは特記なき限り CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。

コメント

タイトルとURLをコピーしました