Запросы на чтение Cassandra возвращают пустые результаты Использование данных springframework cassandra

Когда я выполняю запросы на чтение Cassandra, он всегда возвращает пустые результаты, но записи присутствуют в таблице cassandra.

Я сталкиваюсь с этой проблемой, когда в том же разделе выполняется действие удаления.

Например: Раздел A содержит 1 млн записей, а ранее я удалил 900 тыс. записей в том же разделе А. Позже я не смог получить оставшиеся 100 тыс. записей в тех же разделах. Иногда вызывает ReadTimeoutException или возвращает пустые результаты.

Это происходит при запросе с использованием данных Springframework cassandra. Я могу выполнить тот же запрос и получить результаты в инструменте cassandra (Datastax или Dbeaver).

Не могли бы вы помочь мне с этим?


person Chandru    schedule 16.10.2020    source источник


Ответы (1)


Cassandra не удаляет данные сразу, она помечает удаление и удаляет его по истечении заданного времени. В то же время ваши запросы могут занять больше времени. Если вам нужно, чтобы данные удалялись быстрее, вам нужно запустить compact:

./nodetool compact <ks_name> <cf_name>

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

Запрос 100 000 строк из Spring-boot будет затратным по времени, с точки зрения количества информации, передаваемой через доступную полосу пропускания, и с точки зрения используемой памяти. Можете ли вы опубликовать подробную информацию о своей конфигурации и проверить, не заканчивается ли память сервера микросервиса Spring-boot и не переключается ли он во время запроса?

free -h

Больше вещей. Можете ли вы проверить, какой узел вы запрашиваете из Spring-boot? Можете ли вы вставить сюда CQL, отправленный Spring-boot? Из cqlsh вы запрашиваете данные на этом узле/разделе или на все 100 тыс. строк? Используете ли вы балансировщик нагрузки, прокси-сервис или любую другую службу, например Consul, в своем проекте Spring-boot?

Чтобы решить сетевые проблемы, подключитесь по ssh к узлу cassandra, который вы ожидаете запрашивать, и проверьте с помощью tcpdump, действительно ли он получает соединение с компьютера, на котором вы запускаете свой микросервис.

Предполагая, что машина с spring-boot — 10.0.10.100, подключитесь по ssh к узлу Cassandra, который, по вашему мнению, получает соединения, и выполните:

sudo tcpdump | grep "10.0.10.100"

Теперь попробуйте запустить запросы из Spring-boot.

Откройте iftop на сервере Spring-boot и посмотрите, какая пропускная способность потребляется для получения из Cassandra.

iftop

Надеюсь, это поможет. Пожалуйста, предоставьте больше информации.

Ваше здоровье

person Carles Mateo    schedule 23.10.2020
comment
Кроме того, вам необходимо учитывать параметр gc_grace_seconds, определенный для таблицы. Значение по умолчанию — 864 000 секунд (10 дней); эта конфигурация устанавливает время, в течение которого запись-захоронение будет существовать в системе. Вы можете получить настройку, используемую с помощью команды DESCRIBE TABLE <ks_name>.<cf_name> в cqlsh. Если вы удалите записи и немедленно выполните сжатие, nodetool compact не сможет освободить место на диске, если период времени gc_grace_seconds еще не истек. - person Carlos Monroy Nieblas; 24.10.2020