Как перебалансировать кластер cassandra после добавления нового node
У меня был 3 node кластер cassandra с коэффициентом репликации 2. Узлы выполняли либо dsc1.2.3, либо dsc1.2.4. Каждый node имел num_token значение 256 и initial_token был прокомментирован. Этот кластер 3 node был идеально сбалансирован, т.е. Каждому принадлежало около 30% данных.
Один из узлов разбился, поэтому я начал новый node и nodetool удалил node, который разбился. Новый node был добавлен в кластер, но теперь у двух старых узлов больше данных (47,0% и 52,3%), а новый node составляет всего 0,7% данных.
Выход состояния nodetool
Datacenter: xx-xxxx
===================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
-- Address Load Tokens Owns Host ID Rack
UN 10.xxx.xxx.xxx 649.78 MB 256 47.0% ba3534b3-3d9f-4db7-844d-39a8f98618f1 1c
UN 10.xxx.xxx.xxx 643.11 MB 256 52.3% 562f7c3f-986a-4ba6-bfda-22a10e384960 1a
UN 10.xxx.xxx.xxx 6.84 MB 256 0.7% 5ba6aff7-79d2-4d62-b5b0-c5c67f1e1791 1c
Как сбалансировать этот кластер?
Ответы
Ответ 1
Вы не упомянули о запуске ремонта нового node, если вы еще не сделали этого, вероятно, причиной вашего отсутствия данных в новом node.
До тех пор, пока вы не запустите ремонт nodetool, новый node будет содержать только новые данные, которые будут записаны на него, или данные, которые считывает-исправляет. В vnodes вам вообще не нужно перебалансировать, если я Я правильно понимаю vnodes, но я лично еще не перешел на использование vnodes, поэтому я могу ошибаться в этом.
Ответ 2
Похоже, ваш новый node не загрузился. Вы добавили auto_bootstrap=true
в свой cassandra.yaml?
Если вы не хотите загружать, вы можете запустить nodetool repair
в новом node, а затем nodetool cleanup
на двух других, пока распределение не будет честным.