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