Ошибка чтения в Кассандре

У меня странная ошибка при попытке прочитать данные из таблицы Кассандры. У меня есть установка с одним узлом, с настройкой по умолчанию. Это вопрос, который я делаю:

  SELECT component_id,
         reading_1,
         reading_2,
         reading_3,
         date
  FROM component_readings
  WHERE park_id=2
        AND component_id IN (479)
        AND date >= '2016-04-09+0000'
        AND date <= '2016-05-08+0000';

component_readings простая таблица без условий кластеризации:

CREATE TABLE component_readings (
    park_id int,
    component_id int,
    date timestamp,
    reading_1 decimal,
    reading_2 decimal,
    ...
    PRIMARY KEY ((park_id), component_id, date)
);

С некоторыми component_id ценности, это работает, и с другими значениями, это терпит неудачу. Это ошибка, которую я получаю:

cassandra.ReadFailure: code=1300 [Replica(s) failed to execute read] 
message="Operation failed - received 0 responses and 1 failures"
info={'required_responses': 1, 'received_responses': 0, 'failures': 1,
'consistency': 'LOCAL_ONE'}

И системный журнал cassandra показывает эту ошибку:

ERROR [SharedPool-Worker-1] 2016-05-09 15:33:58,872 StorageProxy.java:1818 - 
Scanned over 100001 tombstones during query 'SELECT * FROM xrem.component_readings
WHERE park_id, component_id = 2, 479 AND date >= 2016-04-09 02:00+0200 AND date <=
2016-05-08 02:00+0200 LIMIT 5000' (last scanned row partion key was ((2, 479),
2016-05-04 17:30+0200)); query aborted

Странно то, что я получаю ошибку только при выполнении запроса из внешней программы (через соединитель python cassandra). Если я сделаю это прямо в оболочке cqlsh, она отлично работает.

Моя установка была cassandra 2.2, но я обновился до 3.5, и я получаю ту же ошибку.

1 ответ

Решение

Вы превышаете tombstone_failure_threshold, По умолчанию это 100'000. Вы также можете

  • увеличить значение в cassandra.yaml или
  • очистить ваши надгробия

Чтобы сделать последнее, измените вашу таблицу и установите для gc_grace_seconds значение 0:

ALTER TABLE component_readings WITH GC_GRACE_SECONDS = 0;

Затем запустите сжатие через nodetool. Это смоет все надгробия.

В вашем конкретном сценарии кластера с одним узлом вы можете оставить GC_GRACE_SECONDS на нуле. Но если вы это сделаете, имейте в виду, чтобы отменить это, если вы когда-либо хотите использовать более одного узла!

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