Cassandraのレプリケーションファクターと一貫性レベルの非常に基本的な概念を明確にしたいと思います。誰かが以下の質問に答えてくれれば幸いです。
RF-レプリケーション係数RC-読み取り一貫性WC-書き込み一貫性
2 cassandra nodes(例:A、B)RF = 1、RC = ONE、WC = ONEまたはANY
3 cassandra nodes(例:A、B、C)RF = 2、RC = QUORUM、WC = QUORUM
3 cassandra nodes(例:A、B、C)RF = 3、RC = QUORUM、WC = QUORUM
要約:複製係数は、データのコピーの数を示します。一貫性レベルは、クライアントから見た動作を表します。おそらく、これらを分類するより良い方法があります。
例として、レプリケーション係数を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の読み取りと書き込みが成功します。
さまざまなシナリオをシミュレートできるこのシンプルな計算機をご覧ください。
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.