Недостаточно копии для запроса при согласованности ONE (требуется 1, но только 0)
У меня есть кластер Cassandra с тремя узлами, два из которых выше. Все они находятся в одном DC. Когда мое приложение Java переходит на запись в кластер, я получаю сообщение об ошибке в своем приложении, которое, как представляется, вызвано некоторой проблемой с Cassandra:
Вызывает: com.datastax.driver.core.exceptions.UnavailableException: недостаточно реплики для запроса при согласованности ONE (требуется 1, но только 0) at com.datastax.driver.core.exceptions.UnavailableException.copy(UnavailableException.java:79)
Часть, которая не имеет смысла, состоит в том, что оператор "1 требуется, но только 0 живой". Есть два узла вверх, что означает, что для репликации нужно быть "живым".
Или я не понимаю сообщение об ошибке?
Спасибо.
Ответы
Ответ 1
Вероятно, вы получите эту ошибку, потому что фактор репликации в пространстве ключей, к которому относится ваша таблица, имеет коэффициент репликации одного, верно?
Если в разделе, который вы читаете/обновляете, недостаточно доступных реплик (узлы с этими данными), чтобы соответствовать уровню согласованности, вы получите эту ошибку.
Если вы хотите иметь доступ к более чем 1 node недоступным, то вы можете сделать это в изменении вашего ключевого пространства на установите более высокий коэффициент репликации, предпочтительно три в этом случае, а затем выполните ремонт nodetool на каждом node, чтобы получить все ваши данные на всех узлы. С этим изменением вы сможете пережить потерю двух узлов для чтения на уровне согласованности.
Этот калькулятор параметров кассандры является хорошей ссылкой для понимания соображений счетчика node, коэффициента репликации и уровней согласованности.
Ответ 2
Я ударил это сегодня, потому что поле датацентра чувствительно к регистру. Если ваш dc "somedc01", это не сработает:
replication =
{
'class': 'NetworkTopologyStrategy',
'SOMEDC01': '3' # <-- BOOM!
}
AND durable_writes = true;
В любом случае, это не интуитивно, надеюсь, что это поможет.
Ответ 3
в моем случае, я получил сообщение 0, но cassandra встал, и cqlsh работал правильно, проблема заключалась в доступе из java: запрос был для полной таблицы, а некоторые записи не были доступны (все узлы, содержащие их), Из cqlsh выберите * из таблицы, только показывает доступные записи. Итак, решение состоит в том, чтобы восстановить узлы и, возможно, изменить коэффициенты репликации с помощью:
ALTER KEYSPACE ....
nodetool repair -all
затем статус nodetool, чтобы увидеть изменения и структуру кластера