2017年2月3日,F(xiàn)acebook宣布將開源他們的高性能時序數(shù)據(jù)存儲引擎Beringer。Beringei是用來解決其內部監(jiān)控數(shù)據(jù)存儲和查詢需求的數(shù)據(jù)庫,其特點是讀寫速度快,屬于內存數(shù)據(jù)庫的一種。本文將會詳細介紹Beringei的來龍去脈以及它的設計思路、應用場景和特點。
Beringei的誕生背景
運維大規(guī)模的分布式服務,通常需要對內部系統(tǒng)的運行狀況和性能指標進行實時并精確的監(jiān)控,以便在第一時間發(fā)現(xiàn)、診斷、處理出現(xiàn)的問題。
Facebook使用時間序列數(shù)據(jù)庫(TSDB)跟蹤和存儲系統(tǒng)度量指標,比如說產(chǎn)品的統(tǒng)計信息(每分鐘發(fā)送多少消息)、服務的統(tǒng)計信息(命中緩存層與MySQL層的查詢速率),以及系統(tǒng)的統(tǒng)計信息(CPU、內存和網(wǎng)絡的使用情況)等等,基于這些數(shù)據(jù)運維人員就可以看到基礎設施上的實時負載情況,并指定策略決定如何分配資源。
Facebook的每個系統(tǒng)、服務每秒需要向存儲引擎寫入成百上千個數(shù)據(jù)指標,而負責進行數(shù)據(jù)分析的工程師可以實時查詢這些數(shù)據(jù)。
2013年初,隨著公司和系統(tǒng)的不斷發(fā)展,F(xiàn)acebook的存儲引擎監(jiān)控團隊發(fā)現(xiàn)HBase使用的TSDB無法靈活擴展,導致未來可能無法處理高并發(fā)的讀取負載。如果是分析少量數(shù)據(jù),平均讀取延遲可以接受,但是試圖實時處理大量數(shù)據(jù)的需求無法滿足,用戶體驗很差。大批量數(shù)據(jù)查詢時間可能需要數(shù)秒鐘,這對于可能需要發(fā)出數(shù)百個或數(shù)千個查詢來執(zhí)行分析的自動化工具來說是不可接受的。幾千個時間序列的查詢請求要花幾十秒的時間來執(zhí)行,針對稀疏數(shù)據(jù)集執(zhí)行的查詢可能會超時,這是因為HBase數(shù)據(jù)存儲經(jīng)過調整后,策略改為優(yōu)先處理寫入操作。
由于查詢性能太差,監(jiān)控系統(tǒng)無法實時處理大規(guī)模分析。Facebook團隊在評估和否決了幾款基于磁盤的解決方案和現(xiàn)有的內存緩存解決方案后,存儲引擎開發(fā)團隊將注意力轉移到自行編寫內存TSDB方案,以支持Facebook的運行狀況和性能監(jiān)控系統(tǒng)。團隊在VLDB2015大會上發(fā)表了一篇名為《Gorilla:一種快速、可擴展的內存時間序列數(shù)據(jù)庫》的文章,Beringei正是基于這項工作成果的進一步發(fā)展。
Beringei的設計思路
Beringei基于BSD協(xié)議,它不同于其他的內存系統(tǒng)(比如Memcached),Beringei通過優(yōu)化,支持存儲專門用于運行狀況和性能監(jiān)控的時間序列數(shù)據(jù)。設計Beringei的初衷是為了更高的寫入速率和更低的讀取延遲,同時盡可能高效地使用內存來存儲時間序列數(shù)據(jù)。Facebook團隊創(chuàng)建了一種系統(tǒng),該系統(tǒng)可以存儲最近24小時內在Facebook生成的所有性能和監(jiān)控數(shù)據(jù),以便Facebook在生產(chǎn)環(huán)境中遇到問題后,可以極快地探究并調試系統(tǒng)和服務。
數(shù)據(jù)壓縮對于幫助降低存儲開銷必不可少。Facebook考慮了現(xiàn)有的壓縮方案,僅適用于整數(shù)數(shù)據(jù)的方法、使用近似技術的方法,以及需要對整個數(shù)據(jù)集進行操作的方法都被Facebook否決了。
Beringei使用一種無損耗數(shù)據(jù)流壓縮算法,壓縮時間序列里面的數(shù)據(jù)點,不進行跨時間序列的額外壓縮。每個數(shù)據(jù)點是一對64位值,表示當時計數(shù)器的時間戳和值。時間戳和值使用前一個值的信息單獨壓縮。時間戳壓縮使用delta-of-dalta編碼方式,通過采用規(guī)則的時間序列在較少的內存內存儲時間戳。
Facebook團隊分析了存儲的性能監(jiān)控系統(tǒng)中的數(shù)據(jù)后發(fā)現(xiàn),大多數(shù)時間序列中的值與相鄰數(shù)據(jù)點相比并沒有顯著的變化。此外,許多數(shù)據(jù)源只存儲整數(shù)(盡管系統(tǒng)支持浮點值)。
知道這一點后,只要使用XOR將當前值與先前值進行比較,然后存儲發(fā)生變化的比特。最終,該算法將整個數(shù)據(jù)集至少壓縮了90%。
使用場景及特點
創(chuàng)建一個簡單的共享服務和客戶端,后者可以存儲和處理時間序列查詢請求。
Beringei可以用作一個嵌入庫,處理高效存儲時間序列數(shù)據(jù)的底層細節(jié)。以這種方式使用Beringei類似RocksDB,Beringei有望成為支持其他性能監(jiān)控解決方案的高性能存儲系統(tǒng)。
Beringei作為庫的使用具有下列特點:
支持速度非??斓膬却娲鎯?,并由硬盤保證數(shù)據(jù)持久性。存儲引擎的查詢總是在內存張?zhí)幚?,提供了極高的查詢性能,除非需要到磁盤查詢,否則一般不進行磁盤操作,所以可以在停機時間極短、數(shù)據(jù)沒有丟失的情況下重啟或遷移進程。
極其高效的數(shù)據(jù)流壓縮算法。采用的數(shù)據(jù)流壓縮算法能夠將實際的時間序列數(shù)據(jù)壓縮90%以上。Beringei使用的delta of delta壓縮算法也很高效,單個機器每秒就能夠壓縮150多萬個數(shù)據(jù)點。
雖然將Beringei直接嵌入到另一個TSDB里面也是一種方案,但是Facebook更加推薦采用一體化實現(xiàn)方案,這種一體化實現(xiàn)讓用戶可以擴建可擴展的分片服務。
參考分片服務實現(xiàn)。Beringei項目同時包括時間序列存儲數(shù)據(jù)庫和相關的客戶端實現(xiàn)。
可視化集成。Beringei提供一種HTTP服務實現(xiàn),能夠直接與Grafana集成起來,并且易于橫向擴展。
Beringei需要部署在Ubuntu 16.10(其余系統(tǒng)未做測試),較為嚴重的問題是外部代碼依賴較多,導致部署環(huán)境不太容易,需要依賴fbthrift、folly、wangle、proxygen、gtest、gflags。
Beringei在Facebook的應用
Beringei目前是Facebook的監(jiān)控基礎設施的一部分,它可以支持針對監(jiān)控系統(tǒng)提供的實時響應機制。Beringei收到請求后,立即可以提供查詢服務,數(shù)據(jù)寫入Beringei與可供使用之間的延遲大約是300微秒,F(xiàn)acebook的p95服務器響應讀取請求的時間大約是65微秒。相比Facebook原本基于磁盤的舊引擎設計方案,Beringei的內存系統(tǒng)在讀取性能方面和寫入性能方面都高出幾個數(shù)量級。此外,Beringei支持與Facebook的自動檢測系統(tǒng)配合使用,該系統(tǒng)觀察數(shù)百萬個時間序列,以便檢測異常、發(fā)出警報。
Beringei目前存儲多達100億個唯一的時間序列,每分鐘可處理1800萬次查詢,為Facebook的大部分性能和運行狀況監(jiān)控任務提供支持,同時讓工程師和分析員能夠借助準確的實時數(shù)據(jù),快速做出決策。
Gorilla:Beringei的原型系統(tǒng)
Gorilla是一種快速、可擴展的內存時間序列數(shù)據(jù)庫,是開源的Beringei的原型系統(tǒng)。作為監(jiān)控系統(tǒng),它重點趕住數(shù)據(jù)集合分析,并且認為對于發(fā)現(xiàn)、診斷正在發(fā)生的問題時,最近的數(shù)據(jù)點的價值要大于舊的數(shù)據(jù)點,傳統(tǒng)的ACID不是核心內容。Gorilla主要針對高可用的讀寫做了優(yōu)化,故障發(fā)生時,允許丟失少量寫數(shù)據(jù)。Gorilla將數(shù)據(jù)保存至多個數(shù)據(jù)中心,但不保證數(shù)據(jù)一致性。
為了改善效率,時間戳壓縮算法使用了delta-of-delta編碼算法,數(shù)據(jù)值采用XOR進行壓縮,存儲容量壓縮了近10倍。Gorilla將數(shù)據(jù)放置于內存中,與基于HBase的傳統(tǒng)數(shù)據(jù)庫存儲時間序列數(shù)據(jù)方式相比,查詢延時縮短了73倍,吞吐量提高了14倍。
2015年數(shù)據(jù),Gorilla支持80臺集群規(guī)模,提供了富客戶端解決方案,需要客戶端配合完成機房容災、異?;謴?。
Gorilla實際上是一套混合存儲解決方案:
In-Memory解決快速寫入,提供近期快速讀取
In-SSD提供星期級別的監(jiān)控數(shù)據(jù)讀取
In-SATA提供歷史數(shù)據(jù)永久歸檔
另外,阿里云數(shù)據(jù)庫高級專家葉翔借著源代碼和論文,對Beringei原理進行了解讀,同時也介紹了它在Facebook的應用情況,讀者可以參考了解。