Кассандра: Требуется ли для добавления / удаления узла все узлы кластера?

Когда добавляется новый узел, из-за равномерного распределения новых токенов, текущие узлы кольца должны перенести данные на этот новый узел.

Итак, требуется ли присутствие всех узлов? Если нет, то если некоторые узлы не работают, то он пропустит перенос данных этих частей, как и когда это исправить? Когда эти узлы вернутся?

Точно так же удаление узла приведет к переносу его данных на другие узлы, поэтому кажется, что все остальные узлы должны присутствовать, иначе он потеряется данные?

Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
1
0
301
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Кассандра требует, чтобы присутствовали все узлы. Я попытался добавить узел, когда другой узел не работал, и получил эту ошибку:

Exception (java.lang.RuntimeException) encountered during startup: A node required to move the data consistently is down (/172.17.0.2). If you wish to move the data from a potentially inconsistent replica, restart the node with -Dcassandra.consistent.rangemovement=false
java.lang.RuntimeException: A node required to move the data consistently is down (/172.17.0.2). If you wish to move the data from a potentially inconsistent replica, restart the node with -Dcassandra.consistent.rangemovement=false
    at org.apache.cassandra.dht.RangeStreamer.getAllRangesWithStrictSourcesFor(RangeStreamer.java:275)
    at org.apache.cassandra.dht.RangeStreamer.addRanges(RangeStreamer.java:158)
    at org.apache.cassandra.dht.BootStrapper.bootstrap(BootStrapper.java:83)
    at org.apache.cassandra.service.StorageService.bootstrap(StorageService.java:1212)
    at org.apache.cassandra.service.StorageService.joinTokenRing(StorageService.java:891)
    at org.apache.cassandra.service.StorageService.initServer(StorageService.java:657)
    at org.apache.cassandra.service.StorageService.initServer(StorageService.java:570)
    at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:346)
    at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:569)
    at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:697)
ERROR 09:53:37 Exception encountered during startup

То же самое происходит, когда я пытаюсь добавить узел в другой постоянный ток.

Что касается удаления узла. Вывод из эксплуатации работает только в том случае, если все реплики включены. Списание начнется с потоковой передачи всех данных на новые реплики, если потоковая передача не удалась, то декомпозиция не удастся.

$ nodetool decommission
error: Stream failed
-- StackTrace --
org.apache.cassandra.streaming.StreamException: Stream failed
    ...

Вы все еще можете принудительно удалить, выключив узел и выполнив nodetool removenode. Это не будет передавать данные, но удалит узел из кластера. Используйте с осторожностью.

Также есть nodetool assasinate, если ни разложение, ни удаление не работают.

Спасибо за Вашу информацию! Если для добавления / удаления узла требуются другие узлы, работоспособность кластера кажется плохой. Ты так думаешь?

kingluo 02.05.2018 14:57

@kingluo Не совсем. Всякий раз, когда узел в Cassandra не работает, кластер находится в плохом состоянии. Для безопасного добавления или удаления узла кластер должен быть в хорошем состоянии со всеми включенными узлами. Однако, как есть команда removenode для удаления узла, когда кластер находится в плохом состоянии, есть также способы добавления узлов в плохом состоянии. Если у вас не работает только один узел, и вы хотите заменить этот узел, вы устанавливаете переменную -Dcassandra.replace_address в cassandra-env.sh.

Simon Fontana Oscarsson 04.05.2018 10:45

Вы также можете добавить узел без потоковой передачи данных (но будьте осторожны, этот узел все равно будет принимать запросы), установив для auto_bootstrap значение false. После этого вам нужно будет запустить ремонт. Это не имеет никакого смысла, поскольку это поставит под угрозу стабильность до завершения ремонта. auto_bootstrap следует использовать только при инициализации нового кластера без данных. Но, конечно, в зависимости от вашего варианта использования он может найти и другое применение.

Simon Fontana Oscarsson 04.05.2018 10:52

Другие вопросы по теме