Невозможно выполнить запрос выбора после установки TTL в Кассандре

У меня уже есть записи в DB Cassandra. Используя Java Class, я извлекаю каждую строку, обновляюсь с помощью TTL и сохраняю их обратно в Cassandra DB. после этого, если я бегу select запросить его выполнение и показ записей. но когда время TTL было завершено, если я бегу select запрос должен показать ноль записей, но не работает select показ запроса Cassandra Failure during read query at consistency ONE ошибка. Для других таблиц select запрос работает правильно, но для той таблицы (к которой строки я применил TTL) не работает.

1 ответ

Решение

Вы используете общие анти-паттерны.

1) Вы используете пакеты для загрузки данных в две отдельные таблицы, отдельно. Я не знаю, владеете ли вы уже кластером или находитесь на своем локальном компьютере, но это не тот способ, которым вы загружаете данные в кластер C*, и вы сильно нагрузите свой кластер C*. Пакеты следует использовать только в том случае, если необходимо синхронизировать две или более таблиц, а не загружать несколько записей одновременно. Я предлагаю вам следующие чтения по теме:

2) Вы используете синхронные записи для вставки ваших довольно независимых записей в ваш кластер. Вы должны использовать асинхронную запись, чтобы ускорить обработку данных.

3) Вы используете функции TTL в своих таблицах, что само по себе не так уж плохо. Тем не менее, истекший TTL является надгробной плитой, и это означает, что когда вы SELECT Ваш запрос C* должен прочитать все эти надгробия.

4) Вы связываете свое подготовленное заявление несколько раз:

BoundStatement bound = phonePrepared.bind(macAddress, ...

и это должно быть

BoundStatement bound = new BoundStatement(phonePrepared).bind(macAddress, ...

для того, чтобы использовать разные связанные заявления. Это не анти-паттерн, это проблема с вашим кодом.

Теперь, если вы запускаете вашу программу несколько раз, в ваших таблицах много надгробий из-за функций TTL, и это означает, что C* изо всех сил пытается прочитать все это, чтобы найти то, что вы написали "в последний раз", когда вы успешно запустили и это занимает так много времени, что время ожидания запросов истекло.

Просто для удовольствия, вы можете попытаться увеличить время ожидания, скажем, 2 минуты, в SELECT и возьмите кофе, а тем временем C* вернет ваши записи.

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

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