Как стать автором
Обновить

Комментарии 84

А в чем отличие вашей реализации от уже существующих, например Click House или KDB?


Ведь для хранения TS уже давно используются колоночные базы данных. Более того, в существующих решениях уже есть немало полезных опций (скажу про KDB):


  • Драйверы под разные технологии (.Net, Java, ODBC и пр.)
  • Права доступа
  • Вертикальное и горизонтальное масштабирование
  • Stored Procedures

Более того, у них есть также ряд важных для Enterprise особенностей:


  • Они давно на рынке
  • Есть специалисты на рынке
  • Можно купить поддержку
  • Есть community

На тему баланса скорости записи и чтения могу посоветовать схему из той же KDB:


  • данные хранятся индексированные, оптимизированные для быстрого поиска (разработчик выбирает методику хранения)
  • последний день хранится отдельно
  • в конце дня происходит сброс данных, т.е. текущий день пересортировывается и записывается начисто
  • если исключить последний день, то для добавления/удаления/изменения данных следует прочитать весь день в память, сделать нужные операции и сохранить весь день обратно. Т.е. по факту никаких update/delete/insert, кроме редких случаев

Оптимизации для чтения:


  • исходя из предыдущего — нет разреженного индекса, никаких деревьев; все данные хранятся максимально плотно
  • каждая колонка хранится в отдельном сжатом файле
  • на колонку можно наложить аттрибуты, с помощью которых можно или увеличить скорость обращения (т.е. сделать отдельную хеш таблицу), или соптимизировать хранение (записывая одинаковые данные в отдельный блок)
  • если определенное значение хорошо квантуется (например: страна, валюта), то можно попросить не хранить каждый раз значение, а создать отдельно Map: Int -> Value, то есть хранить просто номер значение (подобие динамического enum'а)
  • для жирного запроса — параллельное чтение из нескольких файлов.

И еще раз вопрос: в вашей базе это есть? А если нет — то почему не использовать одно из уже существующих решений (в случае с KDB — она доступна с 2003 года)?

>почему не KDB/CH/etc
Видимо, ответ такой:
Потому, что не блокчейн)
Белый лист в тексте как бы мягко намекает на ICO)) И да, это не критика или ирония) дерзайте!
Nope
В моей базе есть много всего, но это не drop-in replacement для коммерческой БД для хранения тиков, которая стоит столько, что ее стоимость можно узнать только у персонального менеджера, только после того как он соберет всю нужную информацию о твоей компании, чтобы понять сколько денег у тебя можно просить. Сорян.
drop-in replacement

Я бы вообще даже не заводил разговор про такое. Это продукт такого типа, что замена его на другой, даже путь бесплатный и заведомо лучше по характеристикам, все равно будет непростым процессом, который сам по себе стоит денег.

Так я и не завожу. Я даже не знаю как можно сравнивать с kdb+.
А можно спросить почему замена RTDB должна быть непростым делом? Неопытным взглядом подводные камни не видны: это же сервис, cюда шлешь данные, сюда запросы. Запрос, говорят, всегда прост: выдай данные от и до, возможно с какими-то базовыми статистиками (как понимаю с указанием шага). Время от времени прочищаешься. Переписать адаптеры и вся замена.
Запрос, говорят, всегда прост: выдай данные от и до, возможно с какими-то базовыми статистиками

Сразу скажу — у меня практический опыт работы только с OneTick (в пределах трех лет), и там это, мягко говоря, не совсем так. Даже совсем не так. А в целом суть моих соображений проста — это не SQL, при этом даже перенос базы с одного SQL диалекта на другой — штука не всегда простая. А тут со стандартами похуже будет.


Ну и соответственно, переписать адаптеры — может быть нетривиальной задачей с изменением логики обработки.


Я как-то пытался переносить логику работы с OneTick на MS SQL (благо, объемы данных позволяли). Даже на сравнительно небольших потоках, которые MS SQL в принципе переваривает, все не так уж примитивно. И совсем не похоже на оригинал в OneTick.

А можно пример сложного запроса к OneTick? Хочется узнать что значит «совсем не так». Я могу представить и сложные запросы, например если данные «разбиты на фазы», и шаг статистик надо с началом фазы переначинать. Но на сколько я понял, нет потребности такие фичи в язык запросов вставлять, все это делается на мидллейере. А какие есть?

Тут дело не совсем в сложности запроса. Там свой язык запросов, ни с кем не совместимый (хотя ODBC драйвер существует, но SQL весьма специфичный). Функции с одной стороны, как вполне обычные, типа max/min/first/last за период, так и достаточно экзотические. К сожалению, с открытой документаций как-то не очень, я затрудняюсь отослать к какому-либо примеру в интернете.


