web-dev-qa-db-ja.com

cassandraレプリケーション係数と一貫性レベルを理解する

Cassandraのレプリケーションファクターと一貫性レベルの非常に基本的な概念を明確にしたいと思います。誰かが以下の質問に答えてくれれば幸いです。

RF-レプリケーション係数RC-読み取り一貫性WC-書き込み一貫性

2 cassandra nodes(例:A、B)RF = 1、RC = ONE、WC = ONEまたはANY

  • ノードAにデータを書き込み、ノードBから読み取ることはできますか?
  • aがダウンするとどうなりますか?

3 cassandra nodes(例:A、B、C)RF = 2、RC = QUORUM、WC = QUORUM

  • ノードAにデータを書き込み、ノードCから読み取ることはできますか?
  • ノードAがダウンするとどうなりますか?

3 cassandra nodes(例:A、B、C)RF = 3、RC = QUORUM、WC = QUORUM

  • ノードAにデータを書き込み、ノードCから読み取ることはできますか?
  • ノードAがダウンするとどうなりますか?
53
Indika Sampath

要約:複製係数は、データのコピーの数を示します。一貫性レベルは、クライアントから見た動作を表します。おそらく、これらを分類するより良い方法があります。

例として、レプリケーション係数を2にすることができます。書き込み時には、十分なノードが稼働していると仮定して、常に2つのコピーが保存されます。ノードがダウンしている場合、Cassandraが完全になくなったと判断するほど長くダウンしていない限り、そのノードへの書き込みは隠され、起動時に書き込まれます。

この例では、一貫性レベルを1にして記述します。クライアントは、1つのノードへの書き込みが行われた後、2番目の書き込みを待たずに成功確認を受け取ります。 ALLのCLで書き込みを行った場合、クライアントへの確認応答は、両方のコピーが書き込まれるまで待機します。他の非常に多くの整合性レベルのオプションがあり、ここですべてのバリエーションをカバーするには多すぎます。 Datastax doc を読んでください。ただし、それらを説明するのは良い仕事です。

同じ例で、一貫性レベルがONEである場合、単一のレプリカが応答すると、応答がクライアントに送信されます。別のレプリカに新しいデータが含まれている場合があります。その場合、応答は最新ではありません。多くのコンテキストでは、それで十分です。それ以外の場合、クライアントは最新の情報を必要とし、読み取り時に異なる整合性レベル(おそらくレベルALL)を使用します。そのようにして、Cassandraおよび他のリレーショナル後データベースの一貫性は、リレーショナルデータベースが通常そうでない方法で調整可能です。

例に戻りましょう。

例1:はい、Bが独自のレプリカを持っていなくても、Aに書き込み、Bから読み取ることができます。 Bは、クライアントに代わってAに要求します。これは、ノードがすべて稼働している他のケースにも当てはまります。それらがすべて使用可能になったら、一方に書き込み、もう一方から読み取ることができます。

WC = ONEの書き込みの場合、単一のレプリカのノードが起動していて、接続しているノードであれば、書き込みは成功します。他のノードの場合、書き込みは失敗します。 ANYを使用する場合、アップしているノードと通信していると仮定して、書き込みは成功します。また、そのためにハンドオフを有効にしておく必要があると思います。ダウンしたノードは後でデータを取得しますが、それが発生するまでは、アップしているノードからでもデータを読み取ることはできません。

他の2つの例では、複製係数は最終的に書き込まれるコピーの数に影響しますが、上記で説明した以外のクライアントの動作には影響しません。 QUORUMは、十分な数のノードを起動し、書き込みと読み取りに応答する必要があるため、クライアントの動作に影響します。幸運にも、少なくとも(nodes/2)+ 1個のノードが必要なノードを超えている場合、書き込みと読み取りは成功します。レプリカが稼働している十分なノードがない場合、読み取りと書き込みは失敗します。全体的に、ノードがダウンしている場合、レプリカを保存するためにそのノードが不要であるか、またはその停止によって十分なレプリカノードが使用可能な場合、QUORUMの読み取りと書き込みが成功します。

95
Don Branson

さまざまなシナリオをシミュレートできるこのシンプルな計算機をご覧ください。

http://www.ecyrd.com/cassandracalculator/

たとえば、2つのノード、レプリケーション係数1、読み取り一貫性= 1、書き込み一貫性= 1の場合

Your reads are consistent 
You can survive the loss of no nodes. 
You are really reading from 1 node every time. 
You are really writing to 1 node every time. 
Each node holds 50% of your data.
44
bcattle