Проблема репликации данных Кассандры - PullRequest
8 голосов
/ 30 сентября 2010

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

  1. Добавить набор ключей и столбцов (давайте назовем этот набор K1) к кассандре через узел A.
  2. Подключиться к узлу A и прочитать обратно набор K1. То же самое на Узле Б. Успех - Хорошо
  3. Процесс Kill 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), он сразу же возвращается с ошибкой «Not found».

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

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

Полагаю, должен быть способ принудительной синхронизации данных. В выводе терминала я вижу ИНФОРМАЦИЮ, что при появлении B произошла подсказка о передаче 15 строк от A до B, но B не имеет этих строк локально (потому что мы все еще не можем прочитать ее из B с уровнем согласованности ONE). Что здесь происходит?

1 Ответ

6 голосов
/ 30 сентября 2010

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

  1. подсказка хэндовера.требует, чтобы детектор ошибок на A распознал, что B выключен, прежде чем писать K2.См. http://wiki.apache.org/cassandra/HintedHandoff
  2. чтение ремонта.требует, чтобы B был активен, когда K2 запрашивается для проведения ремонта.См. http://wiki.apache.org/cassandra/ReadRepair
  3. Восстановление антиэнтропии.требует вызова вручную («восстановление nodetool»).см http://wiki.apache.org/cassandra/AntiEntropy
...