Кстати, попробуйте на досуге реализовать в виде SQL запроса такую тривиальную в общем-то штуку, как last за произвольный период. И главное посмотрите, как быстро это будет работать.


Но на сколько я понял, нет потребности такие фичи в язык запросов вставлять, все это делается на мидллейере.

Что значит "все делается"? Тут есть одна небольшая проблема — при больших объемах вы не можете просто так вытащить нужные вам данные из TDSB "с запасом", и потом их где-то обработать, это слишком много ресурсов потребует.

Частично согласен про "сложности переноса", но… меня смутил ваш пример:


попробуйте на досуге реализовать в виде SQL запроса такую тривиальную в общем-то штуку, как last за произвольный период.

Иии… оно как бы тоже довольно тривиально на SQL:


select * from tab where rowid = (
  select max(rowid) from tab 
  where rowdate >= :from and rowdate <= :to
)

И главное посмотрите, как быстро это будет работать.

Ну… очень быстро будет, если rowid — primary key с (clustered index) и rowdate тоже проиндексирован (напрямую, или в join'е с другой какой табличкой).


Сложный last реализуем "отсортированым подзапросом" с TOP N сверху, или WHERE ROWNUM <= N или LIMIT N (соотвественно для MSSQL, ORA, и другие). Тоже не вижу особых проблем: execution plan построится как выбока N значений после мёржа с пересечением двух индексов (один ограничен/отфильтрован по rowdate).


Я не совсем в теме как оно там в OneTick, может там какой другой last или вы что-то другое имеете ввиду?

Добавлю что вопрос был о сложности переноса с одной TSDB на другую TSDB а — ответ про SQL не мог удовлетворить в принципе, но хабродруг sshikov сразу обозначил, что такого опыта не имеет, и ждем что оптыом подлятся и бывалые.

Мне все же очень интресно — не ужели никто не пробовал сохранять аппроскимации для оптимизации IO Read запросов? Не только для графиков можно использовать — но и для счета: есть аппроксимации сохраняющие и важнейшие статитсики (среднее, ошибку, экстремумы)
Добавлю что вопрос был о сложности переноса с одной TSDB на другую TSDB…
ждем что оптыом подлятся бывалые.

Как бы оно тяжело так ответить. Зависит от многих параметров, как-то:


  • необходима ли перестройка структур для внутренних/внешних данных под новую TSDB;
  • если да насколько она сложна;
  • имеется ли прослойка/надстройка в виде Middle-Level-API оборачивающая вызовы к TSDB;
  • насколько это Middle-Level-API абстрактно и/или видоизменяемо;
  • насколько глубоко используются возможности конкретной TSDB;
  • весь ли используемый функционал в оригинальной TSDB предоставляется целевой TSDB;
  • т.к. как правило переезд обоснован новым функционалом и/или конструктами (предоставляемым новой TSDB), сколь долго код переделывается/переписывается под новый конструкт/модель;
  • насколько тяжела собственно миграция данных (если необходима) с учетом всего вышеописанного, возможна ли в отрыве от продакшн (инкрементально), есть ли готовые наработки и т.д.;

И это на бумаге, где мы еще "забыли про овраги"…
… тут картинка с Боромиром — "нельзя просто так взять и… рассазать про перенос TSDB/RDMS/NoSQL/любимое-подставить".


Ибо разное оно все…
А так-то перетаскивал и не раз, но… в каждом конкретном случае с совсем разными трудозатратами… и граблями.

Да не надо так глубоко, но вопрос действительно можно перефразировать: «на сколько одна TSDB внешне не похожа на другую»? Косвенно утверждалось «очень не похожи», что обескуражило (исходя из примитивного понимания: сохраняем типизированные кортежи со временем, запрашиваем данные для отбражения графиков и статистики для отчетов) — поэтому и задаю вопрос в лоб. Что и говорить хотелось бы с примерами (но не nosql и rdbms)

Ну раз "вопрос в лоб", вот конкретный ответ на вскидку и "в лоб":


Например Kx kdb+ подразумевает что вы умеете Q (язык такой от Kx Systems), и он по умолчанию практически не совместим ни с одним известным мне другим "query-языком" (умолчим уже про чистые АПИ типа С++, Java, Python) для работы с TSDB даже в примитивах.
Если мощь языка использовалась на всю катушку, то переписывать 3-х этажные конструкции с Q на любимое-подставить — это то еще удовольствие (если вообще возможно без полной перестройки структуры списков и сопутствующего), а там еще могут быть функции и т.д. и т.п.


Причем, много есть чего она умеет из коробки, что либо нет вовсе, либо нужно полностью переделать для конструкций другой TSDB/языка.


Я раз видел как-то одного разраба за переписыванием такого 3-х этажного Q-statement на PyQ (то ли ему где-то нужен был промежуточный питоний reduce, как ему казалось не реализуемый на Q, то ли не оптимальный и не миксуемый по другому был). Так вот он это делал день… Еще раз — один единственный statement. С матом (ну как умел, ибо немец), приступами агрессии и др. сопутствующими симптомами (вынос мозга и т.д.).


Вот вам например, первый попавшийся, небольшой сценарий на Q, попробуйте представить, что нужно сделать, чтобы переложить хотя бы его на любой другой вам известный TSDB/язык, фреймворк и т.п.


Ваше представление aka Smalltalk? 1C? SAP? (что вы назвали "исходя из примитивного понимания") — описал кортеж, покликал мышем связав две кнопки и функцию, скормил ему кучу данных (магически видимо как-то) и бац — получил красивый график — к сожалению (а может к счастью) так не работает и далеко от реальности, от слова совсем.
Вы правда с биг-дата и time series работали? Или для вас табличка с BLOB (JSON) обернутая кучей stored functions вокруг — тоже TSDB?

Дали пищи для размышлений. Я не работал с RTDB. Мое представление о RTDB вытекает из требований к RTDB которые из своего субъективного опыта считаю разумными: услуга храенения кортежей (большие объемы, но не обязательно запредельные, десяток событий в секудну, пара сотен различаемых аттрибутов, но многие из которых пусты) в структурах удобных для оптимизации запросов по условию category='my category' and time between time1 and time2 — задача с которой более менее справляется и RDВMS, но очевидно не эффективно (и есть план изучить RTDB подходящую для решения такой задачи).

RTDB читать как TSDB, переклинело.

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


where rowdate >= :from and rowdate <= :to

А теперь вспоминаем, что нам нужно агрегировать до минут/часов и т.п. Т.е. эти самые from и to нужно вычислять, как начало и конец секунды. Ну в общем, много мелкой разной возни.


И как вы уже заметили, для MS SQL и Oracle подходы могут быть слегка разные.


Дальше — OneTick, как ориентированная на временные ряды база, сама умеет генерировать уникальные seq id для тех тиков, у которых полностью совпали timestamp — т.е. время получается дополненным числом 1, 2, 3..., если оно совпадало. Я, скажем так, не разработчик MS SQL, и могу ошибаться, но я знаю один способ сгенерировать именно такие уникальные id — и это триггер (и это плохо, потому что будет тормозить вставки). Или уже будет что-то по-другому, например сквозная нумерация.

Все верно.

А теперь делаем на SQL табличку — по строкам дата/время и срез десятка параметров с этим временем +-200мс (т.к.снимаются асинхронно).
Ожидал коммента о kdb+/q и не могу не согласиться, насколько знаю одно из лучших решений для временных рядов больших объёмов. Если у вас был опыт коммерческой работы с интересом прочитал бы ваши посты на эту тему. К сожалению, очень немного русскоязычных публикаций на тему kdb+/q

Да, опыт есть.


У меня пока в черновиках статья, постараюсь опубликовать пораньше, так как:


К сожалению, очень немного русскоязычных публикаций на тему kdb+/q

Даже на работе сложно описывать все возможности

Спасибо за статью и рассказ о требованиях к TS. Вопрос, а такая возможность языка запросов как «верните мне значения от даты, до даты, апроксимированные до N точек (без сглаживания, т.е. оставляя локальные экстремумы)» у вас реализована или это не то что надо ждать от TS DB вообще?

Т.е. если задача «web dashboard графиков временного ряда c server-side zoom'ом » какой продукт (комбинацию продуктов) использовать?
У меня это не реализовано (и я даже не знаю как называется подобный алгоритм), в известных мне TSDB тоже.

Есть алгоритм Largest-Triangle-Three-Buckets. Простой, но хорошо аппроксимирует данные для отображения, не удаляя экстремумы.


По моему мнению для TSDB такая функциональность не требуется.

Этот репозиторий я уже видел, даже в закладки добавил. Думаю что плагин для grafana — самое подходящее место для него.
А есть ли название у обобщенной задачи: кэширования в TSDB (или в серверной надстройке) подобных аппроксимаций для нужд оптимизации? Т.е. если известно что инженер всегда открывает данные (на графике) с конкретным treshold'ом, и в 80% углубляется до такого-то treshold'а и только в оставшихся 20% идет глубже, возможно имеет смысл постоянно хранить в TSDB 2 постоянные дополнительные аппроксимации?
C ним есть проблема что он превращает равномерный временной ряд в неравномерный — выкидывает целые диапазоны, для которых потом предлагается линейную аппроксимацию рисовать. Это не везде подходит, например, очень неудобно над таким образом преобразованными данными делать хоть какие-то (пост)вычисления и тп
Тут был комментарий про то что chronix лучше, я его случайно отклонил пытаясь ответить. Так вот, эти ребята ни в одной статье не показали нормальных результатов тестирования производительности, так что я сомневаюсь в том, насколько там все хорошо в реальности. Ну и еще они хранят данные с потерями, поэтому в разделе evaluation у них все так хорошо (там фигурирует скорость чтения и размер на диске ЕМНИП). Естественно они всех рвут по этим параметрам, т.к. сравнивают БД, которой нужно прочитать 1МБ с БД, которой нужно прочитать 10МБ. Проблема в том, что вам может хотеться хранить данные с полной точностью.
Сделать так, чтобы этот замечательный ресурс заметил твое существование стоит минимум 500 евро в год, опубликовать статью в их блоге 700 евро и тд.
Серьезный ценник. (Смайлик не подобрал)

Но сравниваться-то можно и бесплатно.
Насколько я помню, на Хабре в 17м году еще пробегала статья про TS DBMS и более приятно технически проработанная.

Честно говоря меня, как пользователя подобных СУБД, не зацепило
Все равно спасибо что прочитали. Буду рад прочитать ту другую статью про TS DBMS.
Спасибо за интересную ссылку. Парадоксально, что пишут «высокопроизводительные» базы на каких-то низкопроизводительных языках программирования. Во всём обзоре в лучшем случае использовался C++. Нет ни одной базы на чистых сях.
Разница по производительности между хорошим кодом на С и на С++ в среднем равна нулю.
С другой стороны, писать плохой по производительности код на С++ значительно проще, но не факт, что переписывание на С тут хоть как-то поможет (плохой код скорее всего будет переписан в такой же плохой код).
Но, почему-то, всегда получается так, что те приложения, для которых требуется беспрецедентно высокая производительность написаны именно на Си. Примеры навскидку: Redis, Postfix, Dovecot, PostgreSQL, SQLite. Их близкие конкуренты, написанные на плюсах, уже несколько меркнут ))) Хоть и нельзя утверждать, что тот же MySQL стал бы лучше PostgreSQL, если бы был переписан на Си.
20-30 лет назад компиляторы были другие, а сейчас нет смысла переписывать на другой язык.
JFYI, табличку составляли авторы DalmatinerDB. И они ничего не тестировали, а взяли свободно доступные данные из интернета (в случае Akumuli — скорость записи на моем ультрабуке).
То-то у меня подозрения по поводу эрланга возникли… Со своим гарбидж-коллектором и виртуальной машиной оно вообще тормознутое для больших кусков данных, хранящихся в памяти.
Dalmatiner работает забавно (если я правильно их понял). Они просто пишут на диск весь поток, даже без сортировки. Далее, во время чтения интервала (t1, t2) они читают (t1 — delta, t2 + delta) в надежде на то, что все нужные будут там. Сжатие за счет ZFS.
Срочно нужны какие-то вводные статьи, как это пощупать и какие возможности есть из коробки. Очень уж заманчивые характеристики!
Вводные статьи есть в wiki проекта. Там есть описание языка запросов и формата входных данных — github.com/akumuli/Akumuli/wiki Эти статьи немного устарели, т.к. там нет описания того как работать с Docker контейнером, но в Docker Hub эта информация есть — hub.docker.com/r/akumuli/akumuli. Разница в том, что Docker контейнер сам создает конфигурацию и файлы БД (если они отсутствуют). Но даже без Docker там с точки зрения операций все очень не трудоемко.

