暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

原创 周益剑 2023-10-07
244

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

本文主要介绍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 社区,共建、共治、共享未来!

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论