openGemini如何高效处理乱序数据?
【摘要】 如何将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)