Еще там есть описание языка запросов и форматов входных данных, но записывать данные можно через какой-нибудь коллектор (нужно только использовать протокол OpenTSDB) и читать данные с помощью плагина для графаны. Думаю это то что нужно большинству людей.
Продолжайте! И не бойтесь вопросов в стиле «А в чем отличие вашей реализации от уже существующих, например...».
НЛО прилетело и опубликовало эту надпись здесь
А где тут NIH-синдром?
Продолжайте!

ageres, зачем Вы оказываете медвежью услугу?


И не бойтесь вопросов в стиле

Главное — не уверенность, а аргументы. Сейчас ответ читается как "да, я проигрываю комерческим базам и делаю вид, что не заметил в исходном комментарии Click House, так как я проигрываю Open Source решениям тоже".


Ибо получается, что автор сделал серьезный труд, даже внедрил решение, однако будущее его проекта туманно, т.к. придется тягаться с Яндексом на рынке дешевых решений и с кучей других на рынке коммерческих.


А теперь главное — если продолжать работу над Akumuli, то автор опять затратит много сил, добьется того, что уже есть в открытом доступе, и всё равно будет отставать от того же Яндекса.


Всё это, конечно, не отменяет полезность и интересность статьи (за что от меня плюс). Надеюсь, я ошибаюсь, и у автора получится таки найти нишу для Akumuli.


