Реляционные базы данных / базы данных временных рядов и очень большие запросы SELECT - PullRequest
3 голосов
/ 11 июля 2020

Мне нужно хранить большое количество структурированных записей (потенциально сотни миллиардов) в базе данных. Данные будут записываться непрерывно многими датчиками с высокой скоростью вставки (до 100 тыс. Строк в секунду).

Данные хорошо структурированы, кажется, они хорошо подходят для структурированной базы данных, такой как Postgres. Однако я боюсь, что производительности будет недостаточно для того объема данных, который необходимо принять.

Более того, мне не нужны все функции реляционной базы данных (нет необходимости в полном SQL служба поддержки). Данные будут записываться один раз и считываться несколько раз большими порциями с использованием базовых c запросов, таких как:

SELECT time, value FROM data WHERE time>1000 AND time<2500 AND sensor_location="home" ORDER BY time

То есть выбрать все записи между двумя временными метками для данного датчика (или набора датчиков. ). Мне не нужна возможность делать сложные запросы, такие как соединения или обновления . Предложение ORDER BY важно, поскольку мне нужно иметь возможность обрабатывать эти сообщения в том порядке, в котором они были написаны (с использованием сценария Python). Эти запросы обычно возвращают много строк и часто слишком велики, чтобы поместиться в ОЗУ. Кроме того, возврат такого количества строк очень медленный с большинством СУБД из-за их текстового проводного протокола, даже если я разделю запрос.

Это кажется хорошим вариантом использования для базы данных временных рядов, такой как InfluxDB . Однако его версию с открытым исходным кодом нелегко распространять (что в моем случае является требованием как для устойчивости, так и для масштабируемости), и мои тесты показали, что она недостаточно эффективна, когда дело доходит до больших запросов (в частности, ее проводной протокол слишком медленно, чтобы эффективно передавать такое количество строк - и иногда даже происходит сбой, когда запрос возвращает слишком много строк).

Недавно я узнал о Clickhouse, который масштабируется по горизонтали и обладает высокой производительностью. Он имеет двоичный / сжатый проводной протокол, а один из драйверов Python (clickhouse_driver) имеет функцию execute_iter, которая позволяет избежать взрыва ОЗУ клиента при выполнении таких больших запросов. Однако меня очень беспокоит его устойчивость (повреждение данных в моем случае недопустимо), поскольку оно появилось сравнительно недавно и имеет ограниченную базу пользователей.

Я знаю, что мой вариант использования весьма конкретен c. Есть ли другие варианты бесплатного / открытого исходного кода, о которых мне следует знать?

Ответы [ 3 ]

2 голосов
/ 12 июля 2020

Похоже, ваш случай типичен для ClickHouse, используйте движок таблиц ReplicatedMergeTree https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/replication/

0 голосов
/ 15 июля 2020

Вы должны знать о Warp 10 . Он масштабируемый и хорошо подходит для вашего варианта использования.

Поскольку вы обрабатываете сообщения, используя Python, тот факт, что он хорошо интегрирован с ним, должен иметь значение для вас. Он поддерживает как Pickle, так и Arrow для подключения данных к Python. Вы также можете распространять обработку, используя ее интеграцию со Spark.

0 голосов
/ 14 июля 2020

Взгляните на VictoriaMetrics базу данных временных рядов. Он легко обрабатывает производительность приема 100 тыс. Строк в секунду c на одном узле с несколькими ядрами ЦП. Он оптимизирован для хранения и запроса триллионов (10^12) строк - см. тематические исследования . Он также масштабируется до нескольких узлов - см. документацию для версии кластера .

Он также предоставляет Metri csQL язык запросов, который оптимизирован для обычного времени серийные запросы в производстве. Например, следующий запрос вернет временные ряды для всех датчиков температуры в доме: temperature{sensor_location="home"}.

...