Производительность загрузки данных

Представьте, что вы едете на электромобиле по автомагистрали. Сборщик данных в вашем автомобиле фиксирует 80 точек данных в секунду по 80 заранее определённым метрикам — всего 2 КБ. В течение одной минуты вы наблюдаете непрерывный поток поступающих данных и используете их для анализа текущих условий. Однако перед любым анализом эти ценные данные необходимо надёжно записать и сохранить в надёжной базе данных.

Безусловно, базы данных временных рядов должны обрабатывать огромные объёмы данных в реальном времени от множества устройств — производительность загрузки критически важна!

В этом разделе вы воспользуетесь передовыми компонентами MatrixGate и MatrixBench в YMatrix для тестирования высокопроизводительного приёма данных, обеспечивая надёжную загрузку данных для последующего анализа.

Ниже приведена конфигурация нашей тестовой аппаратной среды. Аппаратные характеристики могут повлиять на настройки инструментов — пожалуйста, скорректируйте их соответствующим образом.

1 Аппаратная среда

Конфигурация машины:

Параметр Конфигурация
Ядра процессора 2 физических ядра, 32 логических ядра
Платформа процессора Intel(R) Xeon(R) Gold 5218 CPU @ 2.30GHz
Оперативная память 256 ГБ
Объём хранилища 9.0 ТБ (запись 1.4 ГБ/с, чтение 3.3 ГБ/с)
Дистрибутив Linux CentOS Linux release 7.8.2003 (Core)
Версия ядра Linux 3.10.0-1127.el7.x86_64

2 Профессиональные инструменты

2.1 MatrixGate

MatrixGate (сокращённо mxgate) — это сервер высокопроизводительной потоковой загрузки данных, расположенный по пути bin/mxgate в директории установки YMatrix. Он полностью использует возможности параллельной обработки распределённых баз данных и является предпочтительным инструментом для загрузки данных в производственных средах.

Во время тестирования mxgate работает совместно с компонентом writer из mxbench, быстро принимая данные, генерируемые generator.

Дополнительную информацию см. в разделе mxgate.

2.2 MatrixBench

mxbench — это инструмент бенчмаркинга для загрузки и запросов к данным. Он генерирует случайные данные на основе таких параметров, как количество устройств, диапазон времени и число метрик. Инструмент может автоматически создавать таблицы и выполнять последовательную или параллельную загрузку данных и выполнение запросов.

Вы можете запускать mxbench через командную строку или задавать параметры в конфигурационном файле — выберите подходящий способ в зависимости от вашего рабочего процесса. Инструмент расположен по пути bin/mxbench в директории установки YMatrix.

3 Архитектура развертывания

Развертывание на одном сервере: мастер + 6 сегментов

Примечание!
MatrixGate и MatrixBench должны быть развернуты на той же машине, где находится кластер YMatrix.

4 Начало тестирования

4.1 Тестовые сценарии

Мы предлагаем три тестовых сценария с различным количеством метрик. В конце этого раздела представлено сравнение производительности записи YMatrix при разных масштабах метрик.

  1. 100 000 устройств, 10 метрик
  2. 100 000 устройств, 100 метрик
  3. 100 000 устройств, 1 000 метрик

4.2 Запуск тестирования

Примечание!
Перед использованием mxbench для тестирования нагрузки убедитесь, что тестовая среда готова: кластер YMatrix должен быть запущен, а переменные окружения правильно настроены. Этот шаг обязателен.
MatrixGate не требует ручной настройки — он автоматически настраивается и запускается при старте mxbench.

Инструкции по развертыванию кластера см. в разделе Развертывание кластера.
По настройке mxbench см. mxbench.

4.2.1 100 000 устройств, 10 метрик

Параметры mxbench делятся на две части: глобальные и подключаемые локальные конфигурации. Глобальные настройки включают database и global. Подключаемые компоненты — это generator, writer и benchmark.

Так как данный раздел посвящён производительности загрузки данных, здесь мы не рассматриваем инструмент запросов benchmark.
Подробности о benchmark см. в документации mxbench.

