MatrixGate, инструмент высокопроизводительной загрузки данных

MatrixGate сокращённо называется mxgate — это инструмент высокопроизводительной загрузки данных, поставляемый вместе с MatrixDB.

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

1. Сравнение INSERT и MatrixGate

Метод записи Преимущества Недостатки Применимые сценарии
Прямой INSERT Простой интерфейс Низкая пропускная способность Низкая пропускная способность, сотни тысяч точек данных/секунду
MatrixGate Высокая пропускная способность
Стандартный режим реального времени
Требуется дополнительное развертывание, есть эксплуатационные расходы Высокая пропускная способность, десятки миллионов точек данных/секунду

2. Как использовать MatrixGate

MatrixGate предоставляет следующие режимы работы:

  • Режим сервиса
  • Командный режим

Ниже показано, как использовать эти два режима для загрузки данных в таблицу. Схема целевой таблицы dest следующая:

CREATE TABLE dest(
    time timestamp,
    c1 int,
    c2 text
)DISTRIBUTED BY(c1);

2.1 Режим сервиса

Режим сервиса предполагает наличие постоянно работающих фоновых процессов, предоставляющих пользователю HTTP-интерфейс для отправки временных рядов данных. Это распространённый способ использования в производственных средах.

2.1.1 Создание конфигурационного файла

Для использования режима сервиса сначала необходимо создать конфигурационный файл, в котором определяется информация о подключении к базе данных, целевая таблица и другие параметры:

mxgate config --db-database test \
            --db-master-host localhost \
            --db-master-port 5432 \
            --db-user mxadmin \
            --target public.dest \
            --time-format raw \
            --delimiter ',' \
            > mxgate.conf

Как определено в указанной выше команде:

Имя параметра Описание Значение
--db-database База данных test
--db-master-host Хост базы данных localhost
--db-master-port Порт базы данных 5432
--db-user Имя пользователя базы данных mxadmin
--target Целевая таблица public.dest
--time-format Формат времени raw (обычный текст)
--delimiter Разделитель ,

2.1.2 Запуск MatrixGate

Затем запустите MatrixGate, указав в параметрах запуска созданный конфигурационный файл:

mxgate start --config mxgate.conf
**********************************************************
 __  __       _        _       ____       _
