Cassandra - cqlsh возвращает несогласованные результаты, даже если УРОВЕНЬ СООТВЕТСТВИЯ установлен на ВСЕ или КВОРУМ

У меня кластер Cassandra с 4 узлами. У меня есть пространство ключей с коэффициентом репликации 3.

Вот примеры результатов cqlsh, которые я получаю, когда делаю «select count (*) для конкретной таблицы. Результаты неизменно отличаются, даже если уровень согласованности установлен как ALL или QUORUM.


cqlsh: test> ПОСЛЕДОВАТЕЛЬНОСТЬ все

Уровень согласованности установлен на ВСЕ.

cqlsh: test> выберите количество (*) из статьи;

считать

28620 (1 ряд)

cqlsh: test> выберите количество (*) из статьи;

считать

28703 (1 ряд)

cqlsh: test> выберите количество (*) из статьи;

считать

28046 (1 ряд)

cqlsh: test> КВОРУМ СООТВЕТСТВИЯ

Установлен уровень согласованности QUORUM.

cqlsh: test> выберите количество (*) из статьи;

считать

28612 (1 ряд)

cqlsh: test> выберите количество (*) из статьи;

считать

28122 (1 ряд)

cqlsh: тест>



person Atul Dambalkar    schedule 30.06.2015    source источник


Ответы (2)


Я думаю, что это ошибка, которая могла быть исправлена ​​в версии 2.1.6.

Смотрите этот билет:

CASSANDRA-8940

Вы используете более раннюю версию, чем 2.1.6?

person Jim Meyer    schedule 30.06.2015
comment
Спасибо, Джим. Это полезно. Позвольте мне перейти на 2.1.6 и посмотреть, решит ли это проблему. - person Atul Dambalkar; 01.07.2015

На самом деле я думаю, что это может быть способ работы cqlsh. Из http://docs.datastax.com/en/cql/3.1/cql/cql_reference/select_r.html

SELECT COUNT(*) FROM big_table LIMIT 50000;
SELECT COUNT(*) FROM big_table LIMIT 200000;

Если бы у вас было 105 291 строка в базе данных, результат этих операторов будет: 50000 и 105 291. Оболочка cqlsh имеет ограничение по умолчанию в 10 000 строк. Сервер Cassandra и собственный протокол не ограничивают количество строк, которые могут быть возвращены, хотя тайм-аут останавливает выполнение запросов для защиты от выполнения некорректных запросов, которые могут вызвать нестабильность системы.

Попробуйте cqlsh: test> select count (*) из статьи LIMIT 200000; или другое большое значение

person Robert Wadowski    schedule 30.06.2015
comment
Спасибо за ответ. Я на самом деле тоже пробовал это. Вот что я получил - cqlsh: owlin ›select count () from article limit 1000000; count ------- 27778 (1 строка) cqlsh: owlin ›select count () from article limit 1000000; кол ------- 28812 (1 ряд) - person Atul Dambalkar; 30.06.2015
comment
По своему опыту я не доверяю cqlsh. Если вы хотите быть уверенным, запросите все строки через какой-либо драйвер и посчитайте их, а затем сравните с этими результатами. Есть два варианта: 1. cqlsh лежит 2. что-то о clqsh мы не знаем :) Как написал Джим Мейер, эта ошибка многое объясняет - person Robert Wadowski; 30.06.2015