DocumentDB のパーティション分割コレクションについて知っておくべき 10 のこと

執筆者: Aravind Ramachandran (Program Manager, Azure DocumentDB)

このポストは、4 月 25 日に投稿された 10 things to know about DocumentDB Partitioned Collections の翻訳です。

 

//Build 2016 では、Azure DocumentDB サービスのメジャー アップデートがいくつか発表されました (英語)。中でも特にご注目いただきたいのは、DocumentDB のパーティション分割が新たにサーバー側のビルトイン機能としてサポートされたことです。パーティション分割コレクションは、大容量のデータを高速で取得する必要があるアプリケーションや、高スループット/低レイテンシでのデータ アクセスが求められるアプリケーションにメリットのあるオプションです。この記事では、新しいパーティション分割機能について特に知っていただきたい 10 のことと、大規模なスケーリングに対応したアプリケーションを DocumentDB で作成する方法について説明します。

1. DocumentDB のコレクションとは何ですか?

DocumentDB では、スキーマを使用しないあらゆる規模の JSON ドキュメントの保存やクエリをミリ秒の応答時間で実行できます。DocumentDB では、コレクションと呼ばれるコンテナーにデータを格納します。各コレクションでは、1 秒あたり数百~数百万もの要求ユニットの処理に対応するスループットを予約できます。プロビジョニングされたスループットは、コレクションが存続する限り調整が可能で、アプリケーションの処理要求やアクセス パターンの変化に対応することができます。

コレクションとは論理的なリソースであり、1 つ以上の任意の数の物理パーティションやサーバーにまたがって存在することができます。パーティション数は、DocumentDB がストレージ容量やコレクションにプロビジョニングされたスループットに応じて決定します。なお、これまでのバージョンでは、コレクションはパーティションに 1 対 1 で対応していました。

2. DocumentDB のパーティションとは何ですか?

DocumentDB の各パーティションには一定容量の SSD ストレージが関連付けられており、高可用性を確保するために複製されます (SLA で 99.99% の可用性を保証)。パーティションの管理はすべて Azure DocumentDB が行うため、ユーザーが複雑なコードを作成したりパーティションを管理したりする必要はありません。コレクションにプロビジョニングされたスループットは、コレクション内のすべてのパーティションに均等に配分されます。

3. DocumentDB のパーティション キーとは何ですか?

コレクションを作成する際に、パーティション キー プロパティを指定できるようになりました。これは、複数のパーティションにデータを分散する場合に DocumentDB が使用する、ドキュメント内の JSON プロパティ (またはパス) です。DocumentDB はパーティション キーの値をハッシュし、その結果を使用して JSON ドキュメントの格納先パーティションを決定します。パーティション キーが同じドキュメントはすべて同一パーティションに格納されます。複数のパーティション キーで 1 つのパーティションを共有する場合もあります。

たとえば、「department」というパーティション キーを持つ、従業員に関する JSON データを格納する場合、「department」の値が「engineering」であるドキュメントはすべて同一パーティションに格納されます。同様に、「department」の値が「marketing」であるドキュメントは同一のパーティションに格納されます。

詳細については、DocumentDB でのパーティション分割に関する記事を参照してください。

4. パーティション管理はユーザーが行う必要がありますか?

パーティション分割はユーザーが管理する必要はなく、アプリケーションに対して完全に透過的に行われます。DocumentDB では、迅速な読み取りや書き込み、SQL クエリ、LINQ クエリ、JavaScript ベースのトランザクション ロジック、一貫性レベル、および REST API 呼び出しによる単一コレクション リソースへのきめ細かいアクセス制御がサポートされます。このサービスでは、1 つのコレクションに属するデータを透過的に複数のパーティションに分散し、クエリ要求を自動的に適切なパーティションにルーティングします。

5. 私のコレクションにパーティション分割は必要ですか?