Текущий ответ @ELazin, чтобы не скролить
В моей базе есть много всего, но это не drop-in replacement для коммерческой БД для хранения тиков, которая стоит столько, что ее стоимость можно узнать только у персонального менеджера, только после того как он соберет всю нужную информацию о твоей компании, чтобы понять сколько денег у тебя можно просить. Сорян.
Получилось малость пассивно-агрессивно, извиняюсь, но мой поинт был в том, что это разные продукты, ниши у них абсолютно разные, с тем же успехом можно было сравнивать Akumuli с MySQL, я просто понятия не имею что на это ответить.

ClickHouse это тоже аналитическая БД, его имеет смысл с Vertica сравнивать, это не TSDB, там есть GraphiteMergeTree для метрик, но чтобы с этим разобраться нужно изучать исходники (оно не описано в документации, по крайней мере раньше не было) и судя по всему, создавалось для внутренних нужд. Данные в CH нужно писать батчами, нельзя просто открыть сокет и начать записывать туда данные, все будет слишком медленно. Нужен какой-то сервер, который будет получать данные мониторинга от коллекторов, батчить их и вставлять. Для этого есть graphite-clickhouse и graphouse. Ни одна из этих связок не поддерживат теги.

Сравнивать Akumuli имеет смысл с другими TSDB — OpenTSDB, Graphite, InfluxDB и тд. По сравнению с ними у меня есть преимущество в производительности и простоте операций. Akumuli может работать автономно, не нуждается в администрировании. У меня есть пользователи, которые выбрали Akumuli именно благодаря этому. Им нужна была БД, которая может работать на очень слабом железе, мониторить кучу контроллеров и не нуждаться в администрировании. У меня самого есть кое какой проект, который мониторится с помощью Akumuli на t2.micro инстансе.
Скажите, она действительно будет норм работать на не самом мощном железе?
Просто на страничке проекта есть текст «Akumuli is a time-series database for modern hardware
Я использую t2.micro и EBS volume для мониторинга небольшой системы. Нужно иметь ввиду, что для обработки большого количества точек/сек нужно иметь нормальный процессор или много ядер, если у вас очень много уникальных метрик нужно много памяти (примерно 16-24КБ на метрику). Modern hardware = оптимизация под SSD/NVMe, параллельная запись/чтение и все такое.

