軟件工程師Fabian Reinartz喜歡用GO語(yǔ)言造輪子,熱衷于解決難題。他是普羅米修斯的捍衛(wèi)者和庫(kù)本內(nèi)特斯儀器公司的聯(lián)合創(chuàng)始人。過(guò)去,他是SoundCloud的在線工程師,領(lǐng)導(dǎo)CoreOS的監(jiān)控團(tuán)隊(duì)?,F(xiàn)在他在谷歌工作。
巴特克·普羅特卡是“不可能”的基礎(chǔ)設(shè)施軟件工程師。他對(duì)一些新興技術(shù)和分布式系統(tǒng)很感興趣。憑借他在英特爾底層開(kāi)發(fā)部門的工作背景、他之前作為中型企業(yè)貢獻(xiàn)者的經(jīng)歷以及他在SRE的全球經(jīng)驗(yàn),他專注于與微服務(wù)相關(guān)的改進(jìn)工作。他最喜歡的三個(gè)是Golang,開(kāi)源軟件,排球。
也許從我們的旗艦產(chǎn)品SpatialOS中不難猜到,Bidental面臨的需求是一個(gè)高度動(dòng)態(tài)的云基礎(chǔ)架構(gòu),具有全球規(guī)模,運(yùn)行著幾十個(gè)Kubernetes集群。為了讓它們繼續(xù)運(yùn)行,我們成了普羅米修斯監(jiān)控系統(tǒng)的早期用戶。普羅米修斯可以實(shí)時(shí)跟蹤數(shù)百萬(wàn)個(gè)監(jiān)控指標(biāo),并提供了強(qiáng)大的查詢語(yǔ)言,用戶可以通過(guò)該語(yǔ)言從這些指標(biāo)中提取有用的信息。
普羅米修斯簡(jiǎn)單可靠的運(yùn)維模式是其主要賣點(diǎn)之一。但是,形成一定規(guī)模后,我們發(fā)現(xiàn)了一些不足。為了解決這些問(wèn)題,今天我們正式發(fā)布了滅霸項(xiàng)目[1],這是一個(gè)不可思議的開(kāi)源項(xiàng)目,它可以無(wú)縫地將世界上現(xiàn)有的普羅米修斯部署轉(zhuǎn)換成一個(gè)統(tǒng)一的監(jiān)控系統(tǒng),支持無(wú)限的歷史數(shù)據(jù)存儲(chǔ)。
我們發(fā)展滅霸的目的
在一定的集群規(guī)模下,當(dāng)負(fù)載超過(guò)普通普羅米修斯集群的承載能力后,就會(huì)暴露出一些問(wèn)題。如何才能經(jīng)濟(jì)可靠地存儲(chǔ)PB級(jí)歷史數(shù)據(jù)?我們能做到這一點(diǎn)而不犧牲查詢響應(yīng)時(shí)間嗎?我們可以通過(guò)一個(gè)查詢界面訪問(wèn)不同普羅米修斯服務(wù)器上的所有索引數(shù)據(jù)嗎?此外,我們能否以某種方式合并通過(guò)普羅米修斯高可用性集群收集的復(fù)制數(shù)據(jù)?
作為這些問(wèn)題的答案,我們創(chuàng)建了滅霸項(xiàng)目。在下一節(jié)中,我們將描述在開(kāi)發(fā)滅霸之前我們是如何避免這些功能缺陷的,并詳細(xì)介紹我們?cè)O(shè)想的一些目標(biāo)。
全局查詢視圖
普羅米修斯主張按功能分裂。即使是一臺(tái)普羅米修斯服務(wù)器也可以為幾乎所有用例提供足夠的可擴(kuò)展性,將用戶從水平擴(kuò)展的復(fù)雜性中解放出來(lái)。
雖然這是一個(gè)很棒的部署模型,但是用戶經(jīng)常希望通過(guò)同一個(gè)API或UI,即全局視圖來(lái)訪問(wèn)所有數(shù)據(jù)。例如,您可以在一個(gè)Grafana廣告牌上呈現(xiàn)多個(gè)查詢視圖,但每個(gè)查詢只能針對(duì)一個(gè)普羅米修斯服務(wù)器。另一方面,如果您使用滅霸,用戶將能夠從多個(gè)普羅米修斯服務(wù)器查詢和聚合數(shù)據(jù),因?yàn)樗羞@些數(shù)據(jù)都可以從一個(gè)端點(diǎn)獲得。
在此之前,為了實(shí)現(xiàn)全局視圖,我們將我們的普羅米修斯實(shí)例組織成一個(gè)多級(jí)分層聯(lián)盟[2]。這意味著需要建立一個(gè)元普羅米修斯服務(wù)器來(lái)從每個(gè)“葉子”服務(wù)器收集一些數(shù)據(jù)。
這種方法最終證明是有問(wèn)題的。導(dǎo)致配置負(fù)擔(dān)越來(lái)越重,增加了額外的潛在故障點(diǎn),需要在聯(lián)盟節(jié)點(diǎn)上配置一些復(fù)雜的規(guī)則,只暴露部分?jǐn)?shù)據(jù)。此外,這種聯(lián)盟沒(méi)有實(shí)現(xiàn)真正的全局視圖,因?yàn)椴皇撬械臄?shù)據(jù)都可以從一個(gè)查詢接口獲得。
與之密切相關(guān)的是由一對(duì)普羅米修斯高可用性服務(wù)器收集的數(shù)據(jù)提供的統(tǒng)一視圖。普羅米修斯的高可用模型是分別收集兩次數(shù)據(jù),非常簡(jiǎn)單。然而,獲得兩個(gè)數(shù)據(jù)流的合并和重復(fù)數(shù)據(jù)消除視圖是一個(gè)巨大的可用性改進(jìn)。
毫無(wú)疑問(wèn),我們需要一個(gè)高度可用的普羅米修斯集群。在“不可能”,我們非常重視監(jiān)控每分鐘收集的數(shù)據(jù)。但是,在每個(gè)集群中部署一個(gè)普羅米修斯實(shí)例意味著存在單點(diǎn)故障的風(fēng)險(xiǎn)。任何配置錯(cuò)誤或硬件故障都可能導(dǎo)致重要監(jiān)控結(jié)果的丟失。即使是簡(jiǎn)單的釋放也可能導(dǎo)致指示器收集的小中斷,因?yàn)橹貑⒖赡鼙纫淮问占臅r(shí)間間隔長(zhǎng)得多。
可靠的歷史數(shù)據(jù)存儲(chǔ)
我們的夢(mèng)想之一(也是普羅米修斯用戶的共同夢(mèng)想)就是擁有一個(gè)廉價(jià)、及時(shí)的長(zhǎng)期索引存儲(chǔ)。在“不可能”,我們使用了普羅米修斯1.8,我們被迫將索引保留策略設(shè)置為尷尬的9天。這就增加了一個(gè)明顯的操作限制,就是我們可以通過(guò)監(jiān)控圖回看多久以前。
普羅米修斯2.0在這方面提供了很多幫助,時(shí)間序列數(shù)據(jù)量不再影響整體服務(wù)器性能(請(qǐng)參考法比安在KubeCon [3]上關(guān)于普羅米修斯2的演講)。然而,普羅米修斯仍然將指示器數(shù)據(jù)保存在其本地磁盤(pán)上。雖然高效的數(shù)據(jù)壓縮可以在本地SSD磁盤(pán)上獲得顯著優(yōu)勢(shì),但最終可以存儲(chǔ)的歷史數(shù)據(jù)量仍然有限。
此外,在“不可能”,我們注重可用性、簡(jiǎn)單性和成本。較大的本地磁盤(pán)更難操作和備份。它們更昂貴,需要更多的備份工具,帶來(lái)了不必要的復(fù)雜性。
下采樣(下采樣)
一旦我們開(kāi)始查詢歷史數(shù)據(jù),我們很快就意識(shí)到,當(dāng)我們搜索數(shù)周、數(shù)月甚至數(shù)年的數(shù)據(jù)時(shí),這里的巨大復(fù)雜性會(huì)使查詢?cè)絹?lái)越慢。
通常解決這個(gè)問(wèn)題的方法叫做下采樣,這是一個(gè)降低信號(hào)采樣率的過(guò)程。我們可以“縮小”到更大的時(shí)間范圍,同時(shí)保持相同數(shù)量的樣本數(shù)據(jù),從而確保查詢響應(yīng)的速度。
舊數(shù)據(jù)的下采樣是任何長(zhǎng)期存儲(chǔ)解決方案的必然要求,超出了普通普羅米修斯集群的范圍。
其他目標(biāo)
滅霸項(xiàng)目的最初目標(biāo)之一是無(wú)縫集成任何現(xiàn)有的普羅米修斯實(shí)例。第二個(gè)目標(biāo)是運(yùn)營(yíng)盡量簡(jiǎn)單,準(zhǔn)入門檻盡量低。如果有依賴的話,應(yīng)該很容易滿足大小用戶的需求,也就是說(shuō)基準(zhǔn)成本可以忽略不計(jì)。
滅霸的建筑
在最后一部分,我們列出了一些預(yù)期目標(biāo)。讓我們看看這些列表,看看滅霸是如何解決這些問(wèn)題的。
全局視圖
為了獲得現(xiàn)有普羅米修斯集群的全局視圖,我們需要將中央查詢層與所有服務(wù)器互連。滅霸西得卡[4]組件扮演著這樣的角色,它將被部署到每一個(gè)運(yùn)行的普羅米修斯服務(wù)器端。它充當(dāng)代理服務(wù)器,并通過(guò)滅霸標(biāo)準(zhǔn)化的基于gRPC的商店應(yīng)用編程接口提供普羅米修斯的本地?cái)?shù)據(jù)。它還允許通過(guò)標(biāo)簽和時(shí)間段選擇時(shí)間序列數(shù)據(jù)。
運(yùn)行在另一端的是一個(gè)水平可伸縮的無(wú)狀態(tài)的Querier組件,在回答PromQL查詢時(shí)比標(biāo)準(zhǔn)的普羅米修斯HTTP API做的多一點(diǎn)。Querier、Sidecar和其他滅霸組件通過(guò)八卦協(xié)議進(jìn)行通信。
當(dāng)Querier收到一個(gè)請(qǐng)求時(shí),它會(huì)向相關(guān)的Store API服務(wù)器(這里是我們的Sidecar)發(fā)送一個(gè)請(qǐng)求,并從他們的普羅米修斯服務(wù)器獲取時(shí)間序列數(shù)據(jù)。
它聚合這些響應(yīng)的數(shù)據(jù),并對(duì)它們執(zhí)行PromQL查詢。它可以為普羅米修斯的高可用性組聚合不相交的數(shù)據(jù)或消除重復(fù)數(shù)據(jù)。
它通過(guò)將完全分離的普羅米修斯部署集成到我們數(shù)據(jù)的全局視圖中,解決了我們問(wèn)題的核心困難。事實(shí)上,滅霸可以這樣部署,這些功能可以根據(jù)需要使用。根本不需要改變現(xiàn)有的普羅米修斯服務(wù)器!
保持無(wú)限數(shù)據(jù)!
但是,遲早我們會(huì)想要保留一些超過(guò)普羅米修斯常規(guī)保留時(shí)間的數(shù)據(jù)。為此,我們決定使用對(duì)象存儲(chǔ)系統(tǒng)來(lái)備份我們的歷史數(shù)據(jù)。它廣泛應(yīng)用于每一個(gè)云甚至大多數(shù)本地?cái)?shù)據(jù)中心,性價(jià)比非常高。此外,幾乎所有對(duì)象存儲(chǔ)解決方案都可以通過(guò)著名的S3應(yīng)用編程接口訪問(wèn)。
普羅米修斯的存儲(chǔ)引擎大約每?jī)蓚€(gè)小時(shí)將最新的內(nèi)存數(shù)據(jù)寫(xiě)入磁盤(pán)。持久數(shù)據(jù)塊包含固定時(shí)間范圍內(nèi)的所有數(shù)據(jù),并且是不可變的。這很有用,因?yàn)橥ㄟ^(guò)這種方式,滅霸西得卡可以簡(jiǎn)單地監(jiān)聽(tīng)普羅米修斯的數(shù)據(jù)目錄更改,然后在新數(shù)據(jù)塊出現(xiàn)時(shí)將其上傳到對(duì)象桶。
寫(xiě)入磁盤(pán)后通過(guò)Sidecar將索引數(shù)據(jù)塊上傳到對(duì)象存儲(chǔ)的另一個(gè)優(yōu)點(diǎn)是,它可以保持“刮板”(由普羅米修斯及其支持的滅霸Sidecar組成)足夠輕。這簡(jiǎn)化了操作和維護(hù)、成本和系統(tǒng)設(shè)計(jì)。
備份我們的數(shù)據(jù)很容易。再?gòu)膶?duì)象存儲(chǔ)中查詢數(shù)據(jù)怎么樣?
滅霸存儲(chǔ)組件充當(dāng)對(duì)象存儲(chǔ)中數(shù)據(jù)的數(shù)據(jù)檢索代理。就像滅霸Sidecar一樣,它會(huì)加入八卦集群,實(shí)現(xiàn)Store API。這樣,現(xiàn)有的Querier就可以像Sidecar一樣把它作為時(shí)間序列數(shù)據(jù)的另一個(gè)數(shù)據(jù)源——無(wú)需任何特殊處理。
時(shí)間序列的數(shù)據(jù)塊由一些大文件組成。按需下載效率不高,需要巨大的內(nèi)存和磁盤(pán)空才能本地緩存。
相反,Store Gateway知道如何處理普羅米修斯存儲(chǔ)引擎的數(shù)據(jù)格式。通過(guò)智能查詢規(guī)劃和僅緩存必要索引部分的數(shù)據(jù)塊,它可以將一些復(fù)雜的查詢降級(jí)為對(duì)對(duì)象存儲(chǔ)中最小數(shù)量文件的HTTP范圍請(qǐng)求。這樣,它可以將原始請(qǐng)求的數(shù)量減少4到6個(gè)數(shù)量級(jí),而不影響響應(yīng)時(shí)間。總的來(lái)說(shuō),很難區(qū)分這和在本地SSD上查詢數(shù)據(jù)的區(qū)別。
如上圖所示,滅霸·克雷耶利用普羅米修斯存儲(chǔ)格式(可以在塊文件中共存相關(guān)數(shù)據(jù))的特點(diǎn),顯著降低了對(duì)象存儲(chǔ)產(chǎn)品的單次請(qǐng)求成本??紤]到這一點(diǎn),我們可以將多個(gè)字節(jié)的提取聚合成最少數(shù)量的批處理調(diào)用。
壓縮和下采樣(壓縮和下采樣)
從時(shí)間序列中的新數(shù)據(jù)塊成功上傳到對(duì)象存儲(chǔ)的那一刻起,我們就可以將其視為存儲(chǔ)網(wǎng)關(guān)上可用的“歷史”數(shù)據(jù)。
但是,經(jīng)過(guò)一段時(shí)間后,來(lái)自單個(gè)數(shù)據(jù)源(即運(yùn)行Sidecar的普羅米修斯實(shí)例)的這些數(shù)據(jù)塊會(huì)逐漸積累,但索引的全部潛力無(wú)法得到充分利用。為了解決這個(gè)問(wèn)題,我們引入了一個(gè)名為Compactor的單一組件。它只是將普羅米修斯的本地壓縮機(jī)制應(yīng)用于對(duì)象存儲(chǔ)中的歷史數(shù)據(jù),并可以作為一個(gè)簡(jiǎn)單的調(diào)度批處理任務(wù)來(lái)執(zhí)行。
得益于普羅米修斯高效的樣本壓縮技術(shù),從數(shù)據(jù)大小來(lái)看,長(zhǎng)時(shí)間查詢多個(gè)序列不是問(wèn)題。然而,數(shù)十億個(gè)樣本數(shù)據(jù)的解壓縮和這些樣本的查詢處理的潛在成本必然會(huì)導(dǎo)致查詢延遲的急劇增加。另一方面,因?yàn)槊總€(gè)可用的屏幕像素上有數(shù)百個(gè)數(shù)據(jù)點(diǎn),所以即使是全分辨率數(shù)據(jù)也無(wú)法渲染。這也使得下采樣不僅可行,而且不會(huì)造成明顯的精度損失。
為了生成下采樣數(shù)據(jù),壓實(shí)機(jī)將連續(xù)聚合序列數(shù)據(jù),分辨率為5分鐘1小時(shí)。對(duì)于通過(guò)TSDB異或壓縮編碼的每個(gè)原始數(shù)據(jù)塊,它將存儲(chǔ)幾種不同類型的聚合數(shù)據(jù),例如,最小值、最大值或單個(gè)數(shù)據(jù)塊的總值。這使得query er能夠?yàn)榻o定的PromQL查詢自動(dòng)選擇合適的聚合數(shù)據(jù)。
從用戶的角度來(lái)看,不需要對(duì)采樣后的數(shù)據(jù)進(jìn)行任何特殊的配置來(lái)使用。當(dāng)用戶放大和縮小時(shí),查詢器會(huì)自動(dòng)在不同分辨率和原始數(shù)據(jù)之間切換?;蛘撸脩艨梢酝ㄟ^(guò)指定用戶定義的“步驟”來(lái)直接控制查詢參數(shù)。
由于每GB的存儲(chǔ)成本非常低,默認(rèn)情況下,滅霸將始終在存儲(chǔ)中維護(hù)分辨率為五分鐘一小時(shí)的原始數(shù)據(jù),因此無(wú)需刪除原始數(shù)據(jù)。
記錄規(guī)則(記錄規(guī)則)
即使在滅霸,日志記錄規(guī)則仍然是監(jiān)控堆棧的重要組成部分。它們降低了查詢的復(fù)雜性、延遲和成本。它們還為用戶提供了查看指標(biāo)數(shù)據(jù)的重要匯總視圖的便捷快捷方式。滅霸基于普通的普羅米修斯實(shí)例,所以在現(xiàn)有的普羅米修斯服務(wù)器中保留記錄規(guī)則和警報(bào)規(guī)則是完全有效的。但是,對(duì)于以下情況,這可能還不夠:
全局的告警和規(guī)則(例如:當(dāng)三個(gè)集群中的兩個(gè)以上的集群里的服務(wù)宕機(jī)時(shí)發(fā)出告警)超出單臺(tái)Prometheus本地保留數(shù)據(jù)的規(guī)則希望將所有規(guī)則和告警存儲(chǔ)在一個(gè)地方為了解決這些問(wèn)題,滅霸提供了一個(gè)名為統(tǒng)治者的獨(dú)立組件,它將執(zhí)行規(guī)則并基于滅霸·克雷耶發(fā)出警報(bào)。通過(guò)發(fā)布眾所周知的存儲(chǔ)API,查詢節(jié)點(diǎn)可以訪問(wèn)新計(jì)算的索引數(shù)據(jù)。它們也備份到對(duì)象存儲(chǔ),并且可以通過(guò)存儲(chǔ)網(wǎng)關(guān)進(jìn)行訪問(wèn)。
滅霸的力量
滅霸非常靈活,可以根據(jù)用戶的使用場(chǎng)景進(jìn)行不同的設(shè)置。這在遷移普通普羅米修斯時(shí)特別有用。讓我們通過(guò)一個(gè)簡(jiǎn)單的例子快速回顧一下我們從滅霸組件中學(xué)到的東西。以下示例說(shuō)明了如何將您的普通普羅米修斯遷移到我們“無(wú)限保留指示器”的閃亮世界:
將Thanos Sidecar添加到你的Prometheus服務(wù)端 - 例如,在Kubernetes pod里運(yùn)行一個(gè)相鄰容器;部署一些Thanos Querier的副本以啟用數(shù)據(jù)瀏覽功能。與此同時(shí),用戶可以輕松地在Scraper和Querier之間配置一個(gè)gossip集群。使用thanos_cluster_members指標(biāo)來(lái)確認(rèn)所有組件都已連接。值得一提的是,僅這兩個(gè)步驟就足以實(shí)現(xiàn)從潛在的普羅米修斯高可用性副本和無(wú)縫重復(fù)數(shù)據(jù)消除中獲得的結(jié)果的全局視圖!只需將儀表板連接到查詢器HTTP端點(diǎn),或者直接使用滅霸用戶界面。
但是,如果您想實(shí)現(xiàn)指標(biāo)數(shù)據(jù)的備份和長(zhǎng)期保留,我們需要完成以下三個(gè)附加步驟:
創(chuàng)建一個(gè)AWS S3或GCS存儲(chǔ)桶。你只需要簡(jiǎn)單地配置一下Sidecar即可完成數(shù)據(jù)的備份。如今你也可以將本地保留策略配至最低。部署一個(gè)Store Gateway然后將它加入到現(xiàn)有的gossip集群。做到這一點(diǎn)的話我們的查詢便也可以訪問(wèn)到備份好的數(shù)據(jù)!部署Compactor,通過(guò)應(yīng)用壓縮和降準(zhǔn)采樣來(lái)提升長(zhǎng)期數(shù)據(jù)查詢的響應(yīng)能力。如果您想了解更多,請(qǐng)隨時(shí)查看我們的庫(kù)本內(nèi)特示例列表[5]和條目頁(yè)面[6]!
只需五個(gè)步驟,我們就可以將普羅米修斯實(shí)例組裝成一個(gè)強(qiáng)大的監(jiān)控系統(tǒng),為用戶提供全局視圖、無(wú)限的數(shù)據(jù)保留和高可用性的潛在指標(biāo)。
相關(guān)鏈接:
https://github.com/improbable-eng/thanoshttps://github.com/prometheus/prometheus/blob/master/docs/federation.md#hierarchical-federationhttps://www.youtube.com/watch?v=nDalewt4BOwhttps://kubernetes.io/blog/2015/06/the-distributed-system-toolkit-patterns/#example-1-sidecar-containershttps://github.com/improbable-eng/thanos/tree/master/kubehttps://github.com/improbable-eng/thanos/blob/master/docs/getting_started.md原文鏈接:https://improbable.io/games/blog/thanos-prometheus-at-scale
1.《thanos Thanos:開(kāi)源的大規(guī)模Prometheus集群解決方案》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無(wú)關(guān),侵刪請(qǐng)聯(lián)系頁(yè)腳下方聯(lián)系方式。
2.《thanos Thanos:開(kāi)源的大規(guī)模Prometheus集群解決方案》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來(lái)源地址,http://f99ss.com/guonei/1251035.html