Вставить данные с отметками времени из прошлого в базу данных временных рядов
Давайте рассмотрим Influxdb в качестве примера TSDB. В общих чертах похоже, что Influxdb хранит данные в отсортированных по времени файлах только для добавления. Но также утверждается, что можно вставлять данные со случайными временными метками, а не просто добавлять. А для мира IoT это довольно обычный сценарий, когда время от времени находят некоторые данные из прошлого (например, некоторые устройства были в автономном режиме в течение некоторого времени, а затем снова подключаются к сети) и помещают эти данные во временной ряд db, чтобы построить некоторые диаграммы. Как InflowDB может справиться с такими сценариями? Будет ли он полностью перезаписывать файлы только для добавления?
1 ответ
Вот как я это понимаю. InfluxDB создает логическую базу данных (осколок) для каждого блока времени, для которого у него есть данные. По умолчанию длительность группы шардов составляет 1 неделю. Поэтому, если вы вставите измерения с отметками времени, например, 4 недели назад, они не повлияют на осколки последующих недель.
Внутри каждого сегмента входящие записи сначала добавляются в WAL ( журнал записи вперед), а также кэшируются в памяти. Когда WAL и кеш достаточно заполнены, они моментально копируются на диск, преобразуя их в файлы TSM (дерева слияния с структурированием по времени) уровня 0. Эти файлы доступны только для чтения, а измерения располагаются сначала по серии, а затем по времени.
По мере роста файлов TSM они сжимаются вместе, что повышает их уровень. Несколько снимков уровня 0 сжимаются для создания файлов уровня 1. Реже несколько файлов уровня 1 сжимаются для создания файлов уровня 2 и т. Д. До максимального уровня 4. Сжатие гарантирует, что файлы TSM оптимизированы для (в идеале) минимального набора серий и минимально перекрываются с другими TSM файлы. Это означает, что нужно искать меньше файлов TSM для поиска какой-либо конкретной серии / времени.
Итак, зная это, как InfluxDB пострадает при рабочей нагрузке записи со случайными временными метками? Если временные метки распределены редко, а продолжительность нашей группы шардов мала, т.е. большинство записей попадают в разные шарды, то у нас будет много шардов. Это означает, что многие почти пустые файлы данных неэффективны (эта проблема решается в их FAQ). С другой стороны, если случайные временные метки сконцентрированы в одном или двух сегментах, их файлы TSM более низкого уровня, вероятно, будут значительно перекрываться во времени, а это означает, что их нужно искать даже для запросов в узких временных диапазонах. Это повлияет на производительность чтения по таким запросам.
Более подробную информацию можно найти в этих ресурсах: