openfalcon源碼分析之graph
本節內容
- graph功能
- graph源碼分析
- 2.1 graph中重要的數據結構
- 2.2 graph的簡要流程圖
- 2.3 graph處理數據過程
- 2.4 graph數據遷移
- graph設計優缺點
- 優點:
- 缺點:
1. graph功能
graph在整個falcon項目中的位置就是把transfer push上來的數據進行采樣存儲,並提供查詢接口。
graph使用rrdtool保存數據,上報來的數據,被存在一個個的rrd文件中,同時會對數據進行采采樣,最大值,最小值,和平均值,保存歷史數據歸檔,這樣既節省了存儲空間,又不會在查詢長時間段時導致數據量太大,加載效率變低。
2. graph源碼分析
2.1 graph中重要的數據結構
首先,介紹下graphs中幾個重要的數據結構:
MD5Endpoint+Metric+Tags拼接之后通過MD5計算出的HASH值RRD緩存數據的KEYMD5+dsType+step拼接的字符串UUIDendpoint+metric+tags+dstype+step拼接之后通過MD5計算出的HASH值IndexedItemCache一個大MAP,key是MD5,value是UUID和GraphItem組成的struct,用來保存每個上報的數據對應的索引,默認最大大小500WunIndexedItemCache一個大MAP,key是MD5,value是UUID和GraphItem組成的struct,用來保存沒有被上報到數據庫中的數據的索引默認最大大小500WdbEndpointCachegraph庫中的endpoint表的內存緩存,key:endpoint(string) / value:id(int64)dbEndpointCounterCachegraph庫中的endpoint_counter表的內存緩存,key:endpoint_id-counter(string) / val:dstype-step(string)緩存時間10分鍾,每1分鍾檢查一次GraphItemMap大MAP,默認大小是1800的一個list,來了數據之后,先對RRD-KEY進行CRC32進行循環冗余之后,對1800取余,獲取索引,該索引對應的是一個MAP,key是RRD-KEY,value是鏈表,鏈表的每個節點保存一個GraphItem。HistoryCache大MAP,key是MD5,value是鏈表,每個節點是GraphItem,只保留最新的三個數據
2.2 graph的簡要流程圖
下面是整個graph的流程簡圖:

2.3 graph處理數據過程
上面已經做好了前期鋪墊,接下來展開分析一下graph中數據處理的流程。
首先介紹graph從transfer中拿到數據后的操作:
Graph.Send方法獲取到transfer傳輸過來的GraphItems,交給HandleItems處理。- 循環
GraphItems,獲取每個GraphItem都進行下面三個操作:- 把
GraphItempush到store.GraphItems這個大MAP對應的位置中 - 調用
index.ReceiveItem方法,判斷數據是否之前已經上報過,如果上報過,更新到IndexedItemCache MAP中,否則,判斷其對應的rrd文件是否存在,如果存在,直接加入到IndexedItemCache中,如果不存在,放到unIndexedItemCache map中。 - 調用
store.AddItem方法,將數據添加到HistoryCache中,並把老的數據刪掉,只保留最近三個數據
- 把
unIndexedItemCache中的數據會定期刷新到數據庫的graph庫的endpoint表tag_endpoint表endpoint_counter表中並添加到IndexedItemCache中,最后在unIndexedItemCache中刪除。store.GraphItems中的數據定期刷入到磁盤上的RRD文件中。
graph中的Graph.Query方法獲取要查詢的數據后進行的操作:
- 根據
param.Endpoint,param.Counter生成MD5值,去IndexedItemCache中找dsType和step,若沒找到,去dbEndpointCache和dbEndpointCounterCache查詢,若還是沒找到,則到數據庫中查找對應的dsType和step,后把找到的數據緩存到dbEndpointCache和dbEndpointCounterCache中。 - 計算
start_ts和end_ts,從store.GraphItems中拿到還沒被緩存進RRD文件的數據,再去RRD文件中取出對應的數據(如果cfg支持migrate,以及判斷查詢數據不在這個Graph實例,則從其它Graph實例進行查詢) - 將
RRD文件中查到的數據和緩存的數據進行merge之后,生成最終數據返回給調用方。
graph中的Graph.Delete方法接收GraphDeleteParam組成的列表,並徹底刪除相應的數據
IndexedItemCache和unIndexedItemCache中刪除對應的數據store.GraphItems中清空對應節點緩存的數據- 刪除對應的RRD文件
以上就是主要提供使用最頻繁的 RPC API,下面介紹Http提供的主要API
/index/updateAll該API將觸發索引全量更新, 同步操作,會把所有IndexedItemCache中的數據,全部刷入到數據庫中,這個功能在調試的時候有用。/index/updateAll/concurrent該API能獲取索引全量更新的並行數/api/v2/index更新一條索引數據,用於手動建立索引endpoint metric step dstype tags/counter/all和/statistics/all獲取所有關於graph中各種操作的統計數據
2.4 graph數據遷移
graph支持數據遷移,在配置文件中打開相應的配置
"migrate": {
"enabled": false, // 默認不開啟
"concurrency": 2, // 開啟的任務協程數量
"replicas": 500, // 一致性hash環中的重復點數
"cluster": { // 集群節點配置
"graph-00" : "127.0.0.1:6070"
}
3. graph設計優缺點
優點:
- 使用rrdtool存儲數據,相對於數據庫存儲數據,大大減輕了壓力,最大的性能瓶頸被解決了
- 支持集群數據冗余,以及數據動態拉取,對於數據災備提供了很好的支持
缺點:
- 對磁盤資源消耗嚴重。rrdtool自帶的歸檔功能,會消耗大量的磁盤IO。
- 精確的歷史數據保存時間短,不利於歷史的現場回放。默認只保存12H的原始數據。
