Общая информация о InfluxDB

база данных
Общая информация о InfluxDB

Что такое база данных временных рядов?

Полное название базы данных временных рядов — база данных временных рядов, английское название — Time Series DataBase, аббревиатура — TSDB.

Этот тип базы данных предназначен для обработки данных временных рядов.

Так что же такое данные временного ряда? Это данные, которые непрерывно генерируются с течением времени.

Например, Activity Monitor на компьютере Mac — это данные временного ряда, которые каждые несколько секунд получают последние данные из различных частей компьютера.

image.pngimage.pngimage.pngimage.pngimage.png

Зачем нужна база данных временных рядов?

С появлением Интернета вещей и эры больших данных количество данных, генерируемых каждый день по всему миру, невообразимо. Эти данные делятся на разные типы из-за ограничений бизнес-сценариев, и каждый тип имеет разные требования к хранилищу. Трудно завершить хранение данных в различных сложных сценариях только с помощью традиционной СУБД.

В настоящее время нам необходимо выбрать разные базы данных в соответствии с требованиями различных характеристик данных и бизнес-сценариев.

Как правило, выбор используемой базы данных зависит от пяти аспектов: малое время отклика, высокая доступность, высокий уровень параллелизма, большие данные и доступная стоимость.

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

Основными представителями реляционных баз данных являются 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 может выделиться из многих баз данных временных рядов, заключается не только в ее собственной силе, но и в ее активном сообществе, разумной бизнес-модели и маркетинге.

image.png

Поскольку база данных временных рядов очень хорошая, почему рейтинг после теста такой? Причина в том, что сценариев приложений немного, а для записи мониторинга эксплуатации и технического обслуживания и данных Интернета вещей в реальном времени используется база данных временных рядов. Большинство систем хорошо поддерживаются основными базами данных, такими как 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/Вы можете посмотреть страницу.

image.png

Затем заполните информацию об инициализации, чтобы завершить инициализацию.

image.png

базовая конфигурация

Сохраняйте данные вне контейнеров Docker

Сначала создайте каталог.

mkdir influxdb_docker_data_volume && cd $_

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

docker run -d --name influxdb -p 8086:8086 --volume $PWD:/root/.influxdbv2 influxdb

Таким образом, данные в контейнере будут храниться в текущем каталоге.

записать данные

Есть два способа записи данных в InfluxDB: один — использовать клиентские библиотеки на разных языках, а другой — использовать плагины Telegraf.

Вот введение в использование клиентской библиотеки для записи данных.

На странице «Загрузить данные» есть вкладка «Источники», в которой есть две категории: «Клиентские библиотеки» и «Плагины Telegraf».

image.png

Выберите здесь язык Go, и после нажатия на него появится пример кода.

Для записи данных требуется не менее 4 основных сведений.

  1. Идентификатор организации (идентификатор организации)
  2. Сегмент (идентификатор сегмента)
  3. токен аутентификации
  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Команда может удалять данные и требует дополнительных параметров.

  1. ведро: укажите ведро данных.
  2. запуск и остановка: укажите диапазон временных меток данных для удаления.
  3. предикат: необязательный, удалить данные, соответствующие определенным условиям.

Пример:

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Вот и все.

Требуются следующие условия.

  1. Метод запроса (Метод): POST.
  2. Заголовки запроса (Headers): сAuthorizationИспользуется для проверки личности, формат запросаapplication/json.
  3. Параметры запроса (QueryParams): org/orgID с указанием организации. ведро/bucketID указывает ведро данных.
  4. Тело запроса (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.

  1. InfluxDB UI
  2. InfluxDB HTTP API
  3. Flux REPL
  4. InfluxDB CLI
  5. 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, обработке данных, визуализации данных, мониторинге оповещений, передовых практиках и т. д. будет рассказано в следующих статьях.