Мы получаем данные примерно с 20-25 датчиков промышленных двигателей, и данные хранятся в базе данных Cassandra. В настоящее время Cassandra работает в одном узле.
Ниже представлена структура таблицы
CREATE TABLE cisonpremdemo.machine_data (
id uuid PRIMARY KEY,
data_temperature bigint,
data_current bigint,
data_timestamp timestamp,
deviceid text,
) WITH bloom_filter_fp_chance = 0.01
AND caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'}
AND default_time_to_live = 7884000
AND gc_grace_seconds = 100;
CREATE INDEX deviceid_idx ON db.machine_data (deviceid);
CREATE INDEX data_timestamp_idx ON db.machine_data (data_timestamp);
Данные собираются в этой таблице в течение нескольких месяцев, например, каждые 5 секунд в течение почти 24 часов, так что объем данных довольно большой.
Я пытаюсь выполнить запрос на основе диапазона дат с использованием java и dotnet, и в обоих случаях я получаю ошибки тайм-аута (сбой Cassandra во время запроса на чтение при согласованности LocalOne (0 реплик ответили, более 1 требуется))
Запрос работает нормально, если я даю предел 100, иначе ничего не получится выше. Некоторые из вещей, которые я пробовал ...
1) увеличен тайм-аут запроса. 2) уменьшено значение gc_grace_seconds до 100 (временно), чтобы устранить любые надгробия.
Запрос использован
SELECT data_temperature AS "DATA_TEMP",data_current AS "DATA_CURRENT" FROM machine_data
WHERE DATA_TIMESTAMP>=1517402474699
AND DATA_TIMESTAMP<=1517402774699
AND DEVICEID='BP_100' ALLOW FILTERING;
Не уверен, что структура таблицы (первичный ключ) выбрана неправильно. должно быть и deviceid, и timestamp ??
deviceid
иtimestamp
в качестве составных ключей. Кроме того, воздержитесь от использования РАЗРЕШЕНИЯ ФИЛЬТРАЦИИ, это большой удар по производительности. - person Bigby   schedule 31.01.2018