Статьи

Глубокое погружение в InfluxDB

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

Я забочусь о временных рядах по разным причинам. С внедрением гибких методологий, облачных вычислений и DevOps мы теперь можем быстрее разрабатывать новые функции. Это замечательно, но это означает, что сейчас, как никогда, нам нужно понять, как ведет себя наше приложение и как конкретное изменение кода влияет на наши системы (отрицательно или положительно).

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

InfluxDB — это база данных, написанная на Go, чтобы помочь вам работать именно с данными временных рядов. Временной ряд — это набор точек, каждая из которых содержит метку времени. В InfluxDB временная метка может храниться с наносекундными интервалами. На практике мы можем увидеть что-то вроде этого:

1
2
3
cpu_usage value=49 1502043216
cpu_usage value=50 1502193042
cpu_usage value=5 1502196258

Итак, зачем нам определенное хранилище для временных рядов? Почему мы не можем использовать традиционные базы данных, такие как MySQL, Cassandra, MongoDB или Elasticsearch? Чтобы ответить на эти вопросы, вы должны рассмотреть ваш вариант использования. Существуют различные тесты InfluxDB по сравнению с другими базами данных, и вы можете быстро увидеть, что InfluxDB превосходит их все.

Но дело не только в производительности; Временные ряды — это особый домен, а InfluxDB как база данных временных рядов предоставляет различные возможности для работы со временем. Это, наверное, самая важная причина для использования InfluxDB.

InfluxDB предлагает мощный движок и две точки входа для взаимодействия с ним. Он поддерживает HTTP API, который по умолчанию работает на порте 8086 с возможностью чтения и записи. И он поддерживает UDP как протокол записи.

Модель данных

Модель данных — это структура данных, которыми манипулирует и управляет InfluxDB. Вы можете увидеть measurement в виде таблицы, которая содержит набор точек, которые обычно находятся в одном домене. Каждая точка помечена tags и fields .

Мы называем набор тегов tagset . Основным отличием tags fields является индекс. tags индексируются, а fields нет. Индексирование tags позволяет вам делать оптимизированные запросы с меньшим потреблением ресурсов. И tag и field являются ключевыми значениями, но tag принимает строки, где fields принимают целые числа и числа с плавающей запятой.

У каждой точки есть время; мы называем это timestamp . Мы используем протокол, называемый линейным протоколом, для описания этой модели данных:

1
measurement,tag=value,tag1=value1 field=value,field1=value1 timestamp

На практике точка выглядит так:

1
h2o_feet,location=coyote_creek water_level=8.120,level\ description="between 6 and 9 feet" 1439856000

Отметка времени не является обязательной, поскольку InfluxDB добавит ее, если она не указана.

Понимание модели InfluxDB важно для создания быстрой структуры вокруг вашего набора данных. Комбинация .measurement + tagset называется серией. Чтобы определить конкретную точку, правильной комбинацией является measurment + tagset + timestamp .

Чтобы сохранить низкий уровень мощности и повысить производительность вашего экземпляра InfluxDB, вы должны поддерживать минимальное количество серий.

Зарегистрируй бесплатный аккаунт Codeship

TCP против UDP

Вы знаете разницу между TCP и UDP, так почему же InfluxDB поддерживает оба? Как выбрать правильный вариант для вашего случая использования?

Чтобы ответить на этот вопрос, вам нужно подумать о ключевых различиях между этими двумя протоколами: UDP не гарантирует успешность запроса. Применительно к InfluxDB клиент не знает, успешно ли сохранены точки в InfluxDB. Если вы храните конфиденциальные данные, вы, вероятно, должны быть на 100 процентов уверены, что все точки есть. С другой стороны, если для вас не важно хранить все точки, вы можете использовать UDP. Например, если вы используете процессор, вы можете пропустить момент, пока поведение не станет читабельным и понятным.

UDP предпочтителен в случае, если есть проблема с вашим сервером InfluxDB. В этом случае ваше приложение будет продолжать работать, потому что UDP не собирается отправлять сбой обратно в приложение. Вы можете потерять все очки, но если вы счастливы, что мониторинг отключен, а приложение все еще работает, это может быть полезным дизайном.

Кстати, для ясности, UDP работает быстрее и использует меньше ресурсов, чем TCP. Чтобы дать вам представление, мы сделали тест с php-sdk, разработанным Corley SRL :

1
2
3
4
5
Corley\Benchmarks\Influx DB\AdapterEvent
    Method Name                Iterations    Average Time      Ops/second
    ------------------------  ------------  --------------    -------------
    sendDataUsingHttpAdapter: [1,000     ] [0.0026700308323] [374.52751]
    sendDataUsingUdpAdapter : [1,000     ] [0.0000436344147] [22,917.69026]

Приток CLI

С InfluxDB есть CLI, названный influx ; если вы установите его через apt, yum или Docker, вы найдете его в своей системе. CLI является точкой входа по умолчанию. Вы можете делать все оттуда — вставлять точки, запрашивать и управлять доступом к базе данных. Он использует REST API для связи с InfluxDB.

Query Engine

InfluxDB использует SQL-подобный язык запросов. Это немного спорное, и есть много внутренних разговоры о том, где взять это в следующей версии.

Преимущество этого языка запросов — процесс адаптации. Это очень просто, так как многие люди знают SQL, но для сложных запросов иногда он выглядит слишком сложным и сложным для манипулирования. Вот почему команда InfluxDB думает о другом решении. Я надеюсь в скором времени поделиться с вами этой новой идеей!

1
SELECT * FROM measurement WHERE time > now() - 1h LIMIT 10000

Политика удержания

Число сохраняемых серий и точек быстро растет, что характерно для мониторинга, когда вы постоянно собираете и храните данные. В какой-то момент производительность чтения станет проблемой.

С другой стороны, если вам не нужно хранить все ваши данные в InfluxDB навсегда, есть функция, называемая retention policy . По умолчанию он хранит ваши данные вечно, но вы можете изменить их. Если вы установите retention policy на две недели, все точки, сохраненные с этим хранением, будут удалены через две недели.

Это поможет вам автоматически поддерживать ваш InfluxDB в чистоте и быстро работать. Вы можете иметь несколько политик хранения, работающих в одной базе данных для разных серий. Вам просто нужно указать их.

1
curl -i -XPOST 'http://localhost:8086/write?db=mydb&rb=myretention' --data-binary 'cpu_load_short,host=server01,region=us-west value=0.64 1434055562000000000'

С помощью параметров запроса rb вы можете переопределить политику хранения по default .

Опубликовано на Java Code Geeks с разрешения Джанлуки Арбеццано, партнера нашей программы JCG. Смотрите оригинальную статью здесь: глубокое погружение в InfluxDB

Мнения, высказанные участниками Java Code Geeks, являются их собственными.