У меня кластер кассандры с 2 узлами с коэффициентом репликации 2 и AutoBootStrap = true. Все хорошо во время запуска и оба узла видят друг друга. Назовем эти узлы A и B.
- Добавить набор ключей и столбцов (давайте назовем этот набор K1) к кассандре через узел A.
- Подключиться к узлу A и прочитать обратно набор K1. То же самое на Узле Б. Успех - Хорошо
- Процесс Kill Cassandra на узле B.
- Добавить набор К2 через А.
- Подключиться к узлу A и прочитать набор K2. Хорошо
- Перезапустить процесс Cassandra на узле B.
- Попробуйте прочитать все ключи из B ... установить K1, установить K2 MISSING. (Даже через 30 минут)
- Добавить K3 к A / B.
- Считать все ключи из A - возвращает набор K1, K2, K3
- Считать все ключи из B - возвращает набор K1, K3.
B никогда не синхронизирует установленный K2 ... (прошло более 12 часов)
Почему узел B не видит множество K2 ... у кого-нибудь есть идеи?
Дополнительная информация :
Хорошо ... это была проблема.
Значение read_consistency_level было установлено в 1 по умолчанию.
Поэтому, когда мы запрашиваем узел B для набора K2, и у него его нет (когда он должен из-за коэффициента репликации = 2), он сразу же возвращается с ошибкой «Not found».
Однако, если мы используем согласованность чтения как QUORUM или ALL, то B вынужден запрашивать A, который затем возвращает правильное значение, и B синхронизирует этот ключ (сохраняет его локально).
Это приводит к еще одной проблеме - это означает, что при запуске узла B он не синхронизирует все данные с узла A, даже после долгого времени. Теперь, если узел А выходит из строя, как мы можем получить доступ к этим несинхронизированным данным? (Я только что проверил, что мы не можем)
Полагаю, должен быть способ принудительной синхронизации данных. В выводе терминала я вижу ИНФОРМАЦИЮ, что при появлении B произошла подсказка о передаче 15 строк от A до B, но B не имеет этих строк локально (потому что мы все еще не можем прочитать ее из B с уровнем согласованности ONE). Что здесь происходит?