作者:张川、杨维亮
随着用户对时序数据存放成本的要求进一步提高,时序数据存储就成为了时序数据库的必修课之一,当前时序数据库采用Delta-delta, Simple-8b , XOR-base 等压缩算法,实现了释放90%的存储空间。
所有计算都基于一个简单的原理:所有的信息都是用二进制表示的。虽然存储资源的价格越来越廉价,但是计算资源毕竟不是免费的。我们如果可能更加有效的存储这些信息, 我们就可以用在存储、计算和带宽上面节省更多的资源, 即压缩的定义:按照特定的编码机制用比未经编码少的数据位元(或者其它信息相关的单位)表示信息的过程。
近几十年来, 压缩算法始终在计算机领域扮演重要的角色。而压缩这个概念本身则更为古老, “1838年发明的摩尔斯密码是最早的应用压缩算法实现,对于英语中最为普遍的字母‘t’和‘e’使用较短的摩尔斯密码”。
在本文中, 我们将揭开压缩算法的面纱,向大家介绍几种用于时序数据的算法,以及如何把他们应用项目之中。我们将解释如何把这些算法应用到时序数据库中从而节省了90%以上的存储空间。
1,压缩算法对于时序数据的重要性
时序数据来源多种多样,无论是在 IT系统监控、网络数据分析还是在产品/用户行为分析以及税务系统中, 时序数据都贯穿整个数据线, 对于更好实时了解系统和应用很有帮助。
对于时序数据来说, 存储的覆盖范围始终是一个很重要的挑战。 为了能够更好的分析这些数据的变化, 我们每次获得新的数据之后,并不会更新数据本身, 而是把这些作为新数据插入进数据库。 有些时序系统在新数据写入方面负载很大(如IT系统的监控,物联网传感器数据等), 其时序数据本身都达到了TB级别。
为了能够高效且高速的处理这些数据, 我们选择了目前最为高效的时序压缩算法,并且把他们应用到时序数据库中。根据之前的测试, 时序数据库最终可以达到90%以上无损压缩。 这同时也意味着减少了存储方面的大笔开销。 而且压缩算法还可以提高性能: 数据本身占用的空间少意味着查询时需要请求硬盘空间也少。
2,时序数据压缩算法
以下是按数据类型的时序数据压缩算法:
整型数据:
- Delta encoding
- Delta-of-delta encoding
- Simple-8b
- Run-length encoding
浮点数据
- XOR-based compression
未知数据
- Dictionary compression (字典法)
3,整数压缩
Delta-encoding
Delta-encoding / Delta compression , 通过只存储数据库的差值以及一个或多参考值来节省存储空间。适用于大量冗余数据的情况, 比如版本化的文件系统. (各种网盘)
Delta-encoding很适合压缩时序数据: 我们可以用很少空间存储一个点的数据, 然后其余数据只需要存储与之前数据的差值即可。从某种意义上来说,带版本的文件本身也是时序数据, 这里就不浪费时间展开了。举个例子, 如果我们来收集CPU,内存,温度,湿度等数据,以整数的方式存储数据. 原始数据格式如下:
| time | cpu | mem_free_bytes | temperature | humidity |
|---------------------|-----|----------------|-------------|----------|
| 2020-04-01 10:00:00 | 82 | 1,073,741,824 | 80 | 25 |
| 2020-04-01 10:05:00 | 98 | 858,993,459 | 81 | 25 |
| 2020-04-01 10:05:00 | 98 | 858,904,583 | 81 | 25 |
通过 delta-encoding算法, 我们只需要把每条数据与之前相比的变化值存储即可, 这样使用的空间更小:
| time | cpu | mem_free_bytes | temperature | humidity |
<