时序数据库要接入大量设备的实时数据,加载性能至关重要,本节将带大家做数据接入性能测试,来感受MatrixDB强大的加载性能。

1 硬件环境

机器配置如下:

参数 配置
cpu核数 2物理核 32逻辑核
内存 256GB
CPU平台 Intel(R) Xeon(R) Gold 5218 CPU @ 2.30GHz
储存大小 9.0TB(1.4 GB/秒写入,3.3 GB/秒读取)
linux发行版 CentOS Linux release 7.8.2003 (Core)
linux内核 3.10.0-1127.el7.x86_64

2 相关工具

2.1 MatrixGate

MatrixGate简称mxgate,是MatrixDB自研的高性能流式数据加载服务器,位于MatrixDB安装目录下的bin/mxgate。该工具会充分发挥分布式数据库的并行处理性能,是生产环境中做数据加载的必选工具。

启动matrixgate:

mxgate config --db-master-port 5432 --db-database demo > ~/mxgate.conf
mxgate start --config ~/mxgate.conf

其中--db-database为连接的数据库名称,--db-master-port为master的端口号。

原理与更详细的使用方法请参考MatrixGate

2.2 MatrixBench

MatrixBench简称mxbench,是MatrixDB流式数据加载服务压测和数据模拟工具,可以根据给定的设备数量、指标数量等快速生成随机数据,经由MatrixGate,高速插入MatrixDB数据库中。该工具位于MatrixDB安装目录下的bin/mxbench。

原理与更详细的使用方法请参考MatrixBench

3 部署方式

MatrixDB:单机部署,master + 6个segment

MatrixGate,MatrixBench与MatrixDB部署在同一台机器上。

4 开始测试

4.1 测试用例

  1. 10w设备,10列
  2. 10w设备,50列
  3. 10w设备,100列
  4. 10w设备,400列

因为测试表中列数很多,所以使用UDF来自动创建,UDF定义如下:

create or replace function f(name, int, text) returns void as $$  
declare  
  res text := 'ts timestamp,tag_id integer,';  
begin  
  for i in 1..$2 loop
  res := res||'c'||i||' integer,';  
  end loop;  
  res := rtrim(res, ',');  
  if $3 = 'ao_col' then  
    res := 'create table '||$1||'('||res||') with(appendonly=true, blocksize=8192, compresstype=zstd, orientation=column) DISTRIBUTED BY (tag_id)';  
  elsif $3 = 'ao_row' then  
    res := 'create table '||$1||'('||res||') with(appendonly=true, blocksize=8192, orientation=row) DISTRIBUTED BY (tag_id)';  
  elsif $3 = 'heap_row' then  
    res := 'create table '||$1||'('||res||') with(appendonly=false) DISTRIBUTED BY (tag_id)';  
  else  
    raise notice 'use ao_col, ao_row, heap_row as $3';  
    return;  
  end if;  
  execute res;  
end;  
$$ language plpgsql; 

使用如上UDF创建4张分别包含10列,50列,100列,400列的整型类型的heap测试表:

select f('sensor_data_10', 10, 'heap_row');
select f('sensor_data_50', 50, 'heap_row');
select f('sensor_data_100', 100, 'heap_row');
select f('sensor_data_400', 400, 'heap_row');

4.2 开始测试

使用mxbench进行测试:

4.2.1 10w设备 10列

mxbench常用参数说明如下:

参数名 参数值 参数含义
--table-name tableName 必须指定一个目标表名
--database 默认postgres 目标数据库名
--batch-size 默认1000 每个连接每次请求包含的数据行数
--tag-range 默认50000 加载数据的目标设备数目
--columns-per-row 默认100 加载数据每行的列数
--column-data-type 默认simple 数据表中指标列类型,当前支持simple单值类型,如float/int,和复合类型json、array
--point-data-type 默认float8 当--column-data-type为复合类型JSON、ARRAY时,Column内每个指标值的数值类型,支持int、float4、float8
[mxadmin@mdw ~]$ mxbench --database demo --table-name sensor_data_10 --columns-per-row 10 --tag-range 100000 --column-data-type simple --batch-size 80659 --point-data-type int

