Получение WriteTimoutException для операций CAS

Я пытаюсь вставить довольно небольшое количество данных асинхронно, используя фантом для cassandra 3:9 однако этот запрос не выполняется:INSERT INTO test_db.test_tbl(name, last, ts) VALUES('aaa', 'bbb', 1502109409) IF NOT EXISTS USING TTL 0; Я получаю следующее исключение:

com.datastax.driver.core.exceptions.WriteTimeoutException: тайм-аут Cassandra во время запроса на запись в последовательности SERIAL (требуется 1 реплика, но только 0 подтверждает запись)

в com.datastax.driver.core.exceptions.WriteTimeoutException.copy (WriteTimeoutException.java:100)

at com.datastax.driver.core.Responses $ Error.asException (Responses.java:134)

в com.datastax.driver.core.RequestHandler$SpeculativeExecution.onSet(RequestHandler.java:507)

на ком.....

Я бегу Кассандру с докером. Я пытался изменить cassandra.yaml write_request_timeout_in_ms: 20000 но это не имело большого значения.

ОБНОВЛЕНИЕ: я попытался установить уровень согласованности на ОДИН (также пробовал другой):

insert
      .value(_.name, "aaa")
      .value(_.last, uuid)
      .value(_.ts, Random.long)
      .ifNotExists()
      .consistencyLevel_=(ConsistencyLevel.ONE)

но исключение по-прежнему показывает "Тайм-аут Cassandra во время запроса записи в последовательности SERIAL"

1 ответ

Та же проблема, это мое решение:

Он подходит только для одного узла.

  1. Выполнить LWT CQL один раз, закрыть и запустить сеанс один раз. используйте com.datastax.driver.core.Session.init ().

  2. Cluster.Builder.setConsistencyLevel(ConsistencyLevel.QUORUM)

  3. Cluster.Builder.withSocketOptions(newSocketOptions (). SetConnectTimeoutMillis(300000) .setReadTimeoutMillis(300000));

Ты используешь IF NOT EXISTS ключевое слово, которое является легковесными транзакциями

Cassandra реализует облегченные транзакции, расширяя консенсусный протокол Paxos, основанный на алгоритме на основе кворума. Паксос обеспечивает линеаризуемую последовательность за счет четырех поездок туда и обратно.

Это звучит как высокая стоимость - возможно, слишком высокая, если у вас есть редкий случай приложения, которое требует, чтобы каждая операция была линеаризуемой. Следовательно, резервируйте легкие транзакции для тех ситуаций, когда они абсолютно необходимы.

Источник: https://www.datastax.com/dev/blog/lightweight-transactions-in-cassandra-2-0

Другие вопросы по тегам