TiPrometheus:基于 TiDB 的 TSDB | TiDB Hackathon 优秀项目分享
本文作者是菜哥和他的朋友们队的于畅同学,他们的项目 TiPrometheus 已经被 Prometheus adapter 合并。该项目分两个小项目,分别解决了时序数据的存储与计算问题。存储主要兼容 Prometheus 语法和数据格式,实现了精确查询、模糊查询,完全兼容现有语法。所有数据仅存在 TiKV 中。计算主要通过 TiKV 调用 Lua 实现,通过 Lua 动态扩展实现数据计算的功能。
项目简介
既然你关注了 TiDB, 想必你一定是个关注 Infrastructure 的硬汉子。监控作为 Infra 不可或缺的一环,其核心便是 TSDB(time series database)。
TSDB 是一种以时间为主要索引的数据库。主要用来存储大量以时间为序列的指标数据,数据结构也比较简单,通常包括特征信息,指标数据和 timestamp。常见的 TSDB 包括 InfluxDB,OpenTSDB,Prometheus。
而 Prometheus 是一整套监控系统,时序数据库是它的存储部分,下面这张架构图来自于 Prometheus 官方,简单概括了其架构和生态的组成。
Prometheus 还支持一个图上没有体现的功能 Remote Storage,可以进行远程的读写,对查询是透明的。这个功能主要是用来做长存储。我们的项目就是实现了一个基于 TiKV 的TSDB 来做 Prometheus 的 Remote Storage。
核心实现
Prometheus 记录的数据结构分为两部分 label, samples。label 记录了一些特征信息。samples 包含了指标数据和 timestamp。
"labels": [{ "job": "node", "instance": "123.123.1.211:9090", }] "samples":[{ "timestamp": 1473305798 "value": 0.9 }]
label 和时间范围结合,可以查询到需要的 value。
为了查询这些记录,我们需要构建两种索引 label index 和 time index,并以特殊的 key 存储 value。
label index
每对 label 为会以 index:label:
time index
每个 sample 项会以 index:timeseries:
doc 存储
我们将每一条 samples 记录以 timeseries:doc:
下面做一个梳理。
写入过程
1. 生成 labelID
2. 构建 label index,index:label:
3. 构建 time index,index:timeseries:
4. 写入时序数据,timeseries:doc:
查询过程
1. 根据倒排索引查出 labelID 的集合,多对 label 的查询会对 labelID 集合求交集。
2. 根据 labelID 和时间范围内的时间分片查询包含的 timestamp。
3. 根据 labelID 和 timestamp 查出所需的 value。
扯完这些没用的我们来聊些正经的。
我们为什么要做这样一个项目
在 2018 年下半年,PingCAP 组织的 Hackathon,当时作为萌新即将参加比赛,想着一定要文体两开花,弘扬开源文化。
萌生了四个想法:
TiKV TSDB
Machine Learning on TiSpark
魔改 TiKV + Lua 做成 mapreduce
geo 全文检索
核心想法
1. 能做出来,符合参赛要求。
2. 确实能解决生产问题而不是一个比赛项目。
摸了摸头发,觉得 ML on TiSpark 太硬核,根本做不完。
TiHaoop 也太硬核,也做不完。
geo 没在厂里的生产中遇到什么问题。
最后辗转反侧思考一番,拍脑袋决定双线操作,做基于 TiKV 的 TSDB 和 TiKV + Lua,完成时序检索功能的同时,增加更丰富的算子(比赛前两天才想好做什么)。
比赛过程
周五
原计划,提前看看 rust,作为 rust 萌新。
于是前一天和同事借了本 rust 书,准备一天速成 rust。
后来发现还是看电视剧更管用。
Day 1(周六)
周六参加比赛的时候,原以为会有个很长的开场致辞,所以决定 10 点再去。
到了现场,发现大家已经开始撸代码了???
整体过程还算顺利,但其中也遇到了一些问题。
Prometheus 的依赖和 TiKV 的一些依赖不兼容,于是 fork 一份 Prometheus 依赖,野路子改两行,兼容了。
下午 5 点的时候,时序基本实现了,但联调发现有数据读写不一致的情况。因菜哥的一个 bug 导致,然后开始了漫长的 debug,一共历时 5 个小时(特别说明,我们组叫菜哥和他的朋友们)。
晚 10 点,准备回家了,不准备再 debug 了,一个 bug 查了 5 个小时。作为娱乐队,熬夜写代码是不可能。
各回各家,各找各妈。
Day 2(周日)
开始漫长的半天精通 Lua 虚拟机 + rust。
也遇到了一些问题,比如为什么 TiKV 编译这么慢???一天只有 24 次编译机会???
下午 2 点,作为第一个讲的团队,及时生成了一个 PPT ,毕竟 PPT 工程师的基础还在。
一周后的周一
之前写的渣代码,简单写了个 README。抱着尝试的心态,给 Prometheus adapter 提了个 PR。
然后,居然被合进去了!!!
一下午写的代码居然被合进去了!!!
成果
彻底打通了 TiKV 和 Prometheus。
为 TiKV 的时序存储和计算提供了一个思路(之前做过 TiDB 存储时序数据)。
为 Prometheus 的长存储提供了一个还算好用的方案(M3 其实还可以,Thanos 是分片机制,不能算真正意义的分布式存储)。
已在公司生产环境试用,需要经过大数据量的测试,如果没问题计划替代现有方案。
感悟
参加 Hackathon,和周末加两天班没有太大的区别。
最先开始来,只是想混个奖品,比如说书包。去年参加 DevCon 给的布袋用了一年,还没坏,今年准备再领一个。
见到了很多年龄比我们小,但技术又还不错的小伙伴,比如兰海他们组,udf 那个组。也见到了一些年龄稍长的参赛者。
他们的存在,让我们在充满杂事的日常工作中又有了继续奋斗的动力。
似乎,当时选择这个行业没有错,而不仅仅是一份工作。
Just for fun。
感谢
感谢唐刘老师和申砾老师的指导。
感谢 PingCAP 举办了这场大型网友见面活动,收获颇丰。
项目地址:
https://github.com/bragfoo/TiPrometheus
(代码比较渣,思路供参考)。
打个广告:
由菜哥和他的朋友们翻译的书:《Go 语言并发之道》已登陆京东、淘宝。非常棒一本 Go 语言书籍,搜索即可购买。
参考资料:
1. https://fabxc.org/tsdb/
2. https://docs.influxdata.com/influxdb/v1.7/concepts/storage_engine/
3. https://github.com/prometheus/prometheus/tree/release-1.8/storage
<iframe class="video_iframe" data-vidtype="1" data-cover="http%3A%2F%2Fshp.qpic.cn%2Fqqvideo_ori%2F0%2Fe0808m31qbv_496_280%2F0" allowfullscreen="" frameborder="0" data-ratio="1.7777777777777777" data-w="864" data-src="http://v.qq.com/iframe/player.html?vid=e0808m31qbv&width=368&height=207&auto=0" width="368" height="207" data-vh="207" data-vw="368" style="display: none; width: 368px !important; height: 207px !important;"></iframe>
(?0:02:00 开始)菜哥队 Demo 演示
社区大事件
年度最高规格的 TiDB 技术大会——TiDB DevCon 2019 将于 2019 年 1 月 19 日在北京举办。欢迎大家报名参加!活动详情?
* TiDB Committers & Contributors 可以享受【社区贡献者注册】免费权益。
* TiDB 社区贡献者即 GitHub 上以下 15 个 Repositories 的代码贡献者:
docs-cn | docs | grpc-rs | jepsen | parser | pd | tidb-ansible | tidb-bench | tidb-docker-compose | tidb-operator | tidb | tidb-tools | tikv | tipb | tispark
关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

随时掌握互联网精彩
- 1 为强国复兴伟业凝心聚力 7904251
- 2 哈佛近7000名留学生怎么办 7809094
- 3 哈佛大学现有外国学生必须转学 7713069
- 4 民营经济促进法施行 这些值得关注 7615947
- 5 张学友演唱会撞期高考遭多人投诉 7520541
- 6 武汉暴雨 家长划桨板接娃 7426758
- 7 网警重拳打击侵公犯罪 7328286
- 8 #特朗普哈佛什么仇什么怨# 7231519
- 9 黄杨钿甜删除百万耳环照片 7142313
- 10 莫斯科连续三天遭袭 普京最新表态 7046201