TimescaleDB 性能测试

TimescaleDB 0 是一个基于 PostgreSQL 1 的时序数据库 2 , 时序数据库的主要用途通常是 监控 及 历史数据分析。

世界上 最久负盛名/最快/最贵/最小 的时序数据库 kdb+ 4 5 可能有不少人听说过。 这个数据库由 K 6 语言 编写并且内置了 Q 7 语言。

提示

可以从 Kx System 的 Github 上下载免费版本。

可以从 https://ondemand.kx.com/ 获取免费版的授权文件。

AWS kdb+ 价格信息 最便宜的授权费用是 $1.5/小时, 每个月需要 $1080(每个月按照30天计算)。

警告

Kdb 的免费版本不允许商业使用

注解

本公司并没有使用过 kdb+ 数据库, 跟 Kx Systems 4 公司也没有任何关系。

时序数据库的特性

写入特点

  • 写入量大 峰值小

时序数据库通常用于机器(例如:工业、物联网设备 等)状态的监控.

例如当监控服务器运行的状态时:

假如每个机器每秒上报 100 个指标(metric), 如果监控 100 台机器(一个不算特别大的集群) 则每秒需要上报 10_000 个指标数据。

  • 数据具有 实时性

数据实时性越高,越能提前发现问题。

注解

甚至有些工业设备监控的会有确定的实时性要求(比如说: 每个数据的处理需要在 1ms 之内), 否则会导致严重的事故。

  • 数据具有 不变性

数据写入之后通常不允许更改(更改历史的监控指标数据有什么实际意义吗?)。

注解

更改历史数据我唯一能想到的用处就是: 用于欺骗别人。

查询特点

  • 聚合查询

查询通常是 多种维度、多种时间精度 组合 进行聚合查询,并不关注某一个点的具体值。

注解

例如服务监控中的: p50, p95, p99 等

  • 最新的数据查询概率高

数据的重要性通常是随着时间的流逝在逐渐变低, 做聚合分析的时候,通常都是使用最新的数据。

存储特点

  • 数据量大

监控 100 台机器,每秒 100 个指标,每天的数据量也达到了惊人的 8.64 亿。

  • 数据具有周期性

历史数据一般会定期清除。

注解

当用于监控服务器的时候,由于机器有生命周期(一般商用服务器的保质期为: 2~3年), 当一个机器已经下线,保留它历史所有的监控数据并没有什么价值。

当然,通过下采样获取这个机器的指标还是有一些实际价值的。

测试环境

操作系统

Ubuntu 20.04.2 LTS (Focal Fossa)

Docker

19.03.8

TimescaleDB

timescale/timescaledb:2.0.1-pg12

内存

2GB

CPU

1核心 Intel(R) Xeon(R) CPU E5-2697 v4 @ 2.30GHz

注解

虚拟机实际是 Linode 3 的 10$ 每个月的机器。

测试结果

https://cdn.jsdelivr.net/gh/QiYuTechDev/static@main/blog/202101/30_bench_timescaledb/barchart.png
  • t 表示的是线程数量

  • b 表示的是每个事务写入多少条数据

  • n 表示每个线程执行多少次写入事务

测试写入的总数据 = \(t * b * n\)

注解

图像表示的是写入 1000 条数据所需要的时间。

待处理

测试内存 & 磁盘占用量

InfluxDB 的问题

曾经使用过 InfluxDB 的数据库,主要遇到两个比较严重的问题:

我曾经遇到过: 使用 API 写入时返回成功,实际上数据并没有落盘, 导致部分数据丢失。

这也是一个老问题了,印象中后来他们做了一个优化, TSI 8 会落到磁盘上。

提示

InfluxDB 的集群版本早已不再开源(在1.0 版本之前)。

注解

InfluxDB 最近又要更换架构(InfluxDB IOx) 9, 底层存储切换成 Rust 10 语言, 给我的感觉是: InfluxDB 从来就没有稳定过!

参考资料

0

TimescaleDB 官方网站

1

PostgreSQL 官方网站

2

时序数据库 - 维基百科

3

Linode 官方网站

4(1,2)

Kx 官方网站

5

kdb+ 维基百科

6

K 编程语言 维基百科

7

Q 编程语言 维基百科

8

Time Series Index (TSI) details

9

InfluxDB IOx

10

Rust 语言