一、前言

influxdb-comparisons 是 influxdata 官方提供的基准测试工具,支持 influxDB v1 与 v2 版本,支持以下数据库的基准测试:

  • InfluxDB
  • Elasticsearch (announcement blog here)
  • Cassandra (InfluxDB Tops Cassandra in Time-Series Data & Metrics Benchmark)
  • MongoDB (InfluxDB is 27x Faster vs MongoDB for Time-Series Workloads)
  • OpenTSDB
  • TimescaleDB
  • Graphite
  • Splunk

下面直接进入正题,直接开搞。

二、测试

测试环境:

操作系统: debian 10.12

CPU: Intel® Core™ i5-10400 CPU @ 2.90GHz

内存: 2 GB

InfluxDB v2.2.0

注:由于写入数据与生成查询等操作是与 influxdb 在同一台机器上,结果或许有偏差,可以自行使用两天机器进行测试。

  1. 安装 go 环境
add-apt-repository ppa:longsleep/golang-backports
apt-get update
apt-get install golang-1.15-go

# 如 go 无环境变量,则手动设置
# vim ~/.bashrc
# 添加 export PATH=$PATH:/usr/lib/go-1.15/bin
# source ~/.bashrc


# 设置代理 Go 1.13 及以上
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
  1. 安装 influxdb-comparisons
# 需要 go 语言环境,go version go1.15.9
go get github.com/influxdata/influxdb-comparisons/cmd/bulk_data_gen@latest github.com/influxdata/influxdb-comparisons/cmd/bulk_load_influx@latest

go get github.com/influxdata/influxdb-comparisons/cmd/bulk_query_gen@latest github.com/influxdata/influxdb-comparisons/cmd/query_benchmarker_influxdb@latest

# 需要将 /root/go/bin 加到环境变量,才能执行 bulk_data_gen、query_benchmarker_influxdb 等命令
# vim ~/.bashrc
# 添加 export PATH=$PATH:/root/go/bin
# source ~/.bashrc
  1. 生成数据

seconds_in_day = (24 hours in a day) * (60 minutes in an hour) * (60 seconds in a minute) = 86,400 seconds
epochs = seconds_in_day / 10 = 8,640
point_count = epochs * host_count * 9

So, for one host we get 8,640 * 1 * 9 = 77,760 points, and for 1,000 hosts we get 8,640 * 1000 * 9 = 77,760,000 points. Each simulated host produces nine measurements.

# 注意填写时间
bulk_data_gen -timestamp-start '2016-09-10T00:00:00Z' \
-timestamp-end '2016-09-10T00:00:09Z' \
-use-case devops -scale-var 1000 -sampling-interval 9s \
| influx write --org zxb_org --bucket bucket_1
# 生成后可能会报错 Error: failed to write data: 400 Bad Request: unable to parse 'dataset-size:311053,720013': missing tag value 忽略即可;

# 注意:如果需要删除数据,执行以下命令
influx delete --bucket bucket_1 \
  --start '1970-01-01T00:00:00Z' \
  --stop '2023-01-01T00:00:00Z'

命令参数解析:

bulk_data_gen 数据生成命令:

  • -sampling-interval 模拟数据生成时间间隔,默认 10s
  • -timestamp-start 生成数据的开始时间
  • -timestamp-end 生成数据的结束时间
  • -use-case 生成什么类型的数据,默认 devops(choices: devops, iot)
  • -format 生成数据的格式,默认 “influx-bulk” (choices: influx-bulk, es-bulk, cassandra, mongo, opentsdb)
  • -scale-var 在不同案例中特殊变量的个数,例如 iot 中的 home_id 个数,默认 1

influx 该命令为 influxDB 的写入命令,不作多解释。

  1. 查询数据,使用的是 HTTP 的方式去执行查询
# 生成查询,并执行查询
bulk_query_gen -db bucket_1 -queries 5 -use-case iot \
-timestamp-start '2022-05-10T00:00:00Z' -timestamp-end '2022-05-14T00:00:01Z' \
-use-case iot -query-type '1-home-12-hours' \
-format influx-flux-http | \
query_benchmarker_influxdb -urls http://localhost:8086 \
-token bHgEVZOX3evOE3LAzDjEU8iLLdTcl042iTGHSTWLdQX4m5sDg3yN99GMDtdIxhWWWWWBV2_mFC8buZRpMjVzLg== \
-organization 'zxb_org' -workers 5

命令参数解析:

bulk_query_gen 查询生成命令:

  • -db 在 v1 版本中为数据库名称,v2 为 bucket 名称,默认查询 “benchmark_db”
  • -use-case、-query-type、-format 这三个参数可以执行 bulk_query_gen -h 查看最下面的 use case matrix 对应填上去;例如以下图第一条为例子,-use-case 为 group-window-transpose-low-card,-query-type 为 last,-format 为 influx-flux-http
  • -queries 生成的查询数量,默认为 1000
  • -timestamp-start 生成数据的开始时间
  • -timestamp-end 生成数据的结束时间

query_benchmarker_influxdb 根据生成的查询,执行去查询,这样的基准测试才能更加轻量(免去了生成查询的时间)

  • -urls influxDB 的地址
  • -token 访问 token
  • -organization 组织名称
  • -workers 并发请求数量
写入测试:

数据发送速度(points/s)

实际处理速度(points/s)

平均 CPU 占用率(%)

总耗时

1,000

1,000

1.5

4.716036ms

3,000

3,000

12.5

474.297061ms

5,000

5,000

19.0

854.339738ms

8,000

6,006

29.0

1.332948435s

10,000

5,714

38.75

1.752057124s

20,000

4,435

48.5

4.511424584s

5,0000

2,083

见下图

24.292371029s

下图(阴影部分)为当数据插入为 5W 条时的 CPU 占用曲线图,可见出现速度缓慢的原因 CPU 并不是瓶颈:

InfluxDB跟elk区别 influxdb对比mongo_InfluxDB跟elk区别

三、总结

从测试结果可以知道,在单机的情况下,写入的速度还是可以接受的,CPU 占用率还未封顶,还可以有更好的写入速率。除了 influxdb-comparisons 工具外,还有 tsbs、influx-stress 可以进行测试,但它们并不支持 2.x,因此选择了 influxdb-comparisons 进行测试,中间也花了不少时间在看工具的介绍上面。