固定パーティション
クラスターのサイズが変更になっても、データとパーティションのマッピングが変わらないように、パーティションの数を固定します。
問題
データをクラスターノードのセットに分割するには、それぞれのデータアイテムをそれらのノードにマッピングする必要があります。データをクラスターノードにマッピングするためには、2 つの要件があります。
- 分散は均一であるべきです。
- すべてのノードにリクエストを行わなくても、特定のデータアイテムが格納されているクラスターノードを知ることができる必要があります。
多くのストレージシステムの適切なプロキシであるキーバリューストアを考えてみましょう。ハッシュキーを使用して剰余演算を実行し、クラスターノードにマッピングすることで、両方の要件を満たすことができます。 3 ノードのクラスターがある場合、次のようにキーの Alice、Bob、Mary、Philip をマッピングできます。
キー | ハッシュ | ノードインデックス† |
---|---|---|
Alice | 133299819613694460644197938031451912208 | 0 |
Bob | 63479738429015246738359000453022047291 | 1 |
Mary | 37724856304035789372490171084843241126 | 2 |
Philip | 83980963731216160506671196398339418866 | 2 |
† ノードインデックス = ハッシュ %3
ただし、この方法ではクラスターサイズが変更されると問題が発生します。クラスターに 2 つのノードを追加すると、5 つのノードができます。その場合、マッピングは次のようになります。
キー | ハッシュ | ノードインデックス† |
---|---|---|
Alice | 133299819613694460644197938031451912208 | 3 |
Bob | 63479738429015246738359000453022047291 | 1 |
Mary | 37724856304035789372490171084843241126 | 1 |
Philip | 83980963731216160506671196398339418866 | 1 |
† ノードインデックス = ハッシュ % 5
この方法では、ほとんどすべてのキーのマッピングが変更されます。わずか数個の新しいクラスターノードを追加しただけでも、すべてのデータを移動する必要があります。データサイズが大きい場合、これは望ましくありません。
ソリューション
最も一般的に使用されるソリューションの 1 つは、データを論理パーティションにマッピングすることです。論理パーティションはクラスターノードにマッピングされます。クラスターノードを追加または削除しても、データとパーティションのマッピングは変更されません。クラスターは事前に構成された数のパーティションで起動されます。この例では、パーティションは 1024 個です。クラスタに新しいノードが追加されても、この数は変更されません。したがって、キーのハッシュを使用してデータをパーティションにマッピングする方法も変わりません。
パーティションがクラスターノード全体に均等に分散されていることが重要です。パーティションを新しいノードに移動する場合は、比較的迅速に、データのほんの一部を移動すれば済みます。
詳細については、oreilly.com のオンライン電子書籍の 第 19 章 をご覧ください。
このパターンは、分散システムのパターン の一部です。
2023 年 11 月 23 日