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

举报
华为云开源 发表于 2023/10/07 16:51:29 2023/10/07
【摘要】 如何将CPU开销减少 88.76%,总时延减少83%?一看便知

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

本文主要介绍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成长。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。