Мы успешно используем ClickHouse для временных рядов — храним результаты нагрузочных тестов и тестов энергопотребления. В случае с тестами энергопотребления нам удавалось заливать миллион замеров в секунду, а потом с этим работать. Так что сравнивать имеет смысл.


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

Мы используем buffer в самом ClickHouse.

По вашей ссылке:
Заметим, что даже для таблиц типа Buffer не имеет смысла вставлять данные по одной строке, так как таким образом будет достигнута скорость всего лишь в несколько тысяч строк в секунду, тогда как при вставке более крупными блоками, достижимо более миллиона строк в секунду (смотрите раздел «Производительность»).
А в чем заключается «медвежья услуга»?
А в чем заключается «медвежья услуга»?

Суть в том, что если есть популярное открытое и бесплатное решение (я про Click House), то очень сложно сделать более быстрый аналог. К тому же Click House прекрасно решает в том числе и задачу работы с временными рядами, так как по сути вам надо просто брать определенную проекцию из данных (т.е. создать materialized view для вашей таблицы со своей логикой сортировки).


А в итоге что имеем:


  1. Есть бесплатное открытое решение, которое улучшается кучей людей и компаний
  2. Когда новый человек ищет способ решение своей задачи, он зачастую будет руководствоваться тем, какие есть функции в проекте, какая документация, насколько большое сообщество и т.д.
  3. Ваше решение уже сейчас проигрывает аналогам.
  4. Если Вы будете продолжать разработку над Akumuli, ваш вклад в "open source" будет неоцененным, так как вы решили задачу, а немало людей пользуются другой такой же программой
  5. Через N лет вам надоест вкладывать силы в решение, и если вы не успеете собрать community, то проект будет затухать и забываться

То есть по сути серьезный труд остается неоцененным, однако вам говорят, что "всё круто, продолжай". Отсюда моё мнение — как можно раньше признать, что есть более серьезные аналоги, а дальше — попытаться интегрировать ваши алгоритмы в Яндекс (или аналоги), написать статьи об алгоритмах и добавить строчку в резюме.


