(ServerName String, MetricName String, CreatedAt DateTime, Value Float) ENGINE = MergeTree() ORDER BY (ServerName, MetricName, CreatedAt) PARTITION BY (ServerName, toYYYYMM(CreatedAt))
Серверов мало, метрик чуть побольше (около 200 на каждый сервер), а вот собираются данные каждую секунду, так что по итогу строк много.
У меня возникает сразу же несколько вопросов:
1) Целесообразна ли здесь замена строк на целые числа? (т.е. вместо ServerName String использовать ServerId UInt16)
2) Подойдёт ли такая схема для того, чтобы данные можно было визуализировать --- выбирать определённый сервер, несколько метрик, определённый промежуток времени и отображать соответственно данные (агрегация на уровне avg, median)?
3) Подходит ли вообще эта БД для такого типа задач? Есть всякие Prometheus, но возникает проблема с историческими данными и с их количеством.
4) Можно ли как-то улучшить схему?
1) можно не париться 2) да 3) victoria metrics как раз для этого
лучше всего закодировать сервер в id метрики, просто сквозная нумерация и хранить только 3 поля. расшифровку Metric хранить в mysql или в отдельной таблице в КХ + словарь (Metric UInt32, CreatedAt DateTime, Value Float CODEC(Delta?/Gorilla?, ....) ) ENGINE = MergeTree() ORDER BY (Metric, CreatedAt) в victoria metrics все это уже решено и оптимизировано внутри и огромный плюс victoria поддерживает promql
ну не сказал бы что прямо promql это такой уж плюс всякие if внутри instant vector не поделать
Спасибо. Я и то, и другое решение сравню
Поигрался я с VM, интересная вещь и Grafana из коробки поддерживает, не так долго пришлось разбираться с настройкой панели, но данные вставлять --- это боль, надо разобраться с нативным форматом, чтобы это выполнять операцию быстро, а для CH есть clickhouse-driver, который работает очень даже быстро
данные? вставлять? В смысле у вас неоткуда скрепать метрики в формате прометея?
Можно было бы данные в реал-тайме получать, но, если честно, задача немного другая, но а это как пример. Я упомянул исторические данные, с ними беда (скорость вставки). А так данные собираются в одном файле за час, потом его надо прочитать и за этот последний час вставить данные
Извините за то, что я не разбираюсь в этой теме, но если исходить из моего последнего комментария, то что лучше выбрать или разницы нет особой?
В VM данные будут занимать места сильно меньше, чем в клике. Берите VM.
Хорошо, спасибо. Правда, придётся поприседать с бинарным форматом
У них вроде и не бинарный есть. По крайней мере для вставки - точно
Да, есть не только они (всеразличные JSON, CSV и т.п.), но по скорости самый быстрый --- бинарный. Проблема с тем, что если вставлять в JSON, то придётся долго ждать, пока вставятся данные за 5 лет
я так данные из инфлюкс дб переносил за 5 лет. меньше чем за сутки всё перенеслось. сидеть и разбираться в бинарном протоколе гораздо дольше. померяйте скорость вставки - если за пару дней уложитесь, то к чёрту этот бинарный протокол
Звучит рационально
Обсуждают сегодня