Не существует фиксированного диапазона токенов, токены генерируются случайным образом. Это одна из причин того, что vnodes были реализованы - идея заключается в том, что если имеется больше токенов, более вероятно, что результирующие диапазоны токенов будут более равномерно распределены по узлам.
Генерация токенов была недавно улучшена в 3.0, что позволило Cassandra размещать новые токены немного более разумно (см. CASSANDRA-7032 ). Вы также можете вручную настроить токены (см. initial_token ), хотя может быть сложно сохранить баланс, когда наступит время расширения кластера, если вы не планируете удвоить количество узлов.
Общее количество токенов в кластере - это количество узлов в кластере, умноженное на количество vnodes на узел.
Что касается размещения реплик, первая копия раздела помещается в узел, которому принадлежит токен этого раздела. Дополнительные n копии размещаются последовательно на следующих n узлах в кольце, которые находятся в том же центре обработки данных. Между токенами и пространствами ключей нет никакой связи.
Когда новая запись поступает в узел-координатор, узел-координатор определяет, какому узлу принадлежит раздел, хэшируя ключ раздела. Обратите внимание, что для лучшей производительности это может быть сделано драйвером вместо этого, если вы используете TokenAwarePolicy . Координатор отправляет запись на узел, который владеет разделом, и, если данные должны быть реплицированы, узел-координатор также записывает реплики в следующие два узла последовательно в пространстве маркеров.
Например, предположим, что у нас есть 3 узла, каждый из которых имеет один токен: node1: 10
, node2: 20
& node3: 30
. Если мы записываем запись, чей ключ раздела хэширует в 22
, в пространство ключей с RF3, то первая копия отправляется на узел 2, вторая - на узел 3, а третья - на узел 1. Обратите внимание, что каждая реплика одинаково действительна - в «первой» реплике нет ничего особенного, кроме того, что она хранится в «первом» узле реплики.
Vnodes не изменяют этот процесс, они просто разделяют диапазоны токенов каждого узла, позволяя каждому узлу иметь более одного токена. Например, если в нашем кластере теперь есть 2 vnode для каждого узла, он может выглядеть следующим образом: node1: 10, 25
, node2: 20, 3
& node3: 30, 21
. Теперь наша запись, хэшированная до 22
, переходит к node3
(поскольку ей принадлежит диапазон от 21-24
), а копии переходят к node1
и node2
.