カサンドラとその分布について聞いたことがあります。実際に、クラスター全体でデータがどのように分散されるかという現象を知りたいですか?つまり、Cassandraはどのノードがどのデータを持っているかをどのように決定するのですか?
3 に答える
HastTableのデータ構造と、Hashtableでハッシュがどのように行われるかを理解していれば、非常に簡単です。
ハッシュ表
ステップ1. 基本的に、キーのインデックスがハッシュテーブルでどのように決定されるかは次のとおりです。
index = hashfunc(key_you_want_to_distribute) % array_size
詳細については、ハッシュ関数の選択を探してください。
ステップ2. 次に、必要なデータを取得するには、検索する値をデータに指定するだけです。その値のハッシュを作成し、そのインデックスを検索します。
カサンドラ
Distribute Hashtables/Cassandraでも同じように機能します。
ステップ1。cassandraでは、ハッシュを作成するために含めるレコードのフィールドを指定する必要があります。たとえば、テーブルがある場合User
。ユーザーをユーザーごとに配布したい場合があるusername
ので、それを主キーにすることにします。
ハッシュを作成するために選択したフィールドは、レコードをパーティション化する決定要因であるため、Cassandraの世界ではパーティションキーと呼ばれます。
次に、Cassandraは、挿入しようとしているレコードのハッシュを作成し、ノード/マシンの範囲に基づいて、レコードが配布されます。
次のようなハッシュ範囲を持つ3つのノードがあるとします。
node1 | 1 - 2000
node2 | 2000 - 4000
node3 | 4000 - 6000
たとえば、次の表を参照してください。簡単にするためにランダムハッシュを指定しています。Cassandraは実際にMurmur3ハッシュを使用します。
username | hash(example) | which node it goes to |
----------|---------------|------------------------|
prayagupd | 1 | node1 |
mike | 3000 | node2 |
zach | 5000 | node3 |
ステップ2。次に、ユーザー名を使用してユーザーを取得する場合'prayagupd'
、cassandraはそのハッシュを作成します。たとえば、そのハッシュを作成すると、1
1がnode1(1-2000)に属していることがわかります。
ビンゴ!!!
特定のデータに関与するノードのセット(単一のノードまたは複数のノード)は、次の要素によって決定されます。
- 行キー(データは行キーで分割されます)
- 複製係数
- レプリケーション戦略
Cassandraは、現在の負荷、アップまたはダウンしているノード、クライアントがたまたま通信しているノードなどの特性の変化に基づいて、特定の行キーのレプリカセットを変更しないことを理解することが重要です。
詳細については、cassandraFAQをご覧ください。
また、cassandraプロジェクトのオープンソースplayormのような他のものはすべてのノードにパーティションが存在するのに対し、cassandraのパーティションはすべて1つのノードに存在するため、単一のパーティション内の多数のレコードにアクセスするときにディスクの並列処理が増えることを理解することも重要です。パーティションから500kレコードを取得する必要がある場合は、cassandraパーティションを使用したくない場合がありますが、PlayOrmのように独自の仮想パーティションを作成します。