InfluxDB数据压缩算法

简介:

前言


InfluxDB作为DB-Engines上排名第一的时序数据库,从设计和实现上都针对时序数据的特性进行了优化,其高性价比特性与数据压缩有着直接关系,本文将介绍InfluxDB使用的数据压缩算法。


数据存储模型


首先简单介绍下时序数据在influxdb中是如何存储的。


时序数据场景中,每个数据点都包含数据值和时间戳,以及measurement和tag-set组成的series key,比如下面的例子中,第一个空格前面的部分就是series key,后面跟着的是值和时间戳:


dd7c788fde1ad854c42741d88083efab.png


InfluxDB的数据存储是基于series key来组织的,上面的数据有两个series key(对应两台主机)。


df157c22078028cd0162fddc972980d1.png


每个series key对应的数据根据时间戳进行排序后,以一个block进行存储;存储是列式的,即时间戳和数据是独立存储的:


TSM_compression.png


下面讨论的压缩算法就是针对时间戳和值进行无损压缩。


压缩算法


InfluxDB中值是有类型的,当前支持整形,浮点数,布尔类型和字符串四种类型,而时间戳是64位整形,压缩算法是根据不同的数据类型来选择的。


时间戳


时间戳都是64位的无符号整数,其编码方式是自适应的:



  1. 因为时间戳是排序的,首先进行delta编码,第一个数据不变,其他数据转换为与上一个数据的delta;同时计算出10为因子的最大公约数。
  2. 如果最大值(即最后一个原始值与第一个原始值的差)过大(超过1 << 60,大约36年,基本不会出现),则不压缩,直接存储数组。否则,
  3. 如果delta都相同,就直接使用游程编码,只记录第一个值,delta值,以及数量即可。一般监控数据都是定时采集的,比如十秒一个点,那游程编码方式可以达到很高的压缩比;否则
  4. 所有的delta值都除以最大公约数(最大公约数是编码在数据中的),然后使用simple8b算法进行编码。

simple8b是一种整数编码算法,2010年由墨尔本大学的一位博士生提出的。simple8b将多个整数(0到1<<60-1 之间)打包到一个64位的整数中,其中前4位用作selector,用来标记每个值使用多少bit。


f73aa2e01a7b9e66fd67e2b10a67bab4.png


浮点数


浮点型的数据编码方式采用了facebook的Gorilla算法,详细描述可以参考paper或者内网的翻译,这里仅简单介绍下。


多数时序场景下相邻值变化不大,浮点数也不会有明显的变化,Gorilla也采用了delta编码原理,但是与整形的delta编码不同,Gorilla使用XOR来计算两个浮点值的差异。


首先我们看下常用的浮点数机器编码,也就是ieee754标准:


Double-Precision-IEEE-754-Floating-Point-Standard-1024x266.jpg


符号位和指数位在高位,所以相近的值高位是相同的,XOR的值会有很多高位的零。XOR的值会再进行变长编码。


整形


整数类型也是基于数据特征自适应地选择两种编码方式。



  1. 首先使用zig-zag编码数据,将有符号整数编码成无符号整形
  2. 如果所有的delta都相同,则使用游程编码,否则
  3. 如果可以使用simple8b,则使用simple8b算法编码(与时间戳编码一样),否则
  4. 不压缩直接存储

zigzag编码是一种针对有符号数的变长编码,其计算十分简单:


(n << 1) ^ (n >> 63)

也就是将符号位移动到最后面,这样绝对值小的数在变长编码中可以占用更少的位,编码效果如下:

 

4f185bcc66d36c7aac9c3ac2c9f0c2a6.png


布尔类型


布尔值使用简单的bit pack方式编码,每个值使用1位,没有使用二次压缩。


字符串


使用snappy算法进行编解码。Google snappy的设计原则不是追逐压缩比,而是更看中压缩性能。代码实现上,snappy也针对x86系统做了优化,比如使用little-endian,使用SSE指令直接操作128bit的整数,等等。influxdb使用go语言开发,snappy是实现中直接使用了x86汇编语言。


 


 