Параметр Значение по умолчанию Описание
--database Переменная окружения PGDATABASE, или postgres, если не задана Имя целевой базы данных
--db-master-port Порт экземпляра, должен соответствовать значению переменной окружения
--db-user Имя текущего пользователя Пользователь базы данных
--workspace /tmp/mxbench Каталог для CSV-файлов и файлов запросов
--watch true Включить мониторинг процесса (по умолчанию: включено)
--simultaneous-loading-and-query false Параллельная загрузка и выполнение запросов. По умолчанию false: сначала загрузка, затем запросы
--table-name (пусто) Имя целевой таблицы (обязательно)
--tag-num 25000 Количество устройств
--metrics-type float8 Тип данных метрик. Поддерживаемые типы: "int4", "int8", "float4", "float8"
--total-metrics-count 300 Общее количество метрик
--ts-start Начальная временная метка для генерируемых данных
--ts-end Конечная временная метка для генерируемых данных
--ts-step-in-second 1 Интервал между замерами метрик (в секундах)
--generator telematics Генератор случайных данных. По умолчанию — сценарий telematics. Также возможен импорт из пользовательских файлов или пропуск генерации
--generator-batch-size 1 Количество строк на устройство на одну временную метку. По умолчанию 1 (без разбиения)
--generator-disorder-ratio 0 Процент данных с нарушенным порядком (от 0 до 100). По умолчанию 0 (без задержек)
--generator-empty-value-ratio 90 Процент пустых значений в каждой строке (от 0 до 100). По умолчанию 90 (90% пустых значений)
--generator-randomness OFF Уровень случайности данных: OFF/S/M/L. По умолчанию OFF (постоянные значения). Возрастает от S → M → L
--writer http Режим записи данных. Определяет, как mxgate получает данные

Дополнительные настраиваемые параметры см. в разделе mxbench или выполните команду mxbench --help.

Выполните следующую команду, чтобы настроить и запустить mxbench. Скорректируйте параметры в соответствии со своей средой. Поскольку mxgate и mxbench находятся на одной машине, использование stdin позволяет избежать сетевых накладных расходов за счёт использования каналов Linux — это легковесно и эффективно.

[mxadmin@mdw ~]$ mxbench run \
  --db-database "load_test" \
  --db-database "load_test" \
  --db-master-port 5432 \
  --db-master-host "mdw" \
  --db-user "mxadmin" \
  --workspace "/tmp/mxbench/workspace" \
  --watch \
  --simultaneous-loading-and-query \
  --table-name "test_table" \
  --tag-num 100000 \
  --metrics-type "float8" \
  --total-metrics-count 10 \
  --ts-start "2022-04-19 00:00:00" \
  --ts-end "2022-04-19 00:01:00" \
  --generator "telematics" \
  --generator-batch-size 1 \
  --generator-disorder-ratio 0 \
  --generator-empty-value-ratio 0 \
  --generator-randomness "OFF" \
  --writer "stdin" 

Если --watch не отключён, обновления хода выполнения будут появляться каждые 5 секунд. По завершении вы увидите сводку вроде:

┌───────────────────────────────────────────────────────┐
│             Summary Report for STDIN Writer            │
├─────────────────────────────────┬─────────────────────┤
│ start time:                     │ 2022-07-21 15:14:08 │
├─────────────────────────────────┼─────────────────────┤
│ stop time:                      │ 2022-07-21 15:14:27 │
├─────────────────────────────────┼─────────────────────┤
│ size written to MxGate (bytes): │ 695333400           │
├─────────────────────────────────┼─────────────────────┤
│ lines inserted:                 │ 6000000             │
├─────────────────────────────────┼─────────────────────┤
│ compress ratio:                 │ 5.399120 : 1        │
└─────────────────────────────────┴─────────────────────┘  

Расшифровка отчёта записи:

Параметр Описание
start time Время начала загрузки данных
stop time Время окончания загрузки данных
size written to MxGate (bytes) Общий объём отправленных в mxgate байтов
lines inserted Количество вставленных строк
compress ratio Коэффициент сжатия: отношение исходного объёма входных данных к фактическому размеру таблицы в базе данных

Фактическое время выполнения зависит от общего объёма данных и производительности машины. Пока включён --watch, каждые 5 секунд будет выводиться информация о ходе выполнения, позволяя отслеживать скорость и продолжительность записи.

Примечание!
mxbench выполняется непрерывно до полной загрузки всех данных от ts-start до ts-end. Вы можете нажать Ctrl+C, чтобы прервать выполнение досрочно.

Если длинные команды вызывают неудобства, создайте конфигурационный файл mxbench.conf, поместите в него параметры и выполните:

