Предыдущая версия справа и слева
Предыдущая версия
Следующая версия
|
Предыдущая версия
|
databases:influx [2022/11/13 05:40] admin |
databases:influx [2023/10/30 13:21] (текущий) admin |
<details> | <details> |
<summary>:!: Теория </summary> | <summary>:!: Теория </summary> |
| |
Реляционные базы основаны на том что есть таблица, содержащая строки и столбцы. Таблицы обычно предназначены для определенных целей. Они эффективны, масштабируемые и т.д. Но ключевой аспект в том что они имеют **индекс**, который делает их медленными при росте данных.\\ | Реляционные базы основаны на том что есть таблица, содержащая строки и столбцы. Таблицы обычно предназначены для определенных целей. Они эффективны, масштабируемые и т.д. Но ключевой аспект в том что они имеют **индекс**, который делает их медленными при росте данных.\\ |
При добавлении новых записей, при наличии индексов, СУБД будет многократно переиндексировать данные для быстрого доступа к ним => производительность со временем снижается.\\ | При добавлении новых записей, при наличии индексов, СУБД будет многократно переиндексировать данные для быстрого доступа к ним => производительность со временем снижается.\\ |
| |
Присутствует встроенная т.н. **политика хранения данных**, которая позволяет очищать ненужные данные.\\ | Присутствует встроенная т.н. **политика хранения данных**, которая позволяет очищать ненужные данные.\\ |
| |
{{:databases:influxdb_1.png?direct&400 |}} | {{:databases:influxdb_1.png?direct&400 |}} |
</details> | </details> |
| |
| |
| |
===== Теги и поля ===== | ===== Теги и поля ===== |
| <details> |
| <summary>:!: notes </summary> |
**Поля** представляют собой непосредственно данные таблицы, вокруг которых все происходит, а теги больше носят описательный характер\\ | **Поля** представляют собой непосредственно данные таблицы, вокруг которых все происходит, а теги больше носят описательный характер\\ |
| |
**Теги** хранятся только в виде строк, **теги проиндексированы** поля нет, поэтому для поиска/фильтрации/группировок используются **только теги**\\ | **Теги** хранятся только в виде строк, **теги проиндексированы** поля нет, поэтому для поиска/фильтрации/группировок используются **только теги**\\ |
Учитывая индексацию, слишком уникальные данные не подойдут для тегов, **иначе сильно провиснет производительность**\\ | Учитывая индексацию, слишком уникальные данные не подойдут для тегов, **иначе сильно провиснет производительность**\\ |
| |
| |
**Measurement** (измерение) контейнер тегов и полей и меткой времени, по сути можно провести параллель с таблицей\\ | **Measurement** (измерение) контейнер тегов и полей и меткой времени, по сути можно провести параллель с таблицей\\ |
"Серии" это вроде как записи\\ | "Серии" это вроде как записи\\ |
| |
| |
**Series** (временная шкала данных) - это "**линии данных**", комбинация измерений и тегов. **Важная метрика**, считается на **всю базу целиком**, по умолчанию установлено ограничение в **миллион** [[https://archive.docs.influxdata.com/influxdb/v1.2/administration/config/#max-series-per-database-1000000|max-series-per-database]]\\ | **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) задается к базе, есть умолчательная, можно указывать при каждой вставке данных (видимо персонально)\\ |
| </details> |
<details> | <details> |
<summary>:!: Нагрузка (кардинальность) серий </summary> | <summary>:!: Нагрузка (кардинальность) серий </summary> |
**Серия** это комбинация измерений и тегов. Считается **на одну базу данных** рекомендуется не более 1 миллиона, регулируется переменной "max-series-per-database", как уже было сказано выше\\ | **Серия** это комбинация измерений и тегов. Считается **на одну базу данных** рекомендуется не более 1 миллиона, регулируется переменной "max-series-per-database", как уже было сказано выше\\ |
| |
Растет считай экспоненциально, например есть таблица с двумя тегами, в первом три разных значения, во втором два, **кол-во комбинаций 3 * 2 = 6**\\ | Растет считай экспоненциально, например есть таблица с двумя тегами, в первом три разных значения, во втором два, **кол-во комбинаций 3 * 2 = 6**\\ |
| |
Важный момент, кол-во не просто перемножается а используется фактическое применение, например есть понятие **"зависимые теги"**, область действия которых ограничена другим (т.е. является алиасом) и по факту ко-во **комбинаций не увеличилось**\\ | Важный момент, кол-во не просто перемножается а используется фактическое применение, например есть понятие **"зависимые теги"**, область действия которых ограничена другим (т.е. является алиасом) и по факту ко-во **комбинаций не увеличилось**\\ |
| |
<code sql> | <code sql> |
# Кардинальность текущей БД | # Кардинальность текущей БД |
</code> | </code> |
</details> | </details> |
| |
{{:databases:inflx0.png?direct&400|}} | {{:databases:inflx0.png?direct&400|}} |
{{:databases:inflx1.png?direct&400|}} | {{:databases:inflx1.png?direct&400|}} |
| |
| |
**Point** - данные одной вставки (series + timestamp)\\ | |
**Shard** - сегмент данных, относится **к физическому хранению в ОС** (TSM (Time Sort Merge Tree) Engine), рассчитывается из политики хранения, разбивается например по часу. Отвечает как за **хранение данных** в ОС так и за **операциями над ними**\\ | |
Выше уровнем, разбиваются на группы\\ | |
| |
**Хранение данных** (политика хранения, retention policy) задается к базе, есть умолчательная, можно указывать при каждой вставке данных (видимо персонально)\\ | ===== Использование ===== |
| |
| <details> |
| <summary>:!: Установка</summary> |
| |
| **Подготовка сервера**\\ |
| Для БД временных рядов важна синхронизация времени, настраиваем временную зону и ставим службу синхронизации времени\\ |
| *В каталоге /usr/share/zoneinfo список всех возможных вариантов временных зон |
| <code bash> |
| \cp /usr/share/zoneinfo/Europe/Moscow /etc/localtime |
| apt install chrony && sudo systemctl enable chrony |
| </code> |
| |
| <code bash> |
| # Добавляем репозиторий |
| 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 |
| </code> |
| |
| По умолчанию вход открытый, включить надо в конфиге, в блоке "http", параметр - **auth-enabled = true # Set to true**, но перед этим **создайте учетку**\\ |
| |
| <code bash> |
| 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 |
| </code> |
| |
| </details> |
| |
| |
===== Использование ===== | |
**Авторизация**\\ | **Авторизация**\\ |
| Сразу после установки авторизация отключена, т.к. нет пользователей, и по умолчанию "у всех все права"\\ |
| Создаем админа "**CREATE USER admin WITH PASSWORD '<password>' WITH ALL PRIVILEGES**" и алга\\ |
<code bash> | <code bash> |
# Авторизация агрументами | # Авторизация агрументами |
influx -username "my_username" -password "my_password" | influx -username "my_username" -password "my_password" |
| |
| # Права |
| GRANT [READ,WRITE,ALL] ON <database_name> TO <username> |
| |
# Из оболочки (отключаем историю bash чтобы пароль не сохранялся) | # Из оболочки (отключаем историю bash чтобы пароль не сохранялся) |
InfluxDB shell 1.8.10 | InfluxDB shell 1.8.10 |
> auth | > auth |
</code> | |
| |
| # Некоторые команды |
| SET PASSWORD FOR 'user' = 'pass'; |
| show users; |
| show grants for 'user'; |
| create user username with password 'pass'; |
| grant READ on dbname to username; |
| </code> |
| |
Как такового создания таблиц нет, создается при записи в нее\\ | Как такового создания таблиц нет, создается при записи в нее\\ |
===== Политика хранения ===== | ===== Политика хранения ===== |
Retention policies. При записи данных, можно указывать конкретную политику хранения, либо используется умолчательная.\\ | Retention policies. При записи данных, можно указывать конкретную политику хранения, либо используется умолчательная.\\ |
| Похоже что это еще и какие то измерения данных, возможно, т.к. обращение из одного в другое в continuos query не удалось\\ |
| |
<code sql> | <code sql> |
show retention policies; | show retention policies; |
| |
# Аргумент "Default" ставит ее по умолчанию | # Аргумент "Default" делает ее по умолчанию |
CREATE RETENTION POLICY "one_day_only" ON "NOAA_water_database" DURATION 23h60m REPLICATION 1 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; |
ALTER RETENTION POLICY "what_is_time" ON "NOAA_water_database" DURATION 3w SHARD DURATION 2h DEFAULT; | DROP RETENTION POLICY "15_day" ON <dn_name> |
</code> | </code> |
| |
===== Continuous query ===== | ===== Continuous query ===== |
Cмысл схож с вложенными запросами, но промежуточные метрики сохраняются и хранятся в таблице, отдельным процессом, постоянно, а не получаются "на лету" как можно было бы сделать в реляционной базе.\\ | Cмысл схож с вложенными запросами, но промежуточные метрики сохраняются и хранятся в таблице, отдельным процессом, постоянно, а не получаются "на лету" как можно было бы сделать в реляционной базе.\\ |
| |
| |
<code sql> | <code sql> |
CREATE CONTINUOUS QUERY AllLogRecords ON mgaimport | SHOW CONTINUOUS QUERIES |
| |
| CREATE CONTINUOUS QUERY <Имя объекта> ON <Имя БД> BEGIN <sql запрос> END |
| |
| DROP CONTINUOUS QUERY <cq_name> ON <database_name> |
| </code> |
| |
| |
| <details> |
| <summary>:!: Примеры</summary> |
| <code sql> |
| CREATE CONTINUOUS QUERY <Имя объекта> ON mgaimport |
BEGIN | BEGIN |
SELECT sum(counter) AS CountAllRecords INTO mgaimport.autogen.AgregatedInfo_1m FROM mgaimport.autogen.ErrImportFileProcess GROUP BY time(1m), db_name, log_type | SELECT sum(counter) AS CountExceptRecords INTO <Имя БД>.autogen.<Имя новой таблицы> FROM mgaimport.autogen.<Существующая БД> WHERE resolution = 'exception' GROUP BY time(1m), db_name, log_type |
END | 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 |
| </code> |
| |
| |
| <code sql> |
CREATE CONTINUOUS QUERY <Имя объекта> ON mgaimport | CREATE CONTINUOUS QUERY <Имя объекта> ON mgaimport |
BEGIN | BEGIN |
SELECT sum(counter) AS CountExceptRecords INTO <Имя БД>.autogen.<Имя новой таблицы> FROM mgaimport.autogen.<Существующая БД> WHERE resolution = 'exception' GROUP BY time(1m), db_name, log_type | 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 | END |
</code> | </code> |
| </details> |
| |
| |
| |
| ===== Общее ===== |
| |
| Проверку связи с сервером БД можно сделать так:\\ |
| <code bash> |
| curl -v http://10.200.192.22:8086/ping |
| </code> |
| |
| |
| |