Избегайте полного сканирования таблицы Кассандры DC - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть кластерные узлы Cassandra, распределенные по двум центрам обработки данных.6 узлов в каждом центре обработки данных, всего 12 узлов

Определение моего пространства ключей:

CREATE KEYSPACE my_keyspace WITH replication = {'class': 'NetworkTopologyStrategy', 'dc1': '3', 'dc2': '3'} AND durable_writes = true;

В каждом узле у меня есть 64 токена.

Я использую Cassandraдрайвера для подключения к кластеру и использования политики балансировки нагрузки по умолчанию DCAwareRoundRobinPolicy и использования только узлов dc1 в качестве точек контакта.Итак, я предполагаю, что у dc2 узлов будет HostDistance IGNORED, и мое приложение не будет к ним подключаться.

Примечание. Для всех операций чтения и записи я использую одну и ту же конфигурацию

Мой вариант использования - полное сканирование таблицы.Но я не могу использовать Spark.Таким образом, вместо этого я добился этого путем получения всего диапазона токенов с помощью metadata.getTokenRanges() и запроса этих диапазонов токенов в нескольких потоках.

Все отлично работает.Но metadata.getTokenRanges() возвращает 768 токенов (64 * 12).Это означает, что он дает мне диапазон токенов для всех 12 узлов.

Так как мне нужно пройти через все диапазоны токенов.Даже с несколькими потоками процесс очень медленный.
Есть ли способ получить диапазоны токенов только одного центра обработки данных.Я даже пытался получить диапазоны токенов, используя metadata.getTokenRanges("my_keyspace", host from dc1).Я получаю меньше токенов (517), но когда я использую этот список, я получаю меньше данных.

Как получить диапазоны токенов только 1 DC?

Редактировать: я проверил задержку чтения / записи в обоих кластерах.Я не вижу никаких операций, выполняемых на dc2, тогда как я вижу четкий всплеск в моем dc1 центре обработки данных.

Теперь это еще более загадочно для меня.Если dc2 никогда не запрашивается, как я получаю 64*12 +1 диапазоны токенов?а почему не 64*6+1?

1 Ответ

0 голосов
/ 01 марта 2019

Ваш replication_factor равен 3+3=6.Таким образом, у вас может быть в 6 раз больше фактических данных.3 копии в dc1 и 3 копии в dc2.

У вас есть 64 vnodes на узел, поэтому 64*12 =768 vnodes.

Итак, если вы хотите выполнить полное сканирование таблицы, вам, возможно, придетсязапросить все диапазоны токенов, т.е. 768. Что вам не хватает, так это то, что из-за репликации все данные этих диапазонов токенов будут находиться в dc1.Таким образом, вы можете получить все данные из самого dc1.

Если вы используете DCAwareRoundRobinPolicy и задаете .withLocalDc() с dc1 и уровнем согласованности LOCAL_*, то вы читаете только из dc1.У dc1 будут все данные, потому что replication_factor для dc1 равно 3.

...