パーティション分割は DocumentDB の中核的な機能ですが、コレクションを作成するときにパーティション キーを指定せず「単一パーティション」のコレクションを作成することもできます。自分のコレクションにパーティション分割が必要かどうかを判断するには、まず下記の点を検討します。

  • 単一パーティションのコレクションは低料金で使用可能で、コレクションのデータ全体に対してクエリやトランザクションを実行できます。ただし、単一パーティションではスケーラビリティとストレージ容量に制限があります (10GB、10,000 RU/秒)。このコレクションに対しては、パーティション キーを指定する必要はありません。この単一パーティションのコレクションは、大容量ストレージや高スループットが必要ではない場合に適しています。
  • パーティション分割コレクションは複数のパーティションにまたがるコレクションで、大容量ストレージと高スループットに対応しています。このコレクションに対しては、パーティション キーを指定する必要があります。

6. パーティション キー プロパティはどのように選べばよいですか?

パーティション キー プロパティを選ぶ際に重要なのは、多数の異なる値を持つものを選ぶことです。そうすると、それらの値全体でワークロードが均等に分散されます。パーティションを分割すると、当然ながら、同一のパーティション キーを含む要求ではスループットが単一パーティションの最大値に制限されます。また、同一パーティション キーに属するドキュメントのストレージ容量は最大 10GB に制限されます。理想的なのは、クエリで頻繁にフィルターとして使用されて、ソリューションのスケーラビリティを確保できるだけの十分な基数を持つものです。

また、パーティション キーは DocumentDB のストアド プロシージャやトリガーでトランザクションの境界条件としても使用されます。パーティション キーは、トランザクション内で同時に発生するドキュメントが同一のパーティション キーの値を共有できるように選択する必要があります。詳細については、パーティション分割の設計に関するドキュメントを参照してください。

7. テラバイト単位のデータや毎秒数十億以上の要求の処理に対応するコレクションの作成方法を教えてください。

パーティション分割コレクションは、既定で、最大でストレージ容量 250 GB、要求ユニット処理 25 万回/秒までのスケーリングに対応しています。コレクション 1 つあたりのストレージ容量やスループットをさらに引き上げる必要がある場合は、Azure サポートへお問い合わせください。DocumentDB では、1 つのコレクションで数十テラバイトのデータ容量と数百万回/秒以上の要求ユニットの処理に対応しています。

8. パーティション分割をサポートしている SDK のバージョンを教えてください。

パーティション分割は、REST API バージョン 2015-12-16、および .NETNode.jsJavaPython の SDK バージョン 1.6.0 以降でサポートされています。このプログラミング モデルでは、ドキュメントの読み込み、書き込み、クエリ、ストアド プロシージャ処理実行の引数として、コレクション作成時にパーティション キーを導入します。また、Azure ポータルから、コレクションの作成管理を行うこともできます。

9. パーティション分割コレクションへの移行方法を教えてください。

パーティション分割コレクションへの移行には、DocumentDB データ移行ツール (英語) を使用できます。まず既存のコレクション (複数可) を JSON ファイルにエクスポートし、パーティション キーが定義され 10,000 RU/秒を超える処理に対応している新しい DocumentDB コレクションにインポートします。クライアント側のパーティション リゾルバーを使用する場合は、サーバー側でパーティション分割を使用することにより 1 つのコレクションにデータを集約し、アプリケーション コードを簡素化することができます。

10. パーティション分割コレクションの料金について教えてください。

コレクションのパーティション分割の導入と同時に、DocumentDB の料金オプション (英語) も一新されました。ストレージ容量とスループットの対応が切り離され、ストレージを従量課金制で使用できるようになり、またアプリケーションのニーズに応じてスループットの制限をユーザーが定義できるようになりました。料金オプションの詳細については、こちらのページを参照してください。

次のステップ

DocumentDB のパーティション分割コレクションを使用することで、データベースを柔軟にスケーリングしたり、大容量ストレージや非常に高いスループットに対応できるようになります。これは、Azure ポータルまたはサポート対象のいずれかの SDK を使って開始できます。サポートやご不明な点に関するお問い合わせ、ご意見、ご感想は、Stack overflow の開発者フォーラム (英語) にお寄せいただくか、DocumentDB エンジニアリング チームとの個別チャットをご予約ください (英語)

また、DocumentDB の最新情報を入手するには、Twitter アカウント (@DocumentDB) をフォローしてください。