====== InfluxDB ======
База данных временных рядов (TSDB).\\
:!: Теория
Реляционные базы основаны на том что есть таблица, содержащая строки и столбцы. Таблицы обычно предназначены для определенных целей. Они эффективны, масштабируемые и т.д. Но ключевой аспект в том что они имеют **индекс**, который делает их медленными при росте данных.\\
При добавлении новых записей, при наличии индексов, СУБД будет многократно переиндексировать данные для быстрого доступа к ним => производительность со временем снижается.\\
БД временных рядов работают иначе, Данные так же хранятся в "коллекциях", но эти "коллекции" имеют общий знаменатель - они **объединены со временем**. Т.е. для каждой точки, которую вы можете сохранить, есть связанная с ней временная метка.\\
Сделан акцент на быстром приеме данных и скорость не теряется с увеличением размера БД. Используется индексация связанная со временем.\\
Присутствует встроенная т.н. **политика хранения данных**, которая позволяет очищать ненужные данные.\\
{{:databases:influxdb_1.png?direct&400 |}}
===== Теги и поля =====
:!: notes
**Поля** представляют собой непосредственно данные таблицы, вокруг которых все происходит, а теги больше носят описательный характер\\
**Теги** хранятся только в виде строк, **теги проиндексированы** поля нет, поэтому для поиска/фильтрации/группировок используются **только теги**\\
Учитывая индексацию, слишком уникальные данные не подойдут для тегов, **иначе сильно провиснет производительность**\\
**Measurement** (измерение) контейнер тегов и полей и меткой времени, по сути можно провести параллель с таблицей\\
"Серии" это вроде как записи\\
**Series** (временная шкала данных) - это "**линии данных**", комбинация измерений и тегов. **Важная метрика**, считается на **всю базу целиком**, по умолчанию установлено ограничение в **миллион** [[https://archive.docs.influxdata.com/influxdb/v1.2/administration/config/#max-series-per-database-1000000|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]
{{:databases:inflx0.png?direct&400|}}
{{:databases:inflx1.png?direct&400|}}
===== Использование =====
:!: Установка
**Подготовка сервера**\\
Для БД временных рядов важна синхронизация времени, настраиваем временную зону и ставим службу синхронизации времени\\
*В каталоге /usr/share/zoneinfo список всех возможных вариантов временных зон
\cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime
apt install chrony && sudo systemctl enable chrony
# Добавляем репозиторий
cat <
По умолчанию вход открытый, включить надо в конфиге, в блоке "http", параметр - **auth-enabled = true # Set to true**, но перед этим **создайте учетку**\\
influx
> CREATE USER admin WITH PASSWORD '' WITH ALL PRIVILEGES
> SHOW USERS
> GRANT [READ,WRITE,ALL] ON "" TO ""
> REVOKE [READ,WRITE,ALL] ON "" FROM ""
> GRANT ALL PRIVILEGES TO ""
> REVOKE ALL PRIVILEGES FROM ""
> SHOW GRANTS FOR ""
> SET PASSWORD FOR "" = ''
> DROP USER ""
>
> 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 '' WITH ALL PRIVILEGES**" и алга\\
# Авторизация агрументами
influx -username "my_username" -password "my_password"
# Права
GRANT [READ,WRITE,ALL] ON TO
# Из оболочки (отключаем историю 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 ON DURATION REPLICATION [SHARD DURATION ] [DEFAULT]
CREATE RETENTION POLICY "one_day_only" ON "water_database" DURATION 1d REPLICATION 1 SHARD DURATION 1h DEFAULT
# Чистка старых данных может длится несколько часов
ALTER RETENTION POLICY "autogen" ON 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
===== Хранение индексов =====
Схема хранения индексов "inmem"/"TSI", первая по умолчанию, в памяти, вторая с задействованием диска, для больших кардинальностей\\
Данные хранятся в "../data/", файлы "*.tsm" можно удалять, через время появляются снова\\
Содержимое\\
{{:databases:files.jpg?direct&400|}}
Для перехода нужно остановить инфлюкс, сгенерировать файлы индекса, изменить пар-р в конфиге, запустить инфлюкс. [[https://community.influxdata.com/t/correct-procedure-to-transition-to-tsi1/12213|Форум]]\\
# Команда для генерации 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 END
DROP CONTINUOUS QUERY ON
:!: Примеры
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