Подтвердить что ты не робот

Недостаточно копии для запроса при согласованности 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 живой". Есть два узла вверх, что означает, что для репликации нужно быть "живым".

Или я не понимаю сообщение об ошибке?

Спасибо.

4b9b3361

Ответ 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, чтобы увидеть изменения и структуру кластера