Содержание

InfluxDB

База данных временных рядов (TSDB).

:!: Теория

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

БД временных рядов работают иначе, Данные так же хранятся в «коллекциях», но эти «коллекции» имеют общий знаменатель - они объединены со временем. Т.е. для каждой точки, которую вы можете сохранить, есть связанная с ней временная метка.

Сделан акцент на быстром приеме данных и скорость не теряется с увеличением размера БД. Используется индексация связанная со временем.

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

Теги и поля

:!: notes

Поля представляют собой непосредственно данные таблицы, вокруг которых все происходит, а теги больше носят описательный характер

Теги хранятся только в виде строк, теги проиндексированы поля нет, поэтому для поиска/фильтрации/группировок используются только теги
Учитывая индексацию, слишком уникальные данные не подойдут для тегов, иначе сильно провиснет производительность

Measurement (измерение) контейнер тегов и полей и меткой времени, по сути можно провести параллель с таблицей
«Серии» это вроде как записи

Series (временная шкала данных) - это «линии данных», комбинация измерений и тегов. Важная метрика, считается на всю базу целиком, по умолчанию установлено ограничение в миллион max-series-per-database

Point - данные одной вставки (series + timestamp)
Shard - сегмент данных, относится к физическому хранению в ОС (TSM (Time Sort Merge Tree) Engine), рассчитывается из политики хранения, разбивается например по часу. Отвечает как за хранение данных в ОС так и за операциями над ними
Выше уровнем, разбиваются на группы

Хранение данных (политика хранения, retention policy) задается к базе, есть умолчательная, можно указывать при каждой вставке данных (видимо персонально)

:!: Нагрузка (кардинальность) серий

Серия это комбинация измерений и тегов. Считается на одну базу данных рекомендуется не более 1 миллиона, регулируется переменной «max-series-per-database», как уже было сказано выше
Растет считай экспоненциально, например есть таблица с двумя тегами, в первом три разных значения, во втором два, кол-во комбинаций 3 * 2 = 6

Важный момент, кол-во не просто перемножается а используется фактическое применение, например есть понятие «зависимые теги», область действия которых ограничена другим (т.е. является алиасом) и по факту ко-во комбинаций не увеличилось

  # Кардинальность текущей БД
SHOW SERIES CARDINALITY [ON dbname]
  # В разрезе по таблицам
SHOW SERIES EXACT CARDINALITY [ON dbname]
 
  # Еще можно проверить кардинальность ключей, но вроде тоже самое (или около того)
SHOW TAG KEY CARDINALITY
SHOW TAG VALUES CARDINALITY WITH KEY = "tag1"
SHOW FIELD KEY CARDINALITY [ON dbname]
 
  # Непонятно что показывает, не общую кардинальность таблиц не одной таблицы не кол-во таблиц, хз
  # хотя есть какая то корреляция с кол-вом таблиц
SHOW MEASUREMENT CARDINALITY [ON dbname]

Использование

:!: Установка

Подготовка сервера
Для БД временных рядов важна синхронизация времени, настраиваем временную зону и ставим службу синхронизации времени
*В каталоге /usr/share/zoneinfo список всех возможных вариантов временных зон

\cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime
apt install chrony && sudo systemctl enable chrony
   # Добавляем репозиторий
cat <<EOF | sudo tee /etc/yum.repos.d/influxdata.repo
[influxdata]
name = InfluxData Repository - Stable
baseurl = https://repos.influxdata.com/stable/\$basearch/main
enabled = 1
gpgcheck = 1
gpgkey = https://repos.influxdata.com/influxdata-archive_compat.key
EOF
 
dnf update
dnf install influxdb
systemctl start/enable
open firewall

По умолчанию вход открытый, включить надо в конфиге, в блоке «http», параметр - auth-enabled = true # Set to true, но перед этим создайте учетку

influx
> CREATE USER admin WITH PASSWORD '<password>' WITH ALL PRIVILEGES
> SHOW USERS
 
> GRANT [READ,WRITE,ALL] ON "<database_name>" TO "<username>"
> REVOKE [READ,WRITE,ALL] ON "<database_name>" FROM "<username>"
> GRANT ALL PRIVILEGES TO "<username>"
> REVOKE ALL PRIVILEGES FROM "<username>"
> SHOW GRANTS FOR "<user_name>"
> SET PASSWORD FOR "<username>" = '<password>'
> DROP USER "<username>"
> 
> CREATE DATABASE
> DROP DATABASE
> DROP SERIES
> DROP MEASUREMENT
> CREATE RETENTION POLICY
> ALTER RETENTION POLICY
> DROP RETENTION POLICY
> CREATE CONTINUOUS QUERY
> DROP CONTINUOUS QUERY

Авторизация
Сразу после установки авторизация отключена, т.к. нет пользователей, и по умолчанию «у всех все права»
Создаем админа «CREATE USER admin WITH PASSWORD '<password>' WITH ALL PRIVILEGES» и алга

  # Авторизация агрументами
influx -username "my_username" -password "my_password"
 
  # Права
