クラスタに新しいノードを追加するときに、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 'から照会する。私は正しい?
ありがとうShlomi。それは[公式文書](https://github.com/apache/cassandra/blob/cassandra-3.9/doc/source/operating/topo_changes.rst#range-streaming)が正確でないことを意味しますか? –
そして、 'RangeStreamer'でcassandraソースコードを調べると、rangemovementがtrue(デフォルト)であれば、ソースノード' InetAddress sourceIp = addressList.iterator()。next();を選択するコードは次のようになります。所有権を放棄しているノードであることを確認しますか? –
トランクを見る(https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/dht/RangeStreamer.java#L176)。クラスタのノード数がRFより大きいので、RangeStreamerのaddRangesを呼び出すとgetAllRangesWithStrictSourcesForが呼び出されます(strictConsistencyが設定されている場合)。 getAllRangesWithStrictSourcesForは一貫した転送を保証します。 –