|  \/  | __ _| |_ _ __(_)_  __/ ___| __ _| |_ ___
| |\/| |/ _` | __| '__| \ \/ / |  _ / _` | __/ _ \
| |  | | (_| | |_| |  | |>  <| |_| | (_| | ||  __/
|_|  |_|\__,_|\__|_|  |_/_/\_\\____|\__,_|\__\___|
  Version: 4.2.0
  Your Copy is Licensed to: yMatrix.cn; 2022-03-01; any
**********************************************************
Launching MatrixGate daemon...
MatrixGate daemon started successfully

2.1.3 Submit data

After the startup is successful, use the curl tool to send HTTP request to submit data.

In production environment, use the HTTP library supported by the programming language to submit data

The test data file rows_header.csv has been prepared, and the content is as follows:

[mxadmin@sdw2 ~]$ cat rows_header.csv
public.dest
2021-01-01 00:00:00,1,a1
2021-01-01 00:00:00,2,a2
2021-01-01 00:00:00,3,a3

When submitting data, the first row must specify the target table name, because the MatrixGate service may have multiple target tables.

Submit data:

curl http://localhost:8086/ -X POST -H 'Content-Type: text/plain' --data-binary "@rows_header.csv"

MatrixGate binds to port 8086 by default, which can be modified through configuration files.

Query the injected data:

test=# select * from dest;
        time         | c1 | c2
--------------------+-------------------------------------------------------------------------------------------------------------
 2021-01-01 00:00:00 | 11 | a11
 2021-01-01 00:00:00 | 12 | a12
 2021-01-01 00:00:00 | 13 | a13
(3 rows)

2.1.4 Operation and maintenance management

MatrixGate also provides other operation and maintenance commands for operation and maintenance management.

View Status

mxgate status
**********************************************************
 __  __       _        _       ____       _
|  \/  | __ _| |_ _ __(_)_  __/ ___| __ _| |_ ___
| |\/| |/ _` | __| '__| \ \/ / |  _ / _` | __/ _ \
| |  | | (_| | |_| |  | |>  <| |_| | (_| | ||  __/
|_|  |_|\__,_|\__|_|  |_/_/\_\\____|\__,_|\__\___|
  Version: 4.2.0
  Your Copy is Licensed to: yMatrix.cn; 2022-03-01; any
**********************************************************
PID          15146 alive
Launched At  2021-09-01 14:59:03
Up For       26 seconds
Binary       /usr/local/matrixdb-4.2.0.community/bin/mxgated
Log          /home/mxadmin/gpAdminLogs/matrixgate.2021-09-01_145904.log
Config       /home/mxadmin/mxgate.conf

You can see the service program running status, configuration files and log paths, which are used to track down problems.

Stop service

mxgate stop
**********************************************************
 __  __       _        _       ____       _
|  \/  | __ _| |_ _ __(_)_  __/ ___| __ _| |_ ___
| |\/| |/ _` | __| '__| \ \/ / |  _ / _` | __/ _ \
| |  | | (_| | |_| |  | |>  <| |_| | (_| | ||  __/
|_|  |_|\__,_|\__|_|  |_/_/\_\\____|\__,_|\__\___|
  Version: 4.2.0
  Your Copy is Licensed to: yMatrix.cn; 2022-03-01; any
**********************************************************
PID 15146 stopped

mxgate stop can stop the service.


2.2 Command Line Mode

Command line mode is used to pour data files into one go, and the process exits after the end.

It's still the data file just now. Remove the first row of the target table, only keep the data rows, and execute the following command:

cat rows.csv | mxgate --source stdin --db-database test --db-master-host localhost --db-master-port 5432 --db-user mxadmin --time-format raw --target public.dest --parallel 2  --delimiter ',' 


3. MatrixGate's UPSERT semantic support

When accessing timing data, we may face this scenario:

  • Device data is not sent at once, but is sent in batches. It needs to be merged according to the device number and timestamp as the primary key
  • Device data may be sent repeatedly, and duplicate data should be updated instead of repeated insertion

MatrixGate 4.2 version has added UPSERT semantics to solve the above problem.

3.1 Loading data using UPSERT semantics

3.1.1 Create a data table

CREATE TABLE upsert_demo (
    ts    timestamp
  , tagid int
  , c1    int
  , c2    int
  , UNIQUE(ts, tagid)
) DISTRIBUTED BY (tagid);

Note that in order for the database to use the UPSERT function, UNIQUE constraints must be created on the device id + timestamp of the table.

3.1.2 Prepare data files

upsert_demo1.dat:

2020-11-11|1|10|

upsert_demo2.dat:

2020-11-11|1||20
2020-11-11|2||100
2020-11-11|2|200|

3.1.3 Loading data files

Load upsert_demo1.dat:

cat upsert_demo1.dat|mxgate --source stdin \
  --db-database test \
  --db-master-host localhost \
  --db-master-port 5432 \
  --db-user mxadmin \
  --time-format raw \
  --delimiter "|" \
  --target upsert_demo \
  --upsert-key ts \
  --upsert-key tagid

Query results:

test=# select * from upsert_demo ;
         ts          | tagid | c1 | c2
--------------------+------+------------------------------------------------------------------------------------------------------
 2020-11-11 00:00:00 |     1 | 10 |
(1 row)

Load upsert_demo2.dat:

cat upsert_demo2.dat|mxgate --source stdin \
  --db-database test \
  --db-master-host localhost \
  --db-master-port 5432 \
  --db-user mxadmin \
  --time-format raw \
  --delimiter "|" \
  --target upsert_demo \
  --upsert-key ts \
  --upsert-key tagid

Query results:

test=# select * from upsert_demo ;
         ts          | tagid | c1  | c2
--------------------+-------------------------------------------------------------------------------------------------------------
 2020-11-11 00:00:00 |     1 |  10 |  20
 2020-11-11 00:00:00 |     2 | 200 | 100
(2 rows)

Из результатов видно, что строки с одинаковыми значениями полей ts и tagid были объединены.

3.2 Примечания по UPSERT

  • Ограничения UNIQUE и параметр --upsert-key должны полностью совпадать; порядок передачи параметров значения не имеет
  • Параметр --upsert-key должен соответствовать ограничению UNIQUE

Более подробную информацию об использовании см. в разделе MatrixGate.