Amazon DynamoDB
開発者ガイド (API バージョン 2012-08-10)

書き込みシャーディングを使用してワークロードを均等に分散させる

DynamoDB のパーティションキースペースに効率よく書き込みを分散させる方法として、スペースの拡張があります。これにはさまざまな方法があります。パーティションキー値に乱数を追加して、パーティション間に項目を分散させるか、またはクエリしている項目に基づき算出された数値を使用できます。

ランダムなサフィックスを使用したシャーディング

パーティションキースペース全体に均等に負荷を分散するための戦略として、パーティションキー値の最後に乱数を追加する方法があります。次に、より大きなスペース全体の書き込みをランダム化します。

たとえば、今日の日付を表すパーティションキーの場合は、1200 の間の乱数を選択し、それをサフィックスとして日付に連結することができます。これにより、2014-07-09.12014-07-09.2 などのパーティションキー値が生成されます。この場合、最大のパーティションキー値は 2014-07-09.200 になります。パーティションキーをランダム化しているため、毎日のテーブルへの書き込みは複数のパーティション間で均等に分散されます。これにより、並列性が強化され、全体的なスループットが向上します。

ただし、特定の日のすべての項目を読み込むには、すべてのサフィックスの項目をクエリしてから結果をマージする必要があります。たとえば、最初にパーティションキー値 Query に対して 2014-07-09.1 リクエストを発行し、次に Query に対して 2014-07-09.2 を発行します。この処理を 2014-07-09.200 まで繰り返します。最終的には、アプリケーションですべての Query リクエストの結果をマージする必要があります。

計算されたサフィックスを使用したシャーディング

ランダム化戦略は、書き込みスループットを大幅に向上させることができます。ただし、項目を書き込むときに使用されたサフィックスの値がわからないため、特定の項目を読み込むのは困難です。個々の項目を読みやすくするには、別の戦略を使用します。パーティション間で項目を分散させるには、乱数を使用せずに、クエリする項目に基づいて計算できる数値を使用します。

前の例では、パーティションキーで今日の日付が使用されています。各項目にはアクセス可能な OrderId 属性があり、日付だけでなく、注文 ID を使用して、項目を最も頻繁に見つける必要があるとします。アプリケーションから項目をテーブルに書き込む前に、この注文 ID に基づいてハッシュサフィックスを計算し、その値をパーティションキーの日付に追加します。この計算では、1 から 200 までの数値が生成され、ランダムな戦略と同様に、完全に均一に分散されます。

この計算はシンプルな計算で十分です (注文 ID の文字の UTF-8 コードポイント値を乗算して、それを 200で割った余りに + 1 するなど)。パーティションキー値は、日付に計算結果を連結した値になります。

この方法を使用すると、書き込みがパーティションキー値全体に均一に分散されます。したがって、物理パーティション全体にも均一に分散されます。これで、特定の GetItem 値のパーティションキー値を計算できるため、OrderId オペレーションを実行して、特定の項目や日付を簡単に読み込むことができます。

指定の日付の項目をすべて読み込むには、2014-07-09.N キー (ここで N は 1 ~ 200 の数値) のぞれぞれに Query を実行し、アプリケーションですべての結果をマージする必要があります。この方法には、すべてのワークロードを利用する単一の「ホット」パーティションキー値を使用しないというメリットがあります。

注記

大容量の時系列データを処理するために特別に設計されている効率的な戦略については、「時系列データ」を参照してください。