Проблема репликации данных Cassandra

У меня есть кластер cassandra из 2 узлов с коэффициентом репликации 2 и AutoBootStrap=true. При запуске все хорошо и оба узла видят друг друга. Назовем эти узлы А и В.

  1. Добавьте набор ключей и столбцов (давайте назовем этот набор K1) в cassandra через узел A.
  2. Подключитесь к узлу A и прочитайте набор K1. То же самое на узле B. Успех — хорошо
  3. Убить процесс Cassandra на узле B.
  4. Добавьте набор с К2 по А.
  5. Соединитесь с узлом A и прочитайте набор K2. Хорошо
  6. Перезапустите процесс Cassandra на узле B.
  7. Попробуйте прочитать все ключи из B... установите K1 в наличии, установите K2 в состоянии MISSING. (Даже через 30 минут)
  8. Добавьте K3 к A/B.
  9. Читать все ключи из A - возвращает набор K1, K2, K3
  10. Прочитать все ключи из B - возвращает набор K1, K3.

B никогда не синхронизирует набор K2... (Прошло более 12 часов) Почему узел B не видит набор K2... кто-нибудь знает?


Добавлена ​​информация:

Хорошо ... это была проблема. По умолчанию для read_consistency_level установлено значение 1.

Поэтому, когда мы запрашиваем у узла B набор K2, а у него его нет (когда он должен быть из-за коэффициента репликации = 2), он немедленно возвращается с ошибкой «Не найдено».

Однако, если мы используем согласованность чтения для QUORUM или ALL, тогда B вынужден запрашивать A, который затем возвращает правильное значение, а B синхронизирует этот ключ (сохраняет его локально).

Это приводит к другой проблеме. Это означает, что когда появляется узел B, он не синхронизирует все данные с узла A даже спустя долгое время. Теперь, если узел А выйдет из строя, как мы сможем получить доступ к этим несинхронизированным данным? (Я только что проверил, что мы не можем)

Я думаю, должен быть способ принудительно синхронизировать данные. Я вижу INFO в выходных данных терминала о том, что передача 15 строк из A в B произошла, когда B появился, но B не имеет этих строк локально (потому что мы все еще не можем прочитать их из B с уровнем согласованности ONE). Что тут происходит?


person Rajan    schedule 30.09.2010    source источник


Ответы (1)


Cassandra синхронизирует обновления, которые произошли, когда узел был недоступен, тремя способами:

  1. намекнул на передачу. требует, чтобы детектор отказов на A распознал, что B не работает, прежде чем вы запишете K2. См. http://wiki.apache.org/cassandra/HintedHandoff.
  2. читать ремонт. требует, чтобы B был в рабочем состоянии, когда запрашивается K2 для ремонта. См. http://wiki.apache.org/cassandra/ReadRepair.
  3. антиэнтропийный ремонт. требует вызова вручную («ремонт узла»). см. http://wiki.apache.org/cassandra/AntiEntropy.
person jbellis    schedule 30.09.2010
comment
Спасибо jBellis. Я сделал шаг вперед с Кассандрой. Однако я столкнулся с другой проблемой и добавил некоторую информацию к вопросу. - person Rajan; 01.10.2010