У меня есть кластер из 4 узлов, и я обновил все узлы со старой версии до Cassandra 1.2.8. Общий объем данных, присутствующих в кластере, составляет 8 ГБ. Теперь мне нужно включить vNodes на всех 4 узлах кластера без простоев. Как я могу это сделать?
Включение vNodes в Cassandra 1.2.8
Ответы (3)
TL;DR;
Нет вам нужно перезапустить серверы после редактирования конфигурации
Проблема в том, что включение vnodes означает, что большая часть данных перераспределяется случайным образом (в документации говорится, что подобно классическому «перемещению nodetool»).
Как сказал Нихил, вам нужно увеличить num_tokens и перезапустить каждый узел. Это можно сделать сразу, без простоев.
Однако увеличение num_tokens не приводит к перераспределению каких-либо данных, поэтому на самом деле вы не используете vnodes. Вы должны перераспределить его вручную с помощью перетасовки (объяснено в ссылке, размещенной Любеном, что часто приводит к проблемам), путем вывода из эксплуатации каждого узла и начальной загрузки (что временно оставит ваш кластер крайне несбалансированным с одним узлом, владеющим всеми данными), или путем временное дублирование вашего оборудования, как при создании нового центра обработки данных. Последний — единственный известный мне надежный метод, но он требует дополнительного оборудования.
В conf/cassandra.yaml
вам нужно будет закомментировать параметр initial_token
и включить параметр num_tokens
(по-моему, по умолчанию 256). Сделайте это для каждого узла. Затем вам придется перезапустить службу cassandra на каждом узле. И дождитесь перераспределения данных по всему кластеру. 8 ГБ не должны занимать слишком много времени (при условии, что все ваши узлы находятся в одном кластере), а запросы на чтение по-прежнему будут работать, хотя вы можете наблюдать снижение производительности до завершения перераспределения данных.
РЕДАКТИРОВАТЬ: Вот потенциальная стратегия для переноса ваших данных:
- Вывести из эксплуатации два узла кластера. Токен-пространство должно быть распределено 50-50 между двумя другими узлами.
- На двух выведенных из эксплуатации узлах удалите существующие данные и перезапустите демон Cassandra с другим именем кластера и включенными параметрами
num_token
. - Перенесите 8 ГБ данных из старого кластера в новый кластер. Для этого вы можете написать быстрый скрипт на python. Поскольку объем данных достаточно мал, это не должно занять слишком много времени.
- После переноса данных в новый кластер выведите из эксплуатации два старых узла из старого кластера. Удалите данные и перезапустите на них Cassandra с новым именем кластера и параметром
num_tokens
. Они будут загружаться, и данные будут передаваться с двух существующих узлов в новом кластере. Предпочтительно загружать только один узел за раз.
С помощью этих шагов вы никогда не столкнетесь с ситуацией, когда ваш сервис полностью отключен. Некоторое время вы будете работать с уменьшенной емкостью, но опять же, поскольку 8 ГБ — это небольшой объем данных, вы сможете достичь этого достаточно быстро.