openGemini如何高效处理乱序数据?
众所周知,在绝大数场景下,时序数据都是按照时间递增顺序入库,但由于网络延迟、设备故障等原因,会造成采集的数据无法保证按序达到,习惯上我们称这些的数据为乱序数据。乱序数据是一种普遍现象,乱序数据处理也是时序数据库必须支持的场景。
本文主要介绍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成长。
- 点赞
- 收藏
- 关注作者
评论(0)