31036-03-31 12:03:43: sent OK: 48718036, ERR 0, Lat 739.54ms last10s 739.54ms, Row/s: 4871803, last10s 4871803
31036-03-31 12:03:53: sent OK: 90499398, ERR 0, Lat 828.65ms last10s 932.54ms, Row/s: 4524969, last10s 4178136
31036-03-31 12:04:03: sent OK: 134055258, ERR 0, Lat 801.38ms last10s 744.72ms, Row/s: 4468508, last10s 4355586
31036-03-31 12:04:13: sent OK: 174546076, ERR 0, Lat 884.81ms last10s 1161.03ms, Row/s: 4363651, last10s 4049081
31036-03-31 12:04:23: sent OK: 228587606, ERR 0, Lat 841.72ms last10s 702.56ms, Row/s: 4571752, last10s 5404153

mxbench输出解读:

参数名 参数含义
OK 成功发送和插入的总数据行数
ERR 总错误数据
Lat 启动后的平均延迟
Lat后的last10s 最近10秒的平均延迟
Row/s 启动后的平均每秒发送的行数
Row/s后的last10s 最近10秒的平均发送行数

mxbench启动后会持续压测,直到用户按ctrl-c结束运行退出。

4.2.2 10w设备 50列

[mxadmin@mdw ~]$ mxbench --database demo --table-name sensor_data_50 --columns-per-row 50 --tag-range 100000 --column-data-type simple --batch-size 19784 --point-data-type int

31036-03-31 12:06:58: sent OK: 13235496, ERR 0, Lat 564.96ms last10s 564.96ms, Row/s: 1323549, last10s 1323549
31036-03-31 12:07:08: sent OK: 28429608, ERR 0, Lat 563.19ms last10s 561.64ms, Row/s: 1421480, last10s 1519411
31036-03-31 12:07:18: sent OK: 42377328, ERR 0, Lat 595.10ms last10s 660.14ms, Row/s: 1412577, last10s 1394772
31036-03-31 12:07:28: sent OK: 48431232, ERR 0, Lat 738.76ms last10s 1744.37ms, Row/s: 1210780, last10s 605390
31036-03-31 12:07:38: sent OK: 63961672, ERR 0, Lat 702.60ms last10s 589.86ms, Row/s: 1279233, last10s 1553044

4.2.3 10w设备 100列

[mxadmin@mdw ~]$ mxbench --database demo --table-name sensor_data_100 --columns-per-row 100 --tag-range 100000 --column-data-type simple --batch-size 10180 --point-data-type int

31036-03-31 12:14:41: sent OK: 14913700, ERR 0, Lat 544.40ms last10s 531.36ms, Row/s: 745685, last10s 792004
31036-03-31 12:14:51: sent OK: 22864280, ERR 0, Lat 539.02ms last10s 528.91ms, Row/s: 762142, last10s 795058
31036-03-31 12:15:01: sent OK: 31313680, ERR 0, Lat 535.67ms last10s 526.62ms, Row/s: 782842, last10s 844940
31036-03-31 12:15:11: sent OK: 38144460, ERR 0, Lat 561.63ms last10s 680.64ms, Row/s: 762889, last10s 683078
31036-03-31 12:15:21: sent OK: 45901620, ERR 0, Lat 561.66ms last10s 561.81ms, Row/s: 765027, last10s 775716

4.2.4 10w设备 400列

[mxadmin@mdw ~]$ mxbench --database demo --table-name sensor_data_400 --columns-per-row 400 --tag-range 100000 --column-data-type simple --batch-size 2601 --point-data-type int

31036-03-31 12:19:44: sent OK: 3651804, ERR 0, Lat 556.68ms last10s 511.94ms, Row/s: 182590, last10s 204958
31036-03-31 12:19:54: sent OK: 5763816, ERR 0, Lat 542.92ms last10s 519.13ms, Row/s: 192127, last10s 211201
31036-03-31 12:20:04: sent OK: 7633935, ERR 0, Lat 542.64ms last10s 541.79ms, Row/s: 190848, last10s 187011
31036-03-31 12:20:14: sent OK: 9467640, ERR 0, Lat 576.16ms last10s 715.68ms, Row/s: 189352, last10s 183370
31036-03-31 12:20:24: sent OK: 10861776, ERR 0, Lat 620.16ms last10s 919.01ms, Row/s: 181029, last10s 139413

--batch-size可以用 4 1024 1024 / 每行的byte数