openGemini如何高效处理乱序数据?

原创
2023/10/07 17:48
阅读数 47

众所周知,在绝大数场景下,时序数据都是按照时间递增顺序入库,但由于网络延迟、设备故障等原因,会造成采集的数据无法保证按序达到,习惯上我们称这些的数据为乱序数据。乱序数据是一种普遍现象,乱序数据处理也是时序数据库必须支持的场景。
 

本文主要介绍openGemini是如何高效地处理乱序数据。

 

高吞吐摄入乱序数据

 

openGemini存储引擎采用LSM结构,支持数据高效摄入。数据会在memtable聚合到一定大小,再触发刷盘,大幅减少磁盘IO。
 

各时间线数据在内存中存在有序和乱序两个区域,有序时间序列数据写入到有序区域,乱序时间区域写入到乱序区域。当memtable刷盘时,有序数据刷到磁盘有序区,生成有序文件;乱序数据刷到磁盘乱序区,生成乱序文件。乱序和有序数据处理一致,均可以保持高速摄取。

 

乱序数据高效合并

乱序文件在openGemini存储引擎属于Level0的文件,优先会尝试乱序文件间进行合并,达到设定的阈值大小后才会和有序文件合并,避免与有序文件高Level文件合并产生写放大。
 

乱序和有序文件合并时,利用乱序文件占比少的特点,有序文件中未包含乱序文件的时间线数据,只需要读取 CunkMeta 元数据,修改偏移量,读取后直接写入新文件即可,减少数据解压、压缩大量操作,大幅降低了CPU,该优化已经在v1.1.0-rc1版本。

 

优化前后实测效果

测试乱序数据和有序数据只有 5% 的时间线相交。写入有序数据2.19G,包含50000个时间线,同时写入乱序乱序数据3.5MB,包含2500个时间线。

 

测试结果如下表所示:

CPU开销减少 88.76%,总时延减少83%,效率提升非常明显。

 

总结

openGemini早期版本支持乱序数据写入,采用方法较为简单粗暴,导致在实际应用场景中,由于乱序数据的持续增加,使得节点计算资源消耗较大。社区在收到问题反馈后,进行了细致的优化,从测试效果来看满足了优化目标从实际应用效果来看,在华为云内部某业务的生产环境中,乱序文件约为1万个,包含的时间线数量在百万到亿之间波动,整体效率提升约百倍+。

 

极致的使用体验是社区努力的方向,欢迎大家向社区反馈使用中常面临的问题,助力openGemini成长。


openGemini官网:http://www.openGemini.org

openGemini开源地址:https://github.com/openGemini

openGemini公众号:

欢迎关注~ 诚邀你加入 openGemini 社区,共建、共治、共享未来!

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部