Я использую Cassandra версии 3.11.3, и я создал кластер Cassandra из 2 узлов на моей локальной машине.
Я создаю искровое задание (Java), которое потребляет данные параллельно со всех узлов Cassandra.
Я использую настройки ниже, чтобы получить мой TokenRange Set для моего кластера
Пространство ключей:
CREATE KEYSPACE test_keyspace WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 1 }
private static Host getLocalHost(Metadata metadata, LoadBalancingPolicy policy) {
Set<Host> allHosts = metadata.getAllHosts();
StringBuilder s = new StringBuilder();
Host localHost = null;
for (Host host : allHosts) {
if (policy.distance(host) == HostDistance.LOCAL) {
localHost = host;
break;
}
}
return localHost;
}
public static TokenRange[] getTokenRangesAcrossNodes() {
Metadata metadata = cluster.getMetadata();
Host localhost =
getLocalHost(metadata, cluster.getConfiguration().getPolicies().getLoadBalancingPolicy());
return unwrapTokenRanges(metadata.getTokenRanges("test_keyspace", localhost))
.toArray(new TokenRange[0]);
}
private static Set<TokenRange> unwrapTokenRanges(Set<TokenRange> wrappedRanges) {
Set<TokenRange> tokenRanges = new HashSet<>();
for (TokenRange tokenRange : wrappedRanges) {
tokenRanges.addAll(tokenRange.unwrap());
}
return tokenRanges;
}
Итак, в соответствии с описанной выше настройкой, я предполагал, что получу 2 TokenRange при вызове метода getTokenRangesAcrossNodes
, так как у меня есть 2 узла. Но вместо этого я получил 256. Затем я немного прочитал vnodes, поэтому я предполагаю, что диапазон его токенов состоит из нескольких vnodes. Кроме того, когда я использую коэффициент репликации как 2, я получаю 512.
Мой первый вопрос: как решился этот 256 или 512 TokenRange?
Во-вторых, через мою работу, если я буду запрашивать все эти диапазоны токенов параллельно, не будет ли возможно, что многие диапазоны не возвращают никакого результата, и я заканчиваю тем, что в большинстве случаев запрашиваю безрезультатный результат? Разве не лучше получить диапазоны токенов, специфичные для узлов, а не для vnodes?
Последний вопрос, если я хочу получить токеновый диапазон узлов (не vnodes), какое изменение мне нужно внести в вышеуказанную настройку?