[mxadmin@mdw ~]$ mxbench --config mxbench.conf

Примечание!
Во время загрузки данных может возникнуть «зависание» — логи продолжают поступать, но реального прогресса нет. Не паникуйте. Выполните следующую команду для проверки логов и диагностики: cd ~/gpAdminLogs/.

4.2.2 100 000 устройств, 100 метрик

[mxadmin@mdw ~]$ mxbench run \
  --db-database "load_test" \
  --db-master-port 5432 \
  --db-master-host "mdw" \
  --db-user "mxadmin" \
  --workspace "/tmp/mxbench/workspace" \
  --watch \
  --simultaneous-loading-and-query \
  --table-name "test_table2" \
  --tag-num 100000 \
  --metrics-type "float8" \
  --total-metrics-count 100 \
  --ts-start "2022-04-19 00:00:00" \
  --ts-end "2022-04-19 00:01:00" \
  --generator "telematics" \
  --generator-batch-size 1 \
  --generator-disorder-ratio 0 \
  --generator-empty-value-ratio 0 \
  --generator-randomness "OFF" \
  --writer "stdin" 

Результат:

┌───────────────────────────────────────────────────────┐
│             Summary Report for STDIN Writer            │
├─────────────────────────────────┬─────────────────────┤
│ start time:                     │ 2022-07-21 15:19:48 │
├─────────────────────────────────┼─────────────────────┤
│ stop time:                      │ 2022-07-21 15:21:02 │
├─────────────────────────────────┼─────────────────────┤
│ size written to MxGate (bytes): │ 5555333400          │
├─────────────────────────────────┼─────────────────────┤
│ lines inserted:                 │ 6000000             │
├─────────────────────────────────┼─────────────────────┤
│ compress ratio:                 │ 25.519937 : 1       │
└─────────────────────────────────┴─────────────────────┘

4.2.3 100 000 устройств, 1 000 метрик

[mxadmin@mdw ~]$ mxbench run \
  --db-database "load_test" \
  --db-master-port 5432 \
  --db-master-host "mdw" \
  --db-user "mxadmin" \
  --workspace "/tmp/mxbench/workspace" \
  --watch \
  --simultaneous-loading-and-query \
  --table-name "test_table3" \
  --tag-num 100000 \
  --metrics-type "float8" \
  --total-metrics-count 1000 \
  --ts-start "2022-04-19 00:00:00" \
  --ts-end "2022-04-19 00:01:00" \
  --generator "telematics" \
  --generator-batch-size 1 \
  --generator-disorder-ratio 0 \
  --generator-empty-value-ratio 0 \
  --generator-randomness "OFF" \
  --writer "stdin" 

Результат:

┌───────────────────────────────────────────────────────┐
│             Summary Report for STDIN Writer            │
├─────────────────────────────────┬─────────────────────┤
│ start time:                     │ 2022-07-21 15:22:27 │
├─────────────────────────────────┼─────────────────────┤
│ stop time:                      │ 2022-07-21 15:33:40 │
├─────────────────────────────────┼─────────────────────┤
│ size written to MxGate (bytes): │ 54305333400         │
├─────────────────────────────────┼─────────────────────┤
│ lines inserted:                 │ 6000000             │
├─────────────────────────────────┼─────────────────────┤
│ compress ratio:                 │ 47.488209 : 1       │
└─────────────────────────────────┴─────────────────────┘

На основе приведённых выше отчётов записи ниже представлен график для наглядного сравнения. На нём показана мощная производительность загрузки данных в YMatrix и её масштабируемость при увеличении числа метрик — это поможет вам принимать обоснованные решения о допустимом числе метрик в реальных развертываниях.

load_performance line

Данные временных рядов состоят из помеченных временными метками точек — каждая представляет значение метрики в конкретный момент времени. Без временных меток это не являются данными временных рядов. Понимание структуры точек данных помогает интерпретировать график.

По оси X показаны различные масштабы метрик (total-metrics-count). По оси Y — пропускная способность записи, то есть количество точек данных, записываемых в секунду. При увеличении числа метрик пропускная способность записи быстро растёт, но в конечном итоге достигает плато из-за увеличения объёма данных.

Тем не менее, YMatrix достигает производительности записи на уровне миллионов операций в секунду. Вместо мучительной построчной вставки с помощью INSERT, почему бы не ускориться вместе с YMatrix на шоссе данных?