1、字节跳动时序存储引擎的探索和实践字节跳动基础架构研发工程师/陈骁 技术挑战整体架构热存TsdcKhronos未来展望大纲时序数据模型MetricTagsTimeCpuUsageMemUsagenode.statidc=1,host=0.0.0.02023.04.17 10:30:001530node.statidc=1,host=0.0.0.12023.04.17 10:30:003050node.statidc=1,host=0.0.0.02023.04.17 10:30:103149node.statidc=1,host=0.0.0.12023.04.17 10:30:105050时间序列
2、数据是按照时间序列变化的一组值,反映某个观测值随着时间的变化Metric Name+Tags标识一个唯一的时间序列(e.g.一个观测对象)Field Values是具体的度量值,可以有一个或者多个Field Values字节时序数据库使用现状写入点数每秒10亿+查询QPS 100k+指标名数量1亿+活跃时间线1000亿+020040060080010001200140016001800百万百万2021202220230200004000060000800001000001200001400001202120222023Workload分析和对应的挑战 写远大于读,写入量非常大-线性扩展 查询以
3、分析为主,点查为辅-面向分析查询优化的同时兼顾点查性能 超高维度-在单机亿级活跃维度情况下依然保证写入和查询性能 Noisy Neighbours-租户间的隔离-防止个别超大metric影响整体可用性技术挑战整体架构热存TsdcKhronos未来展望大纲ByteTSD整体架构如何线性扩展 二级一致性Hash分区 -先按照Metric做一次Hash分区 -再按照序列做第二次Hash分区 Metrics级别的动态分区 -不同维度的Metric可以拥有不同的 二级Hash分片数如何保证隔离性 ResourceGroup-被调度的对象-ShardWeight表示需要多少资源 Node-资源的容器,调度
4、的目的地-NodeWeight表示有多少资源 灵活设置Weight达成理想的资源分布技术挑战整体架构热存TsdcKhronos未来展望大纲深入Tsdc内存存储,提升热数据的读写性能 数据按时间分为多个Slot-最近的slot可修改-历史slot落盘释放内存元数据只存一份-TagKV字典化-TagSet Varint编码后字典化-按需建索引-定时GC字典结构Dictionary=HashTable+VectorVector=BlockIndex+Block-O(1)的随机访问-对BlockIndex做快照,实现无锁的遍历-临界区很短,读写互不影响 异步Rehash 通过Epoch Based R
5、eclamation机制回收内存,避免无锁遍历时访问无效的内存TagKeySetMetricTagsTimeCpuUsageMemUsagenode.statidc=1,host=0.0.0.02023.04.17 10:30:001530node.statidc=1,host=0.0.0.12023.04.17 10:30:003050node.statidc=1,host=0.0.0.02023.04.17 10:30:103149node.statidc=1,host=0.0.0.12023.04.17 10:30:105050 观察数据特征-大部分序列拥有相同的TagKeys 每个序列
6、的所有TagKeys称为TagKeySet 直接编码整个TagKeySet-TagSet中只存储一个id-Encode时只做一次HashTagKeySet:idc,hostDatapointSet578965RingbufferCompressed Timestamp RingBuffer用于处理乱序写入,存储原始数据点 数据点划出RingBuffer后,写入TimeBuffer和ValueBuffer TimeBuffer使用delta of delta压缩 ValueBuffer使用Gorilla压缩乱序写入优化Question:RingBuffer