Да, это шаг назад, однако иначе через 5 лет вам уже сложно будет выдать Akumuli за достижение.

Я еще раз повторю, что CH это не то же самое, с временными рядами он работать может (как и сотни других продуктов), на этом сходство заканчивается. Я действительно не понимаю, при чем тут CH, вы его когда-нибудь использовали для мониторинга? А kdb+?
вы его когда-нибудь использовали для мониторинга

Click House — в соседних командах


А kdb+?

Да, я даже расписал то, как он работает.

Расписать то расписали, но это именно мониторинг? Я просто никогда не встречал kdb+ в мониторинге. Это где же такое есть, если не секрет?
К тому же Click House прекрасно решает в том числе и задачу работы с временными рядами, так как по сути вам надо просто брать определенную проекцию из данных (т.е. создать materialized view для вашей таблицы со своей логикой сортировки).

Materialized view сейчас убивает перформанс КХ напрочь, простите.
Просто проходил мимо.

Не обращайте внимание.
Slack и Trello, похоже, тоже оказывали медвежью услугу(конкурент Atlassian Jira и HipChat).

Главное — не уверенность, а аргументы.

Главный аргумент звучит так:
Akumuli, как публично доступный проект, появился в 2013 году.
Click House, как публично доступный проект — Тремя годами позже (в 2016 году).

В связи с этим Вы либо требуете от автора быть пророком видящим в будущее, либо Ваш вопрос на самом деле не к Akumuli, а к Click House — зачем его стали разрабатывать, если Akumuli уже 3 года как существовал и можно было бы в его разработке участвовать.

Почему-то в подобных вопросах сравнениях люди напрочь забывают, что более известный конкурент мог банально появиться позже и реальный выбор у разработчиков был не между конкурентом и своим решением, а между своим решением и ничем.
Насколько я знаю, CH разрабатывается с 2008 года. Просто они его писали для внутренних нужд. В 16-м они его выложили в open-source.
А узнали Вы это до 2016 или до 2013 годов?

Конечно же я в курсе, что реальная разработка CH началась раньше, чем выкладка в open-source, но не суть важно, когда она началась. Важно, что в 2013 году тот, кто ставил себе задачу разработать TSDB скорее всего не мог знать о существовании внутренней разработки яндекса CH. Следовательно вопросы в стиле зачем писать свое, если есть CH — это отсылка к видению будущего.
Заранее не знал, конечно. Сейчас я не стал бы ничего такого разрабатывать, честно говоря. Очень уж много всего появилось за последние год-два.
Попробуйте переписать на чистый Си. В результате ещё больше увеличите производительность и проект будет выглядеть конкурентоспособнее по сравнению с Click House.
Если вы делаете 10 000 вставок в свою SQL базу данных — все будет хорошо какое-то время, потом таблица вырастет в размерах настолько, что время выполнения операций вставки увеличится.

Пруфлинк в студию, пожалуйста!

Работаю в научной сфере с временными рядами без изысков и экзотики, используя банальную, хорошо настроенную SQLite. На 400 млн строк упомянутой у Вас просадки производительности для insert не наблюдается.

Вообще, хотелось бы увидеть сравнительные тесты разных БД с Вашей разработкой. SQLite в частности.
В статье есть ссылка на benchmark. Вставку в sqlite я не тестировал, невозможно заранее сравнить со всем на свете. Просадка производительности для insert это просто educated guess, количество уровней b-tree в sqlite табличке увеличится до определенного уровня и все станет медленнее. 400 млн строк у вас в одной таблице? А какая схема?
Partitioning хорошо помогает, когда у вас откуда-то может появиться 400 млн строк в одной таблице.
Да, 400 млн строк в одной таблице. Во всей БД только одна таблица. Что-то колдовали с опциями для быстрого добавления. Что именно, сейчас не помню. Доберусь до кода — вышлю схему.
А почему именно SQLite? Это всё же решение для «кофеварок» и небольших задач. Не предполагаете упереться в какое-либо ограничение? Не пробовали что-то более масштабное, типа Postgre или MySQL?
А почему именно SQLite?

Потому, что быстрее просто не удалось найти. Проводился целый ряд исследований под конкретную потребность — хранение временных рядов (среди основных задач). Хочу особенно подчеркнуть, что каждая БД хороша под свои цели. При нагрузочном тестировании рассматривались BerkeleyDB и PostgreSQL в т.ч.
BDB отпала по двум причинам:
1. Она «не SQL» — там своя атмосфера. Дизайн API очень запутанный и странный.
2. Не имеет преимуществ по производительности в сравнении с SQLite.

