1

次のスキームを持つ cassandra クラスターがあるとします。

(76-100) Node1 - Node2 (0-25)
                 |      |
(51-75)  Node4 - Node3 (26-50)

各ノードは、主にパーティション キーの範囲を担当します。たとえば、合計範囲が 0 ~ 100 の場合、ノードが担当する範囲を示しました。

ここで、ノード 1 が要求を処理するコーディネーターであるとします。パーティション キー 28 に対応する読み取り要求がノード 1 に到達します。

ノード 1 は、ノード 2 がパーティション キー 28 のプライマリ ノードであることをどのように認識しますか。各ノードには、担当するパーティション キーへのノード ID のマッピングがありますか。例えば、

{Node1:76-100, Node2: 0-25, Node3: 26-50, Node4: 51-75}

要求がラウンドロビン方式で転送される場合、どのノードもコーディネーターとして機能できるため、このマッピングはすべてのノードでグローバル構成として存在しますか?

ありがとう

4

1 に答える 1

2

マッピングはグローバル構成として存在しません。むしろ、各ノードは、クラスター内の他のノードの状態の独自のコピーを保持します。通常、クラスタはゴシップ プロトコルを使用して、クラスタ内の他のノードに関する情報をいくつかの近くのノードと頻繁に交換します。このようにして、数千のノードがある場合でも、マッピング情報はクラスター内のすべてのノードに迅速に伝搬されます。

すべてのノードは、パーティション キーをトークン値にマップする方法と、そのトークンを担当するノードを認識する必要があります。これは、すべてのノードがコーディネーターとして機能し、そのキーを処理している正確なノードにリクエストを送信することで、リクエストを処理できるようにするためです。

さらに一歩進んで、たとえば現在の Java ドライバーを使用する場合、クライアントにトークン対応のルーティング ポリシーを使用させることができます。これは、キーをノードにマップする方法に関する情報のコピーも取得するクライアント ドライバーによって機能します。次に、リクエストを発行すると、そのキーを処理しているノードに直接送信されます。これにより、パフォーマンスが大幅に向上します。

通常、vnode と Murmur3Partitioner を使用する場合、ノードが追加および削除されるときにクラスター全体で負荷を分散するためにクラスターがキーのマッピングを作成するため、キーがどのようにマップされるかについて心配する必要はありません。

于 2015-01-08T01:01:22.167 に答える