GRANT [READ,WRITE,ALL] ON <database_name> TO <username>
 
  # Из оболочки (отключаем историю bash чтобы пароль не сохранялся)
set +o history
influx -execute 'show databases;' -username 'admin' -password 'wswsws'
set -o history
 
  # Интерактивный режим
> influx
Connected to http://localhost:8086 version 1.8.10
InfluxDB shell 1.8.10
> auth
 
# Некоторые команды
SET PASSWORD FOR 'user' = 'pass';
show users;
show grants for 'user';
create user username with password 'pass';
grant READ on dbname to username;

Как такового создания таблиц нет, создается при записи в нее

  # Перечень баз
show databases
create database "test"
use test
 
  # Перечень таблиц
show measurements
 
  # Запись данных в таблицу (имя таблицы, два тега, поле, последнее - временная метка в ms, указывать не обязательно)
insert cpu_usage,host=server01,region=us-west value=0.64 1434055562000000000
:!: Политика хранения
show retention policies;
 
  # Создание политики хранения
CREATE RETENTION POLICY ON <retention_policy_name> ON <database_name> DURATION <duration> REPLICATION <n> [SHARD DURATION <duration> ] [DEFAULT]
CREATE RETENTION POLICY "one_day_only" ON "water_database" DURATION 1d REPLICATION 1 SHARD DURATION 1h DEFAULT 
 
  # Чистка старых данных может длится несколько часов
ALTER RETENTION POLICY "autogen" ON <dbname> DURATION 75d;
  # Размер баз
sudo du -sh /var/lib/influxdb/data/
  # Еще вроде как такой вариант есть, но хз
influx_inspect report-disk -detailed /var/lib/influxdb/data/ 

Политика хранения

Retention policies. При записи данных, можно указывать конкретную политику хранения, либо используется умолчательная.
Похоже что это еще и какие то измерения данных, возможно, т.к. обращение из одного в другое в continuos query не удалось

SHOW retention policies;
 
  # Аргумент "Default" делает ее по умолчанию
CREATE RETENTION POLICY "one_day_only" ON "NOAA_water_database" DURATION 23h60m REPLICATION 1 DEFAULT;
 
ALTER RETENTION POLICY "what_is_time" ON "NOAA_water_database" DURATION 3w SHARD DURATION 2h DEFAULT;
DROP RETENTION POLICY "15_day" ON <dn_name>

Хранение индексов

Схема хранения индексов «inmem»/«TSI», первая по умолчанию, в памяти, вторая с задействованием диска, для больших кардинальностей
Данные хранятся в «../data/», файлы «*.tsm» можно удалять, через время появляются снова

Содержимое

Для перехода нужно остановить инфлюкс, сгенерировать файлы индекса, изменить пар-р в конфиге, запустить инфлюкс. Форум

  # Команда для генерации tsi индексов
sudo -u influxdb influx_inspect buildtsi -datadir /var/lib/influxdb/data/ -waldir /var/lib/influxdb/wal/ -database dbname
 
  # Должно быть удаление файлов tsm, но не работает сцуко
sudo -u influxdb influx_inspect deletetsm -sanitize ./data/*/autogen/*/*.tsm

Continuous query

Cмысл схож с вложенными запросами, но промежуточные метрики сохраняются и хранятся в таблице, отдельным процессом, постоянно, а не получаются «на лету» как можно было бы сделать в реляционной базе.

SHOW CONTINUOUS QUERIES
 
CREATE CONTINUOUS QUERY <Имя объекта> ON <Имя БД> BEGIN <SQL запрос> END
 
DROP CONTINUOUS QUERY <cq_name> ON <database_name>
:!: Примеры
CREATE CONTINUOUS QUERY <Имя объекта> ON mgaimport
BEGIN
    SELECT SUM(counter) AS CountExceptRecords INTO <Имя БД>.autogen.<Имя новой таблицы> FROM mgaimport.autogen.<Существующая БД> WHERE resolution = 'exception' GROUP BY TIME(1m), db_name, log_type
END
 
CREATE CONTINUOUS QUERY BalancerRequestAccount_agr ON metrics
BEGIN
    SELECT COUNT("value") AS CountRequests INTO metrics."15_day".BalancerRequestAccount_agr2 FROM metrics.autogen.BalancerRequestAccount GROUP BY TIME(5m)
END
CREATE CONTINUOUS QUERY <Имя объекта> ON mgaimport
BEGIN
    SELECT SUM(counter) AS CountExceptRecords INTO <Имя БД>.autogen.<Имя новой таблицы> FROM mgaimport.autogen.<Существующая БД> WHERE resolution = 'exception' GROUP BY TIME(1m), db_name, log_type
END
 
/*Еще пример агрегации*/
CREATE CONTINUOUS QUERY BalancerRequestAccount_agr ON metrics
BEGIN
SELECT SUM("counter")
    INTO myDB.autogen.myTable_test_1m
FROM "myTable"
WHERE  TIME > now() - 5m 
   AND "errorType" =~ /^(1008|1042)$/
GROUP BY TIME(1m), field1, field2
END

Общее

Проверку связи с сервером БД можно сделать так:

curl -v http://10.200.192.22:8086/ping