Как перебалансировать кластер 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 на двух других, пока распределение не будет честным.