Amazon DynamoDB のパーティションキースペースで効率的な書き込みの分散を行う方法として、スペースの拡張があります。これにはさまざまな方法があります。パーティションキーバリューに乱数を追加して、パーティション間で項目を分散させることができます。または、クエリ対象に基づいて計算された数値を使用することができます。
ランダムなサフィックスを使用したシャーディング
パーティションキースペース全体に均等にロードを分散するための方法として、パーティションキーバリューの最後に乱数を追加する方法があります。次に、より大きなスペース全体の書き込みをランダム化します。
例えば、今日の日付を表すパーティションキーの場合は、1
と 200
の間の乱数を選択し、それをサフィックスとして日付に連結することができます。これにより、2014-07-09.1
や 2014-07-09.2
などのパーティションキーバリューが生成されます。この場合、最大のパーティションキーバリューは 2014-07-09.200
になります。パーティションキーをランダム化しているため、毎日のテーブルへの書き込みは複数のパーティション間で均等に分散されます。これにより、並列性が強化され、全体的なスループットが向上します。
ただし、特定の日のすべての項目を読み込むには、すべてのサフィックスの項目をクエリしてから結果をマージする必要があります。例えば、最初にパーティションキーバリュー Query
に対して 2014-07-09.1
リクエストを発行します。次に 2014-07-09.2
に対して別の Query
を発行します。この処理を 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
する必要があり、アプリケーションはすべての結果をマージする必要があります。この方法には、すべてのワークロードを利用する単一の「ホット」パーティションキーバリューを使用しないというメリットがあります。
注記
大容量の時系列データを処理するために特別に設計されている効率的な方法については、「時系列データ」を参照してください。