可以设想一下,当你驾驶着一辆新能源汽车在高速上驰骋,你脚下的数据采集器在一秒钟内通过提前设置的 80 个指标采集到了 80 个数据,总大小为 2KB,你可以在一分钟的单位时间内观测这些不断回传的数据,运用它们实时分析你想知道的任何状况,但在此之前必须要通过一个靠谱的数据库来对珍贵的数据进行写入、保存。毋庸置疑,时序数据库要接入大量设备的实时数据,加载性能至关重要! 本节你将会利用 YMatrix 中的高级组件 MatrixGate、MatrixBench 进行强大的数据接入性能测试,为之后的数据分析提供靠谱保障。 我们的物理机硬件测试环境如下,硬件环境参数有可能会影响工具配置参数,记得选取适合自己的。

1 硬件环境

机器配置如下:

参数 配置
CPU 核数 2 物理核 32 逻辑核
CPU 平台 Intel(R) Xeon(R) Gold 5218 CPU @ 2.30GHz
内存 256GB
储存容量 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,是一款高性能流式数据加载服务器,位于 YMatrix 安装目录下的 bin/mxgate。该工具会充分发挥分布式数据库的并行处理性能,是生产环境中做数据加载的必选工具。在测试环节,mxgate 将配合 mxbench 的数据写入工具 writer 对随机数据生成器 generator 生成的数据进行高速写入。

更多相关信息请见 mxgate

2.2 MatrixBench

mxbench 是一款数据加载和查询的压测工具,可以根据你想要的设备数量、时间范围、指标数量等配置并快速生成随机数据,自动创建数据表,串行或并发进行数据加载和查询。你可以通过命令行配置并运行 mxbench,也完全可以写进特定的配置文件,遵从个人习惯即可。mxbench 工具位于 YMatrix 安装目录下的 bin/mxbench。

3 部署方式

单机部署,Master + 6 个 Segment

注意!
你需要把 MatrixGate,MatrixBench 与 YMatrix 集群部署在同一台机器上。

4 开始测试

4.1 测试用例

我们准备了三种不同指标规模的时序场景测试用例。在此节末尾,我们会对不同指标规模下 YMatrix 的写入速度做直观对比。

  1. 10w 设备,10 个指标
  2. 10w 设备,100 个指标
  3. 10w 设备,1000 个指标

    4.2 开始测试

    注意!
    使用 mxbench 进行加载测试前你需要准备好 mxbench 的测试环境:包含正常运行的 YMatrix 集群,以及配置好的相关环境变量。此步是必要步骤!mxgate 无需手动配置,因为在启动 mxbench 的同时,你已经收获了 mxgate 的配置与启动。

集群部署方式请见集群部署,mxbench 配置方法请见mxbench

4.2.1 10w 设备 10 个指标

mxbench 常用参数配置主要分为俩部分:全局配置与可插件化的局部配置。全局配置包含 database、global 两板块;可插件化的配置包含数据生成器 generator、数据写入工具 writer、数据查询工具 benchmark。

由于本节主要目的为体验 YMatrix 加载性能,因此对于 mxbench 的查询工具 benchmark 不以赘述。 benchmark 相关信息请见 mxbench

具体如下:

参数名 默认值 参数含义
--database 默认值为环境变量 PGDATABASE,如没有设置则是 postgres 目标数据库名
--db-master-port 实例的端口号,需与环境变量中配置的端口号一致
--db-user 检查当前的用户名,并作为默认值 用户名
--workplace /tmp/mxbench csv 数据文件,query 文件的目录
--watch true 是否开启进程观察,默认开启
--simultaneous-loading-and-query false 是否同时执行数据加载和查询。默认值 false,先执行数据加载,执行完毕后再执行查询
--table-name 目标表名,默认值为空,必需手动指定
--tag-num 25000 目标设备数目
--metrics-type float8 指标类型,只支持 "int4", "int8", "float4", "float8", 4种类型
--total-metrics-count 300 指标总数
--ts-start 生成数据时间戳起始时间
--ts-end 生成数据时间戳终止时间
--ts-step-in-second 1 每几秒采集一次指标
--generator telematics 随机数据生成器,默认生成车联网场景的时序数据。你也可以选择从自己的数据文件读取数据且发送至 mxgate 加载,不生成任何数据也是被允许的
--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,即每行数据值相同。SMALL、MIDDLE、LARGE 级别的数据随机度按顺序依次增大
--writer http 数据写入工具。可以选择以何种模式启动 mxgate,并从数据源接收数据。

你可以在 mxbench 中找到更多可以配置的参数,或在命令行输入 mxbench --help 查看完整用法。

使用以下命令行来配置并运行 mxbench,请参考上述表格并根据实际情况对参数值进行调整。由于 mxgate 和 mxbench 部署在一台机器上时候,writer 工具使用 “stdin” 不用建立网络连接、通过网络传输,而可以直接利用 Linux 系统提供的管道,因此我们在示例中使用 “stdin” 参数,轻量便捷。

[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_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 为“false”,则运行过程中可以每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        │
└─────────────────────────────────┴─────────────────────┘  

wirter 统计报告输出解读:

参数名 参数含义
start time 数据加载起始时间
end time 数据加载终止时间
size written to MxGate (bytes) 向 mxgate 写入数据的字节数
lines inserted 插入数据的条数(行数)
compress ratio 压缩比,即向 mxgate 写入数据的大小和实际数据库中该表的大小的比值

实际运行时间与整体加载的数据量,以及机器性能有关。只要没有关掉 watch,你都可以以 5s 的间隔实时看到数据写入的进度信息,时刻掌握写入速度与时间!

注意!
mxbench 启动后会持续压测,直到时间戳值从 ts-start 到 ts-end 的数据全部加载完毕。你也可以选择在键盘按下 ctrl-c 提前结束运行。

如果你觉得直接写大篇幅的命令行过于繁杂,也可以选择以下方式:创建配置文件 mxbench.conf,将参数写进去,然后运行它。

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

注意!
你可能会在写入数据时遇到“卡住”的问题,此时进度信息会持续打印,但没有任何实质性的写入进度。不要慌张,可以运行以下语句查看运行日志,排查问题。

[mxadmin@mdw ~]$ cd ~/gpAdminLogs/ 

4.2.2 10w 设备 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 10w 设备 1000 个指标

[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       │
└─────────────────────────────────┴─────────────────────┘

根据上述 writer 统计报告,我们向你提供一份更加直观的折线图对比,你可以在图中清晰了解到 YMatrix 强大的数据加载性能,以及它随着指标规模会呈现一种怎样的增长,在实际场景运用中对于设定多少指标更加胸有成竹。

load_performance line

时序场景中的数据是带有时间戳属性的数据点,表示某个时间时刻某个指标的值,如果丢弃时间戳属性,就不可以称之为是时序场景下的数据。理解了数据点的概念,你可以更好地理解上图。图中横轴为用例中设定的不同指标规模,对应参数 total-metrics-count,纵轴为写入速度,表示每秒单位时间内可以写入数据点的数量,你肯定已经明白,随着指标规模的扩大,写入速度呈现出一种非常快速的增长,但如果指标数据较多,速度增长也会较为受限。不过无论怎样,YMatrix 的写入速度都是百万级的,比起苦着脸使用 INSERT 语句一条一条插入,何不尝试开着YMatrix 在高速公路上驰骋一把!