目录
相关文章
|
1月前
|
数据采集 机器学习/深度学习 算法
【优秀设计案例】基于K-Means聚类算法的球员数据聚类分析设计与实现
本文通过K-Means聚类算法对NBA球员数据进行聚类分析,旨在揭示球员间的相似性和差异性,为球队管理、战术决策和球员评估提供数据支持,并通过特征工程和结果可视化深入理解球员表现和潜力。
【优秀设计案例】基于K-Means聚类算法的球员数据聚类分析设计与实现
|
9天前
|
存储 算法 测试技术
预见未来?Python线性回归算法:数据中的秘密预言家
【9月更文挑战第11天】在数据的海洋中,线性回归算法犹如智慧的预言家,助我们揭示未知。本案例通过收集房屋面积、距市中心距离等数据,利用Python的pandas和scikit-learn库构建房价预测模型。经过训练与测试,模型展现出较好的预测能力,均方根误差(RMSE)低,帮助房地产投资者做出更明智决策。尽管现实关系复杂多变,线性回归仍提供了有效工具,引领我们在数据世界中自信前行。
25 5
|
19天前
|
编解码 算法 图形学
同一路RTSP|RTMP流如何同时回调YUV和RGB数据实现渲染和算法分析
我们播放RTSP|RTMP流,如果需要同时做渲染和算法分析的话,特别是渲染在上层实现(比如Unity),算法是python这种情况,拉两路流,更耗费带宽和性能,拉一路流,同时回调YUV和RGB数据也可以,但是更灵活的是本文提到的按需转算法期望的RGB数据,然后做算法处理
|
1月前
|
存储 算法 大数据
小米教你:2GB内存搞定20亿数据的高效算法
你好,我是小米。本文介绍如何在2GB内存中找出20亿个整数里出现次数最多的数。通过将数据用哈希函数分至16个小文件,每份独立计数后选出频次最高的数,最终比对得出结果。这种方法有效解决大数据下的内存限制问题,并可应用于更广泛的场景。欢迎关注我的公众号“软件求生”,获取更多技术分享!
147 12
|
1月前
|
编解码 算法 Linux
Linux平台下RTSP|RTMP播放器如何跟python交互投递RGB数据供视觉算法分析
在对接Linux平台的RTSP播放模块时,需将播放数据同时提供给Python进行视觉算法分析。技术实现上,可在播放时通过回调函数获取视频帧数据,并以RGB32格式输出。利用`SetVideoFrameCallBackV2`接口设定缩放后的视频帧回调,以满足算法所需的分辨率。回调函数中,每收到一帧数据即保存为bitmap文件。Python端只需读取指定文件夹中的bitmap文件,即可进行视频数据的分析处理。此方案简单有效,但应注意控制输出的bitmap文件数量以避免内存占用过高。
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习的伦理困境:数据隐私与算法偏见
【8月更文挑战第9天】随着深度学习技术的飞速发展,其对个人隐私和数据安全的威胁日益凸显。本文探讨了深度学习在处理敏感信息时可能导致的数据泄露风险,以及训练数据中固有偏见如何影响算法公正性的问题。文章分析了当前隐私保护措施的局限性,并提出了减少算法偏见的方法。最后,本文讨论了如何在保障技术进步的同时,确保技术应用不侵犯个人权益,呼吁建立更为全面的伦理框架以指导深度学习的发展。
|
1月前
|
数据采集 算法 数据可视化
基于K-Means聚类算法对球员数据的聚类分析,可以自主寻找最优聚类数进行聚类
本文介绍了一个基于K-Means聚类算法的NBA球员数据分析项目,该项目通过采集和分析球员的得分、篮板、助攻等统计数据,使用轮廓系数法和拐点法确定最优聚类数,将球员分为不同群组,并提供了一个可视化界面以便直观比较不同群组的球员表现。
基于K-Means聚类算法对球员数据的聚类分析,可以自主寻找最优聚类数进行聚类
|
2月前
knn增强数据训练
【7月更文挑战第27天】
27 10
|
1月前
|
存储 算法 定位技术
预见未来?Python线性回归算法:数据中的秘密预言家
【8月更文挑战第3天】站在数据的海洋边,线性回归算法犹如智慧的预言家,揭示着房价的秘密。作为房地产投资者,面对复杂的市场,我们可通过收集房屋面积、位置等数据并利用Python的pandas及scikit-learn库,建立线性回归模型预测房价。通过评估模型的均方根误差(RMSE),我们可以更精准地判断投资时机,让数据引领我们走向成功的彼岸。
17 1
|
2月前
knn增强数据训练
【7月更文挑战第28天】
19 2