====== 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