Что такое база данных временных рядов?
Полное название базы данных временных рядов — база данных временных рядов, английское название — Time Series DataBase, аббревиатура — TSDB.
Этот тип базы данных предназначен для обработки данных временных рядов.
Так что же такое данные временного ряда? Это данные, которые непрерывно генерируются с течением времени.
Например, Activity Monitor на компьютере Mac — это данные временного ряда, которые каждые несколько секунд получают последние данные из различных частей компьютера.
Зачем нужна база данных временных рядов?
С появлением Интернета вещей и эры больших данных количество данных, генерируемых каждый день по всему миру, невообразимо. Эти данные делятся на разные типы из-за ограничений бизнес-сценариев, и каждый тип имеет разные требования к хранилищу. Трудно завершить хранение данных в различных сложных сценариях только с помощью традиционной СУБД.
В настоящее время нам необходимо выбрать разные базы данных в соответствии с требованиями различных характеристик данных и бизнес-сценариев.
Как правило, выбор используемой базы данных зависит от пяти аспектов: малое время отклика, высокая доступность, высокий уровень параллелизма, большие данные и доступная стоимость.
Существует много типов баз данных, давайте возьмем несколько распространенных типов, чтобы сравнить их характеристики.
Основными представителями реляционных баз данных являются MySQL, Oracle и т. д. Преимущество состоит в том, что они обладают характеристиками ACID, а возможности во всех аспектах относительно сбалансированы. Недостатком является посредственная производительность запросов, вставок и изменений.
Основными базами данных KV являются Redis, Memcached и т. д. Преимуществами являются простота хранения и чрезвычайно высокая производительность чтения и записи. Недостатком является то, что стоимость хранения очень высока, и он не подходит для хранения больших объемов данных.
Самая популярная база данных документов — MongoDB.По сравнению с MySQL, она имеет гибкую структуру данных и лучше подходит для хранения больших объемов данных.Он имеет высокую производительность чтения и записи в сценарии больших данных. Недостаток в том, что он займет много места.
Самая популярная база данных поисковой системы — ElasticSearch, которая очень хороша для полнотекстового поиска и сложных запросов, имеет чрезвычайно высокую производительность и естественно кластеризована. Недостатком является низкая производительность записи, невозможность изменения типа поля и серьезное потребление аппаратных ресурсов.
База данных временных рядов изначально была создана в значительной степени для сравнения с MongoDB, потому что до появления баз данных временных рядов область хранения данных временных рядов всегда была занята MongoDB.
InfluxData, компания InfluxDB, первого брата базы данных временных рядов, опубликовала в 2018 году статью оБлог InfluxDB и MongoDB. В статье для сравнения используются InfluxDB v1.7.2 и MongoDB v4.0.4, и делается вывод, что InfluxDB в 2,4 раза быстрее, чем MongoDB. Конечно, надежность подлежит рассмотрению.
Короче говоря, характеристики баз данных временных рядов: непрерывная высокопроизводительная запись, высокопроизводительные запросы, низкая стоимость хранения, поддержка больших временных шкал и эластичность.
Почему стоит выбрать InfluxDB?
Хотя базы данных временных рядов появились еще в 2013 г., по-настоящему популярными они стали очень поздно, и лишь в 2017 и 18 гг. самая продвинутая InfluxDB также занимает лишь 28-е место.
Причина выбора InfluxDB довольно проста, так как в настоящее время это самая популярная база данных временных рядов.
Причина, по которой InfluxDB может выделиться из многих баз данных временных рядов, заключается не только в ее собственной силе, но и в ее активном сообществе, разумной бизнес-модели и маркетинге.
Поскольку база данных временных рядов очень хорошая, почему рейтинг после теста такой? Причина в том, что сценариев приложений немного, а для записи мониторинга эксплуатации и технического обслуживания и данных Интернета вещей в реальном времени используется база данных временных рядов. Большинство систем хорошо поддерживаются основными базами данных, такими как MySQL, MongoDB и Redis.
Помимо InfluxDB, есть еще несколько популярных баз данных временных рядов, например, TimeScaleDB на базе PostgreSQL, которая на данный момент занимает 97-е место. OpenTSDB на базе HBase, 122 место. KairosDB, основанная на Cassandra, в настоящее время занимает 201-е место.
Введение в InfluxDB
InfluxDB — это база данных с открытым исходным кодом, открытая InfluxData в 2013 году. Она предназначена для хранения большого объема данных с отметками времени в таких сценариях, как устройства IoT, а также эксплуатация и обслуживание DevOps.
Исходный код InfluxDB написан на языке Go.В версии InfluxDB OSS метод развертывания разделен на две версии: автономную версию и версию кластера. Автономная версия с открытым исходным кодом, в настоящее время находится вgithub21к+ звезд на нем. Кластерная версия имеет закрытый исходный код и идет по коммерческому маршруту.
Лично я считаю автономную версию InfluxDB безвкусной. Потому что, как только вы решите использовать InfluxDB, объем данных должен достичь определенного высокого уровня. В этом случае необходимо использовать версию кластера. А когда объем данных недостаточно велик, у InfluxDB не будет явных преимуществ перед MongoDB или ElasticSearch.
Учитывая стоимость обучения и сложность начала работы, InfluxDB1.x использует SQL-подобный язык InfluxQL для управления данными. Альфа-версия InfluxDB 2.0 была выпущена в январе 2019 года. Под влиянием JavaScript, самого популярного языка сценариев в 2018 году, запущен новый язык запросов Flux. А в конце 2020 года была запущена официальная версия InfluxDB 2.0, которая разделена на две серии: InfluxDB Cloud в облачном режиме и InfluxDB OSS, развернутые независимо.
Flux не является языком сценариев запросов, привязанным к InfluxDB, это независимый проект, полный по Тьюрингу, простой в обработке данных, который также может использоваться вне InfluxDB.
Поскольку популярность InfluxDB невысока, и вскоре будет запущена версия 2.0, многие материалы, связанные с InfluxDB, которые ищут в Китае, касаются содержания 1.x, и ссылка не имеет смысла.Официальная документация InfluxDB. Все содержание этой статьи основано на версии InfluxDB OSS 2.0.
ТИК и InfluxDB
TICK — это аббревиатура набора компонентов платформы InfluxData, представляющая четыре основных компонента: Telegraf (сборщик данных), InfluxDB (база данных временных рядов), Chronograf (визуальный пользовательский интерфейс) и Kapacitor (служба мониторинга).
Видение InfluxData состоит в том, чтобы помочь людям обрабатывать данные временных рядов.Недостаточно полагаться на базу данных временных рядов, но также решить ряд проблем, вызванных самими данными временных рядов. Поэтому InfluxData решила спроектировать и разработать TICK.
Сначала языком сценариев Kapacitor был TICKScript, но им было непросто пользоваться, и многие участники сообщества критиковали его. Отсюда Флюс. Flux более функционален, чем InfluxQL, и проще в использовании, чем TICKScript.
С постепенным развитием Flux объем возможностей InfluxDB постепенно расширялся.
Базовые концепты
Концепция модели данных InfluxDB немного отличается от концепции RDBMS.Ниже приведена таблица сравнения концепций с MySQL.
InfluxDB | MySQL | объяснять |
---|---|---|
Buckets | Database | Ведро данных — база данных, то есть пространство имен, в котором хранятся данные. |
Measurement | Table | Метрики - табл. |
Point | Record | Точка данных - запись. |
Field | Field | Поля, которые не индексируются. |
Tag | Index | Индексированное поле установлено. |
Установить и развернуть
Существует несколько способов установки, вот как использовать Docker для установки.
Сначала извлеките образ из Docker:
docker pull influxdb
Затем быстро создайте контейнер:
docker run -d --name influxdb -p 8086:8086 influxdb
Доступ после успешного запускаhttp://127.0.0.1:8086/Вы можете посмотреть страницу.
Затем заполните информацию об инициализации, чтобы завершить инициализацию.
базовая конфигурация
Сохраняйте данные вне контейнеров Docker
Сначала создайте каталог.
mkdir influxdb_docker_data_volume && cd $_
Запустите команду запуска в этом каталоге и добавьте параметр громкости.
docker run -d --name influxdb -p 8086:8086 --volume $PWD:/root/.influxdbv2 influxdb
Таким образом, данные в контейнере будут храниться в текущем каталоге.
записать данные
Есть два способа записи данных в InfluxDB: один — использовать клиентские библиотеки на разных языках, а другой — использовать плагины Telegraf.
Вот введение в использование клиентской библиотеки для записи данных.
На странице «Загрузить данные» есть вкладка «Источники», в которой есть две категории: «Клиентские библиотеки» и «Плагины Telegraf».
Выберите здесь язык Go, и после нажатия на него появится пример кода.
Для записи данных требуется не менее 4 основных сведений.
- Идентификатор организации (идентификатор организации)
- Сегмент (идентификатор сегмента)
- токен аутентификации
- Адрес базы данных (URL-адрес InfluxDB)
Существует два формата данных для записи данных, первый — это формат линейного протокола InfluxDB.
InfluxDB Line Protocol
Полный код выглядит следующим образом:
package main
import (
"fmt"
influxdb2 "github.com/influxdata/influxdb-client-go/v2"
)
func main() {
// You can generate a Token from the "Tokens Tab" in the UI
const token = "vgqVL_p-qbSpQO0DIzU4QcRgaEyQM-wcEmK2cOkDUHAiQYwLOba7qEZr9Xcq3YvZ2UH-ovu9RG7XkMwChO6eeA=="
const bucket = "test"
const org = "lzq"
client := influxdb2.NewClient("http://127.0.0.1:8086", token)
// always close client at the end
defer client.Close()
// get non-blocking write client
writeAPI := client.WriteAPI(org, bucket)
// write line protocol
writeAPI.WriteRecord(fmt.Sprintf("stat,unit=temperature avg=%f,max=%f", 23.5, 45.0))
writeAPI.WriteRecord(fmt.Sprintf("stat,unit=temperature avg=%f,max=%f", 22.5, 45.0))
// Flush writes
writeAPI.Flush()
}
Протокол линии InfluxDB — это, по сути, строка с согласованным форматом. Из этой строки формируется запись, которая должна содержать измерение и набор полей, а также может содержать N тегов и метку времени.
Без метки времени InfluxDB использует текущее системное время своего хоста, которое по умолчанию составляет наносекунды.
Data Point
Другой формат данных точки данных (Data Point).
Этот формат далее делится на две разновидности API.
Первый стиль — это функция, передающая N аргументов.
Образец кода:
p := influxdb2.NewPoint("stat",
map[string]string{"unit": "temperature"},
map[string]interface{}{"avg": 24.5, "max": 45},
time.Now())
// write point asynchronously
writeAPI.WritePoint(p)
Второй стиль — это DSL-подобный API.
код показывает, как показано ниже:
// create point using fluent style
p = influxdb2.NewPointWithMeasurement("stat").
AddTag("unit", "temperature").
AddField("avg", 23.2).
AddField("max", 45).
SetTime(time.Now())
// write point asynchronously
writeAPI.WritePoint(p)
удалить данные
InfluxDB не поддерживает изменение данных, но может удалять данные.
Существует два способа удаления данных: один — интерфейс командной строки InfluxDB, другой — HTTP API.
InfluxDB CLI
бегатьinflux delete
Команда может удалять данные и требует дополнительных параметров.
- ведро: укажите ведро данных.
- запуск и остановка: укажите диапазон временных меток данных для удаления.
- предикат: необязательный, удалить данные, соответствующие определенным условиям.
Пример:
influx delete --bucket example-bucket \
--start 2020-03-01T00:00:00Z \
--stop 2020-11-14T00:00:00Z
Пример с условием:
influx delete --bucket example-bucket \
--start '1970-01-01T00:00:00Z' \
--stop $(date +"%Y-%m-%dT%H:%M:%SZ") \
--predicate '_measurement="example-measurement" AND exampleTag="exampleTagValue"'
HTTP API
Аналогично способу CLI. перечислитьapi/v2/delete
Вот и все.
Требуются следующие условия.
- Метод запроса (Метод): POST.
- Заголовки запроса (Headers): с
Authorization
Используется для проверки личности, формат запросаapplication/json
. - Параметры запроса (QueryParams): org/orgID с указанием организации. ведро/bucketID указывает ведро данных.
- Тело запроса (Body): start: указывает время начала, stop: указывает время окончания, predicate (необязательно): указывает условие удаления.
Пример запроса:
curl --request POST http://localhost:8086/api/v2/delete/?org=example-org&bucket=example-bucket \
--header 'Authorization: Token <YOURAUTHTOKEN>' \
--header 'Content-Type: application/json' \
--data '{
"start": "2020-03-01T00:00:00Z",
"stop": "2020-11-14T00:00:00Z"
}'
Я не рекомендую удалять данные в InfluxDB.
Базы данных временных рядов больше подходят для хранения полных исходных данных, тогда как данные с более высокой ценностью после анализа и уточнения могут храниться в MongoDB или MySQL.
читать данные
Существует 5 способов чтения данных InfluxDB.
- InfluxDB UI
- InfluxDB HTTP API
- Flux REPL
- InfluxDB CLI
- Client libraries
Здесь представлен пятый метод, использующий метод на стороне клиента для чтения данных.
Вот демонстрация кода:
client := influxdb2.NewClient(url, token)
defer client.Close()
query := fmt.Sprintf("from(bucket:\"%v\")|> range(start: -1h) |> filter(fn: (r) => r._measurement == \"stat\")", bucket)
// Get query client
queryAPI := client.QueryAPI(org)
// get QueryTableResult
result, err := queryAPI.Query(context.Background(), query)
if err == nil {
// Iterate over query response
for result.Next() {
// Notice when group key has changed
if result.TableChanged() {
fmt.Printf("table: %s\n", result.TableMetadata().String())
}
// Access data
fmt.Printf("value: %v\n", result.Record().Value())
}
// check for an error
if result.Err() != nil {
fmt.Printf("query parsing error: %\n", result.Err().Error())
}
} else {
panic(err)
}
Ключом является строковая переменная с именем query в строке 3, представляющая собой сценарий, написанный с использованием синтаксиса потока.
from(bucket:"test")
|> range(start: -1h)
|> filter(fn: (r) => r._measurement == "stat")
from
Указывает, из какого источника данных извлекать данные.
range
означает фильтрацию данных по временному диапазону. start: -1 означает текущее время минус 1 час.
filter
Представляет пользовательское условие фильтра, где fn — это функция, а правила определены в функции Синтаксис очень похож на функцию фильтра Array в JavaScript.
|>
Представляет символ перехода по конвейеру, передавая данные следующей операции в виде конвейера.
Из-за нехватки места здесь кратко представлены концепции и основные принципы использования InfluxDB 2.0. Подробнее об архитектуре InfluxDB, Flux, обработке данных, визуализации данных, мониторинге оповещений, передовых практиках и т. д. будет рассказано в следующих статьях.