Производительность PostgreSQL под требуемую задачу не идёт ни в какое сравнение с SQLite. SQLite доступен напрямую как сишная библиотека, которую можно статически собрать с приложением. К PostgreSQL доступ только по сокетам. PostgreSQL хороша для проектов с многопользовательской нагрузкой, с доступом к случайным фрагментам БД и сложными выборками. А для последовательного доступа к данным от имени одного приложения (как в случае с временными рядами) лучше, чем SQLite найти не удалось.

Возможно, где-то MySQL и является преимуществом, но не в научных задачах. По производительности она вообще не конкурент.

Насчёт кофеварок Вы погорячились ) SQLite полноценная БД со своими киллерфичами. Одна из самых быстрых и, кстати, среди прочего, умеет вложенные запросы, in-memory, и много того, чего не умеет MySQL, несмотря на свою «зрелость» и «корпоративную поддержку».
А какая у вас схема БД, если не секрет? И с какой скоростью получается читать/записывать?
Пришлю когда доберусь до кода. Не хочу по-памяти восстанавливать, чтобы не ошибиться — там было много нюансов.
Схему привёл в цитатах чуть ниже по тексту. Про скорость, кстати, и упоминать не стану, т.к. на этот показатель сильно влияет CPU, шина и, конечно, дисковая подсистема. Если и приводить цифры, то только в сравнении нескольких БД на одной аппаратной платформе. Но, если честно, это выходит за рамки практических нужд — выбор нативного решения под сишное приложение сильно ограничен, а уж эрланговские и явовские БД кроме чувства брезгливости никаких положительных ассоциаций не вызывают.
В любом случае хочу Вам пожелать успеха в проекте. Продолжайте. Вы делаете полезное дело и пусть конкуренты не смущают — когда-то и про существование Линукс знала пара-тройка энтузиастов ;)
Нет-нет, я SQLite и сам люблю и применяю нередко. Но не так, как вы. Я как раз и хотел сказать, что это больше встраиваемое/однопользовательское решение (отсюда и производительность). По умолчанию с записью там как раз не очень (особенно на «кофеварках»), так как она параноидально относится к надёжности (при том, что основное место применения — далеко не сервера). Ваше колдовство с настройками скорее всего было в отключении журналирования, и наверняка в группировке записи большими транзакциями.

То, что на «больших» машинах она сильно обгоняет полновесные решения тут вполне понятен, так как она относительно проста.
Мой вопрос как раз был про простоту: достаточно ли её возможностей с учётом дальнейшего развития проекта?

И, да: посмотреть на структуру было бы интересно.
Вы совершенно правы. Было и отключение журналирования, и вставка вообще реализована без транзакций, маленькими порциями (если я всё правильно помню).
Т.к. это временной ряд, то при аварийном завершении приложения всегда можно подсмотреть время последней успешной вставки и недостающее подтянуть из внешнего «кеша». Помимо прочего, версия SQLite позволила реализовать consequtive disk access, а в момент старта приложения средствами SQLite производится проверка базы на консистентность pragma integrity_check. В общем, был реализован ряд мер, обеспечивающий и производительность, и надёжность для последовательной записи и обращений к временному ряду. Скорость выборок и вставки вне конкуренции с другими упомянутыми мной БД.
А вот и обещанная схема, она предельна проста. Одна отдельная БД с одной таблицей:
PRAGMA foreign_keys=OFF;
PRAGMA synchronous=OFF;
PRAGMA journal_mode=OFF;
PRAGMA cache_size=524288;
PRAGMA page_size=4096;
CREATE TABLE timeseries (time TIMESTAMP UNIQUE NOT NULL, responsiveness DOUBLE NOT NULL);

достаточно ли её возможностей с учётом дальнейшего развития проекта?

Абсолютно достаточно. Она, даже, избыточна по функционалу. Но это нельзя считать недостатком, т.к. на производительность приложения не влияет.
Ну, это все же не тоже самое. Тут у вас один большой временной ряд. Можно было бы просто хранить все в файле. В feather файле, например, так у вас было бы сжатие.
Спасибо за информацию про feather, однако нативной поддержки под чистый си найти не удалось.
В моём случае сжатие нецелесообразно. Сэкономить пару гигабайт на диске при современных объёмах резон небольшой, а вот накладные расходы на CPU в момент компрессии/декомпрессии — это уже серьёзный недостаток, когда куча фоновых процессов и математическими расчётами генерируется большая нагрузка. SQLite хранит все данные в бинарном виде с приемлемо малым оверхедом.
Я сильно сомневаюсь что тут в CPU что-нибудь упирается. Скорее всего это I/O bound задача и она только выиграет от сжатия.
Я по вашим коментариям сразу понял что вы работаете в «научной сфере». Конкурентоспособность не определяется языком программирования.

Попробуйте переписать на чистый Си.


А попробуйте IDEA JetBrains переписать на чистый C, или vk.com. Сразу отпадет желание сравнивать теплое с мягким. Хорошо что выше уже заметили — С и C++ не имеют столь заметной разницы, больше это зависит от квалификации разработчика и правильно выбранных алгоритмов.

SQLite это вообще RDBMS. Это в принципе для другого создано. Если вы в нее пишете временные ряды это значит либо бюджета недостаточно для ClickHouse, либо что-то еще.

Обычно временные ряды между собой никак не связаны, как и записи в логах. Но по записям в логах не считают агрегаты. Ни одна запись временного ряда, например загрузки ЦП, не ссылается на другую. И уж точно не ссылается на записи из другой сущности, с записями о загрузке в сети, например. Нет связей. Нет связей — нет R в акрониме R(DBMS). Значит они проходят мимо.

Правильнее всего выбирать не самое популярное решение среди доступных, а хотя бы какое-нибудь среди подходящих. C — очень хороший язык, но используйте его только по назначению.

ClickHouse, кстати, тоже не создавался для записи временных рядов, он создавался для записи в него большого количества фактов (кликов) и для быстрой обработки аналитических запросов к этим кликам.

Я считаю уместным сравнивать проект автора с RRDtool, используя который можно писать time series. Инструментарий у этого проекта такой что хуже только в файлы вручную писать, черех fwrite. И если сравнивать проект Akumuli и RRDtool то вы удивитесь как все перевернется.

По поводу 400млн строк — это в секунду? В сутки? А с tarantool сравнивать будем? Он тоже быстро пишет :) Правда это Key Value + Application Server а не TSDB )) Я не буду спрашивать как много клиентов было, при записи этих 400М строк, очевидно что один. В это время, хотя бы на чтение, были запросы от других пользователей к SQLite? Ключевая возможность для TSDB — это запись с нескольких хостов, в противном случае это не TSDB а лог показаний счетчика на устройстве.
Позвольте вопрос, почему не in-memory решение, зачем писать на диск в процессе получения данных? Не лучше ли сделать агент, иногда сохраняющий данные на диск (то есть, конечно же, в сеть)?

Причем логика агента может быть любой (вплоть до её полного отсутствия — когда вы не сохраняете и не храните сырые данные).
Причина в том, что пользователь хочет durability и хранить много данных. Данные хранятся и кэшируются в памяти, если она есть, никаких проблем в этом нет. Но если периодически синхронизировать in-memory store, то это сожрет пропускную способность диска очень сильно. Допустим у нас есть 1М уникальных временных рядов, пусть каждый из них имеет хотя бы одну не заполненную полностью страницу памяти (скорее всего так и будет всегда). Страница — 4КБ, мы должны будем записать на диск 4ГБ данных чтобы синхронизировать только вот эти вот незаполненные полностью страницы. Каждый раз когда страница изменилась (туда дописали несколько точек и страница стала заполнена не на 10% а на 10.1%) мы пометим ее как грязную и во время следующей синхронизации (допустим по таймеру) снова будем ее записывать.

Ну и второй аспект — нам может не хватать RAM для хранения данных. В принципе, можно хранить временные ряды в Redis, я даже на гитхабе что-то похожее видел. Но это подойдет только для случая когда у пользователя небольшой поток или им нужно хранить только оперативные данные за последний день/час.
Объясните, пожалуйста, как вы представляете схему масштабирования.
Когда временных рядов становится больше, вы просто ставите около еще одну такую же монолитную ноду?
Или же архитектура далека от монолитной ноды?
Пока только монолитная нода. Можно обеспечить HA, если использовать две ноды и реплицировать трафик на обе. Для того, чтобы реализовать кластеризацию нужно сначала реализовать запись в прошлое. Пока что roadmap такой:

— Запись в прошлое, обновление старых данных и тд.
— Простая репликация, HA с полным набором данных на двух нодах и синхронизацией в случае, если одна из них уходила offline.
— Тут уже можно начинать думать про кластеризацию.

Сама проблема довольно сложна. Непонятно даже как раскидывать метрики между нодами, ведь запросы часто вытаскивают множество метрик и если распределять их случайным образом, то каждый запрос будет задействовать все узлы кластера (разделить на фактор репликации).
Саппортить отдельную базу для time-series — идиотизм, все можно хранить в обычном SQL.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории