У меня есть 2-узловой кластер cassandra с коэффициентом репликации 2 и AutoBootStrap = true. При запуске все хорошо и оба узла видят друг друга. Назовем эти узлы A и B.
- Добавьте набор ключей и столбцов (давайте назовем этот набор K1) в кассандру через узел A.
- Подключитесь к узлу A и прочитайте набор K1. То же самое на узле B. Успех - хорошо
- Убить процесс Cassandra на узле B.
- Добавить набор K2 через A.
- Подключиться к узлу A и прочитать набор K2. Хорошо
- Перезапустите процесс Cassandra на узле B.
- Попытайтесь прочитать все ключи из B ... установите K1 как присутствующий, установите K2 MISSING. (Даже через 30 минут)
- Добавить K3 в A / B.
- Прочитать все ключи из A - вернуть набор K1, K2, K3
- Прочитать все ключи из B - вернуть набор K1, K3.
B никогда не синхронизирует набор K2 ... (прошло более 12 часов)
Подключитесь к узлу A и считайте набор K1. То же самое на узле B. Успех - хорошо
Убить процесс Cassandra на узле B.
Добавить набор K2 через A.
Подключиться к узлу A и прочитать набор K2. Хорошо
Перезапустите процесс Cassandra на узле B.
Попытайтесь прочитать все ключи из B ... установите K1 как присутствующий, установите K2 MISSING. (Даже через 30 минут)
Добавить K3 в A / B.
Прочитать все ключи из A - вернуть набор K1, K2, K3
Прочитать все ключи из B - вернуть набор K1, K3.
B никогда не синхронизирует набор K2 ... (прошло более 12 часов)
Подключитесь к узлу A и считайте набор K1. То же самое на узле B. Успех - хорошо
Убить процесс Cassandra на узле B.
Добавить набор K2 через A.
Подключиться к узлу 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), он немедленно возвращается с сообщением «Не найдено. 'ошибка.
Однако, если мы используем согласованность чтения как КВОРУМ или ВСЕ, тогда B будет вынужден запросить A, который затем вернет правильное значение, и B синхронизирует этот ключ (сохраняет его локально).
Это приводит к к другой проблеме - это означает, что когда появляется узел B, он не синхронизирует все данные с узла A даже по прошествии длительного времени. Теперь, если узел A выходит из строя, как мы можем получить доступ к этим несинхронизированным данным? (Я только что проверил, что мы не можем)
Думаю, должен быть способ принудительно синхронизировать данные. Я вижу ИНФОРМАЦИЮ в выводе терминала о том, что при появлении B произошла намекаемая передача 15 строк от A к B, но у B нет этих строк локально (потому что мы все еще не можем прочитать их из B с уровнем согласованности ОДИН). Что здесь происходит?
задан Rajan 1 October 2010 в 05:48
поделиться