摘要:根據(jù)和查出所需的。因菜哥的一個(gè)導(dǎo)致,然后開(kāi)始了漫長(zhǎng)的,一共歷時(shí)個(gè)小時(shí)特別說(shuō)明,我們組叫菜哥和他的朋友們。
本文作者是菜哥和他的朋友們隊(duì)的于暢同學(xué),他們的項(xiàng)目 TiPrometheus 已經(jīng)被 Prometheus adapter 合并。該項(xiàng)目分兩個(gè)小項(xiàng)目,分別解決了時(shí)序數(shù)據(jù)的存儲(chǔ)與計(jì)算問(wèn)題。存儲(chǔ)主要兼容 Prometheus 語(yǔ)法和數(shù)據(jù)格式,實(shí)現(xiàn)了精確查詢、模糊查詢,完全兼容現(xiàn)有語(yǔ)法。所有數(shù)據(jù)僅存在 TiKV 中。計(jì)算主要通過(guò) TiKV 調(diào)用 Lua 實(shí)現(xiàn),通過(guò) Lua 動(dòng)態(tài)擴(kuò)展實(shí)現(xiàn)數(shù)據(jù)計(jì)算的功能。項(xiàng)目簡(jiǎn)介
既然你關(guān)注了 TiDB, 想必你一定是個(gè)關(guān)注 Infrastructure 的硬漢(妹)子。監(jiān)控作為 Infra 不可或缺的一環(huán),其核心便是 TSDB(time series database) 。
TSDB 是一種以時(shí)間為主要索引的數(shù)據(jù)庫(kù),主要用來(lái)存儲(chǔ)大量以時(shí)間為序列的指標(biāo)數(shù)據(jù),數(shù)據(jù)結(jié)構(gòu)也比較簡(jiǎn)單,通常包括特征信息,指標(biāo)數(shù)據(jù)和 timestamp。常見(jiàn)的 TSDB 包括 InfluxDB, OpenTSDB, Prometheus。
而 Prometheus 是一整套監(jiān)控系統(tǒng),時(shí)序數(shù)據(jù)庫(kù)是它的存儲(chǔ)部分,下面這張架構(gòu)圖來(lái)自于 Prometheus 官方,簡(jiǎn)單概括了其架構(gòu)和生態(tài)的組成。
Prometheus 還支持一個(gè)圖上沒(méi)有體現(xiàn)的功能 Remote Storage,可以進(jìn)行遠(yuǎn)程的讀寫(xiě),對(duì)查詢是透明的。這個(gè)功能主要是用來(lái)做長(zhǎng)存儲(chǔ)。我們的項(xiàng)目就是實(shí)現(xiàn)了一個(gè)基于 TiKV 的 TSDB 來(lái)做 Prometheus 的 Remote Storage。
核心實(shí)現(xiàn)Prometheus 記錄的數(shù)據(jù)結(jié)構(gòu)分為兩部分 label, samples。label 記錄了一些特征信息。samples 包含了指標(biāo)數(shù)據(jù)和 timestamp。
"labels": [{ "job": "node", "instance": "123.123.1.211:9090", }] "samples":[{ "timestamp": 1473305798 "value": 0.9 }]
label 和時(shí)間范圍結(jié)合,可以查詢到需要的 value。
為了查詢這些記錄,我們需要構(gòu)建兩種索引 label index 和 time index,并以特殊的 key 存儲(chǔ) value。
label index每對(duì) label 為會(huì)以 index:label:
每個(gè) sample 項(xiàng)會(huì)以 index:timeseries:
我們將每一條 samples 記錄以 timeseries:doc:
下面做一個(gè)梳理
寫(xiě)入過(guò)程生成 labelID
構(gòu)建 label index,index:label:
構(gòu)建 time index,index:timeseries:
寫(xiě)入時(shí)序數(shù)據(jù),timeseries:doc:
根據(jù)倒排索引查出 labelID 的集合,多對(duì) label 的查詢會(huì)對(duì) labelID 集合求交集。
根據(jù) labelID 和時(shí)間范圍內(nèi)的時(shí)間分片查詢包含的 timestamp。
根據(jù) labelID 和 timestamp 查出所需的 value。
扯完這些沒(méi)用的我們來(lái)聊些正經(jīng)的。我們?yōu)槭裁匆鲞@樣一個(gè)項(xiàng)目
在 2018 年下半年,PingCAP 組織的 Hackathon,當(dāng)時(shí)作為萌新即將參加比賽,想著一定要文體兩開(kāi)花,弘揚(yáng)開(kāi)源文化。
萌生了四個(gè)想法:
TiKV TSDB
Machine Learning on TiSpark
魔改 TiKV + Lua 做成 mapreduce
geo 全文檢索
核心想法能做出來(lái),符合參賽要求。
確實(shí)能解決生產(chǎn)問(wèn)題而不是一個(gè)比賽項(xiàng)目。
摸了摸頭發(fā),覺(jué)得 ML on TiSpark 太硬核,根本做不完。
TiHaoop 也太硬核,也做不完。
geo 沒(méi)在廠里的生產(chǎn)中遇到什么問(wèn)題。
最后輾轉(zhuǎn)反側(cè)思考一番,拍腦袋決定雙線操作,做基于 TiKV 的 TSDB 和 TiKV + Lua,完成時(shí)序檢索功能的同時(shí),增加更豐富的算子(比賽前兩天才想好做什么)。
比賽過(guò)程 周五原計(jì)劃,提前看看 rust,作為 rust 萌新。
于是前一天和同事借了本 rust 書(shū),準(zhǔn)備一天速成 rust。
后來(lái)發(fā)現(xiàn)還是看電視劇更管用。
Day1(周六)周六參加比賽的時(shí)候,原以為會(huì)有個(gè)很長(zhǎng)的開(kāi)場(chǎng)致辭,所以決定 10 點(diǎn)再去。
到了現(xiàn)場(chǎng),發(fā)現(xiàn)大家已經(jīng)開(kāi)始擼代碼了???
整體過(guò)程還算順利,但其中也遇到了一些問(wèn)題。
Prometheus 的依賴和 TiKV 的一些依賴不兼容,于是 fork 一份 Prometheus 依賴,野路子改兩行,兼容了。
下午 5 點(diǎn)的時(shí)候,時(shí)序基本實(shí)現(xiàn)了,但聯(lián)調(diào)發(fā)現(xiàn)有數(shù)據(jù)讀寫(xiě)不一致的情況。因菜哥的一個(gè) bug 導(dǎo)致,然后開(kāi)始了漫長(zhǎng)的 debug,一共歷時(shí) 5 個(gè)小時(shí)(特別說(shuō)明,我們組叫菜哥和他的朋友們)。
晚 10 點(diǎn),準(zhǔn)備回家了,不準(zhǔn)備再 debug 了,一個(gè) bug 查了 5 個(gè)小時(shí)。作為娛樂(lè)隊(duì),熬夜寫(xiě)代碼是不可能。
各回各家,各找各媽。
Day2(周日)開(kāi)始漫長(zhǎng)的半天精通 Lua 虛擬機(jī) + rust。
也遇到了一些問(wèn)題,比如為什么 TiKV 編譯這么慢???一天只有 24 次編譯機(jī)會(huì)???
下午 2 點(diǎn),作為第一個(gè)講的團(tuán)隊(duì),我們及時(shí)生成了一個(gè) PPT ,畢竟 PPT 工程師的基礎(chǔ)還在。
一周后的周一之前寫(xiě)的渣代碼,簡(jiǎn)單寫(xiě)了個(gè) README。抱著嘗試的心態(tài),給 Prometheus adapter 提了個(gè) PR。
然后,居然被合進(jìn)去了?。?!
一下午寫(xiě)的代碼居然被合進(jìn)去了!??!
成果徹底打通了 TiKV 和 Prometheus。
為 TiKV 的時(shí)序存儲(chǔ)和計(jì)算提供了一個(gè)思路(之前做過(guò) TiDB 存儲(chǔ)時(shí)序數(shù)據(jù))。
為 Prometheus 的長(zhǎng)存儲(chǔ)提供了一個(gè)還算好用的方案(M3 其實(shí)還可以,Thanos 是分片機(jī)制,不能算真正意義的分布式存儲(chǔ))。
已在公司生產(chǎn)環(huán)境試用,需要經(jīng)過(guò)大數(shù)據(jù)量的測(cè)試,如果沒(méi)問(wèn)題計(jì)劃替代現(xiàn)有方案。
感悟參加 Hackathon,和周末加兩天班沒(méi)有太大的區(qū)別。
最先開(kāi)始來(lái),只是想混個(gè)獎(jiǎng)品,比如說(shuō)書(shū)包。去年參加 DevCon 給的布袋用了一年,還沒(méi)壞,今年準(zhǔn)備再領(lǐng)一個(gè)。
見(jiàn)到了很多年齡比我們小,但技術(shù)又還不錯(cuò)的小伙伴,比如蘭海他們組,udf 那個(gè)組。也見(jiàn)到了一些年齡稍長(zhǎng)的參賽者。
他們的存在,讓我們?cè)诔錆M雜事的日常工作中又有了繼續(xù)奮斗的動(dòng)力。
似乎,當(dāng)時(shí)選擇這個(gè)行業(yè)沒(méi)有錯(cuò),而不僅僅是一份工作。
Just for fun。
感謝感謝唐劉老師和申礫老師的指導(dǎo)。
感謝 PingCAP 舉辦了這場(chǎng)大型網(wǎng)友見(jiàn)面活動(dòng),收獲頗豐。
項(xiàng)目地址:https://github.com/bragfoo/TiPrometheus (代碼比較渣,思路供參考)
打個(gè)廣告:由菜哥和他的朋友們翻譯的書(shū):《Go 語(yǔ)言并發(fā)之道》已登陸京東、淘寶。
非常棒一本 Go 語(yǔ)言書(shū)籍,搜索即可購(gòu)買(mǎi)。
參考資料:
https://fabxc.org/tsdb/
https://docs.influxdata.com/influxdb/v1.7/concepts/storage_engine/
https://github.com/prometheus/prometheus/tree/release-1.8/storage
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/17870.html
摘要:當(dāng)我們正準(zhǔn)備做前期調(diào)研和設(shè)計(jì)的時(shí)候,主辦方把唐長(zhǎng)老拉去做現(xiàn)場(chǎng)導(dǎo)師,參賽規(guī)則規(guī)定導(dǎo)師不能下場(chǎng)比賽,囧,于是就這樣被被動(dòng)放了鴿子。川總早早來(lái)到現(xiàn)場(chǎng)。 本文作者是來(lái)自 TiBoys 隊(duì)的崔秋同學(xué),他們的項(xiàng)目 TBSSQL 在 TiDB Hackathon 2018 中獲得了一等獎(jiǎng)。TiDB Batch and Streaming SQL(簡(jiǎn)稱 TBSSQL)擴(kuò)展了 TiDB 的 SQL 引擎...
摘要:本文由紅鳳凰粉鳳凰粉紅鳳凰隊(duì)的成員主筆,他們的項(xiàng)目在本屆中獲得了二等獎(jiǎng)。用戶在平臺(tái)上進(jìn)行第一章部署的學(xué)習(xí),了解到可以通過(guò)進(jìn)行部署。收到事件后,更新。由于位置是由屬性給出的,因此為其加上,即可實(shí) 本文由紅鳳凰粉鳳凰粉紅鳳凰隊(duì)的成員主筆,他們的項(xiàng)目 TiDB Lab?在本屆 TiDB Hackathon 2018 中獲得了二等獎(jiǎng)。TiDB Lab 為 TiDB 培訓(xùn)體系增加了一個(gè)可以動(dòng)態(tài)觀...
閱讀 3621·2023-04-25 14:57
閱讀 2625·2021-11-22 14:56
閱讀 2195·2021-09-29 09:45
閱讀 1829·2021-09-22 15:53
閱讀 3393·2021-08-25 09:41
閱讀 965·2019-08-29 15:22
閱讀 3359·2019-08-29 13:22
閱讀 3192·2019-08-29 13:08