时序数据库要接入大量设备的实时数据,加载性能至关重要,本节将带大家做数据接入性能测试,来感受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 测试用例
- 10w设备,10列
- 10w设备,50列
- 10w设备,100列
- 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数