上圖為 Prometheus 的官方系統(tǒng)架構(gòu)圖,而實(shí)現(xiàn) TiPrometheus ,用到了上圖中沒(méi)有體現(xiàn)到的一個(gè) Prometheus 的功能:Remote Storage ,如其名所示,其主要功能是給 Prometheus 提供了遠(yuǎn)程寫(xiě)的能力,這個(gè)功能對(duì)于查詢(xún)是透明的,主要用于長(zhǎng)存儲(chǔ)。而我們當(dāng)時(shí)的 TiPrometheus 實(shí)現(xiàn)了基于 TiKV 以及 PD 實(shí)現(xiàn)的 Prometheus 的 Remote Storage 。

核心實(shí)現(xiàn)

Prometheus 記錄的數(shù)據(jù)結(jié)構(gòu)分為兩部分 Label 及 Samples 。 Label 記錄了一些特征信息,Samples 包含了指標(biāo)數(shù)據(jù)和 Timestamp 。

Label 和時(shí)間范圍結(jié)合,可以查詢(xún)到需要的 Value 。

為了查詢(xún)這些記錄,需要構(gòu)建兩種索引 Label Index 和 Time Index ,并以特殊的 Key 存儲(chǔ) Value 。

l Label Index

每對(duì) Label 為會(huì)以 index:label:<name>#<latency> 為 key ,labelID 為 Value 存入。新的記錄會(huì) “,” 分割追加到 Value 后面。這是一種搜索中常用的倒排索引。

l Time Index

每個(gè) Sample 項(xiàng)會(huì)以 index:timeseries:<labelID>:<splitTime> 為 Key,Timestamp 為 Value ,SplitTime 為時(shí)間切片的起始點(diǎn)。追加的 Timestamp 同樣以”,”分割。

l Doc 存儲(chǔ)

我們將每一條 Samples 記錄以 timeseries:doc:<labelID>:<timestamp> 為 Key 存入 TiKV ,其中 LabelID 是 Label 全文的散列值。

下面做一個(gè)梳理:

寫(xiě)入過(guò)程

1. 生成 labelID

2. 構(gòu)建 time index,index:timeseries:<labelID>:<splitTime>”ts,ts”

3. 寫(xiě)入時(shí)序數(shù)據(jù) timeseries:doc:<labelID>:<timestamp> “value”

4. 寫(xiě)入時(shí)序數(shù)據(jù) timeseries:doc:<labelID>:<timestamp> “value”

查詢(xún)過(guò)程

1. 根據(jù)倒排索引查出 labelID 的集合,多對(duì) Label 的查詢(xún)會(huì)對(duì) labelID 集合求交集。

2. 根據(jù) labelID 和時(shí)間范圍內(nèi)的時(shí)間分片查詢(xún)包含的 Timestamp 。

3. 根據(jù) labelID 和 Timestamp 查出所需的 Value 。

Why TiPrometheus

該項(xiàng)目最初源于參加 PingCAP 組織的 Hackathon ,當(dāng)時(shí)希望與參與者一起完成大家腦海里的想法,其實(shí)最重要的事情就是,做出來(lái)的東西并不是為了單純的 Demo ,而是要做一個(gè)在實(shí)際工作中應(yīng)用于生產(chǎn)環(huán)境的實(shí)際能力,且能解決生產(chǎn)中的問(wèn)題。

剛開(kāi)始還有過(guò)各種奇思妙想,包括在 TiSpark 上做一套 ML ,Hadoop over TiKV 等,不過(guò)這些想法實(shí)現(xiàn)起來(lái)都有些過(guò)于硬核,對(duì)于只有兩天工作時(shí)間就需要完成的項(xiàng)目來(lái)說(shuō),可能性太?。换蛘哒f(shuō),如果希望實(shí)現(xiàn) Demo ,所需 Hack 的點(diǎn)過(guò)多。而 GEO 全文檢索在融云現(xiàn)有的生產(chǎn)上,以及現(xiàn)有的系統(tǒng)中,也并沒(méi)有需要去填補(bǔ)的大坑,因此,也就沒(méi)有什么必要去在這方面花費(fèi)力氣去解決一個(gè)并不存在的問(wèn)題。

由于 IM 服務(wù)是一種計(jì)算密集型的服務(wù),且服務(wù)質(zhì)量是融云的核心競(jìng)爭(zhēng)力;而目前存儲(chǔ)資源呈現(xiàn)出零散分布的節(jié)點(diǎn),且每個(gè)節(jié)點(diǎn)的存儲(chǔ)資源使用率并不高,為了最大化利用現(xiàn)有的閑置資源,融云最終設(shè)計(jì)并實(shí)現(xiàn)了這套 TiPrometheus 系統(tǒng)。

Result

打通了 TiKV 與 Prometheus ,為基于 K , V 存儲(chǔ)的時(shí)序數(shù)據(jù)庫(kù)設(shè)計(jì)提供了一個(gè)可行的思路。

為 Prometheus 的長(zhǎng)存儲(chǔ)提供了一套實(shí)用的解決方案。

已經(jīng)在融云內(nèi)部生產(chǎn)環(huán)境中進(jìn)行部署與試用,并將逐步替換現(xiàn)有方案。

分享到

xiesc

相關(guān)推薦