RedisTimeSeries实时时序数据库预研
背景
时序数据库开源实现有比较多的选择,比如:InfluxDB、OpenTSDB等。我们项目中没有使用这些时序数据库,我们基于ClickHouse来实现时序数据的分析及洞察。目前遇到的比较棘手的问题就是,时序数据的入库实时性无法保证,一般来说会有2-5秒的延迟。这也是由ClickHouse的架构决定的,其不支持频繁的写入,其底层的存储结构类似LSM树的机制,都是采用批量顺序写的方式来实现高吞吐的特性。很多业务场景,这样的延迟是不被允许的。比如:工业场景,设备反控制之类的需求对实时性要求非常高。
为何选择RedisTimeSeries
RedisTimeSeries是由 Redis Labs 开发的 Redis 模块,用于增强使用 Redis 管理时间序列数据的体验。我们选择RedisTimeSeries作为实时数据库主要有如下两点的考虑:
1、RedisTimeSeries是基于Redis实现的。Redis是非常成熟稳定的NOSQL数据库,它具有丰富的数据结构、超高的读写TPS、稳定的持久化机制、集群模式支持横向扩展等特性。
2、目前实时数据库开源没有更好的选择。像PI这些商业软件是非常昂贵的。国内也有很多基于内存来实现实时数据库的,也都是收费的。
RedisTimeSeries的安装
github地址如下:https://github.com/RedisTimeSeries/RedisTimeSeries
我采用的源码安装的方式,按照官方的文档执行如下的命令:
git clone --branch v1.6.8 --recursive https://github.com/RedisTimeSeries/RedisTimeSeries.git
cd RedisTimeSeries
make setup
RedisTimeSeries依赖的github工程比较多,如果你没有使用VPN,上面的方式是安装不成功的。为了能正常的编译通过,你需要使用VPN并配置好你的github代理,可执行如下的命令设置代理。
git config --global https.proxy http://yourhost:yourport
git config --global https.proxy https://yourhost:yourport
我们操作系统版本为centos7.4,安装完成后,会在binlinux-x64-release下生成redistimeseries.so文件。
然后在安装好的redis中加载这个模块,我是通过配置redis.confg来实现的,如下:
################################## MODULES #####################################
# Load modules at startup. If the server is not able to load modules
# it will abort. It is possible to use multiple loadmodule directives.
#
loadmodule /data/rts/redis-6.2.6/redistimeseries.so DUPLICATE_POLICY LAST
可以通过module list查看Redistimeseries模块是否已经安装成功:
127.0.0.1:6379> module list
1) 1) "name"
2) "timeseries"
3) "ver"
4) (integer) 10608
这样Redistimeseries模块就安装完成了。支持的功能基本能覆盖我们日常的业务需求:
1、查询最新的测点
TS.GET key
2、查询最新的N个测点
TS.RANGE key fromTimestamp toTimestamp
3、对时间范围指标进行聚合
支持的常用的聚合函数,包括: avg、sum、min、max、range、count、first、last等。
性能压测
性能压测可以分为两部分,第一部分写入,第二部分读。可以采用RedisTimeseries官方提供的压测工具redistimeseries-ooo-benchmark。这个工具的功能还是比较多的,支持乱序数据场景的测试。压测命令参考:
#1000万测点,100线程,一个批次10000测点,乱序率0
./redistimeseries-ooo-benchmark --host "xxx:6379" --debug-level 0 --pipeline 10000 --ts-maximum 100 --compressed=false --ooo-percentage=0 -samples-per-ts 100000
对于读场景,可以直接使用Redis的压测工具:redis-benchmark
#1000万测点,100线程,获取最新10个 测点
./src/redis-benchmark -h xxx -p 6379 -c 100 -n 1000000 -P 10 TS.RANGE temperature:2:32 1645682470062 1645682470071
我们测试的时候,直接部署的Redis单机版本,机器配置:8C16G。性能测试结果如下:
总体性能还是可以的,完全满足目前的业务需求。