2016-12-21 1 views
0

クラスタに新しいノードを追加するときに、cassandraが一貫性を保証する方法について少し混乱します。私はcassandraが範囲の動きを行い、新しい追加されたノードにデータを流すことを知っています。問題は、cassandraがセカンダリレプリカのデータを新しい追加ノードにも流すことです。新しいノードを追加するときのCassandraの一貫性の確認方法

たとえば、RF = 3(A、B、C、D) A(x = 1、y = 2)、B(x = 1、y = 3) C(x = 1)、D(y = 2)である。パーティションキー "x"はA、B、Cによって保持され、パーティションキー "y"はD、A、Bによって保持されます。 AとBの間に新しいノードA 'を追加すると、Aからパーティション "x"をストリームすると思います。しかし、BまたはDからストリーム "y"をストリームしますか?

ストリーミングパーティション "y"を実行する場合、どのノードからストリーミングするか選択しますか? official documentより。その場合、Dであるプライマリレプリカからストリーミングされます。その場合、Dに古いデータがある場合(新しいノードを追加する前に、AとBの両方とクォーラムを満たす最新のデータとしてokです)、ストリーミング後に可能です失効したデータをDおよびA 'から照会する。私は正しい?

答えて

0

おそらく正しいでしょう。新しいノードを追加する前に、ノードの修復を実行して、クラスタに矛盾がないようにすることをお勧めします。

1

カサンドラはあなたの例では、トークン

の所有権を放棄しているノードからの情報をストリーミングします:RF = 3(A、B、C、D)A(X = 1、Y = 2)、B(x = 1、y = 3)、C(x = 1)、D(y = 2)である。 EがA、B、Aの間に追加されると、XをEに所有し、Bは所有yを放棄する。それから、AはXの値をEに送り、BはそのYの値をEに送り、最終結果はA(y = 2)、E(X = 1、y = 3)、B(x = 1 )、C(x = 1)、D(y = 2)である。

ノードAに古いXのコピーがあり、Bに古いYのコピーがあり、それを取り除くには 'nodetool cleanup'を実行する必要があることに注意してください。

+0

ありがとうShlomi。それは[公式文書](https://github.com/apache/cassandra/blob/cassandra-3.9/doc/source/operating/topo_changes.rst#range-streaming)が正確でないことを意味しますか? –

+0

そして、 'RangeStreamer'でcassandraソースコードを調べると、rangemovementがtrue(デフォルト)であれば、ソースノード' InetAddress sourceIp = addressList.iterator()。next();を選択するコードは次のようになります。所有権を放棄しているノードであることを確認しますか? –

+0

トランクを見る(https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/dht/RangeStreamer.java#L176)。クラスタのノード数がRFより大きいので、RangeStreamerのaddRangesを呼び出すとgetAllRangesWithStrictSourcesForが呼び出されます(strictConsistencyが設定されている場合)。 getAllRangesWithStrictSourcesForは一貫した転送を保証します。 –

関連する問題