openfalcon源碼分析之graph


openfalcon源碼分析之graph

本節內容

  1. graph功能
  2. graph源碼分析
    • 2.1 graph中重要的數據結構
    • 2.2 graph的簡要流程圖
    • 2.3 graph處理數據過程
    • 2.4 graph數據遷移
  3. graph設計優缺點
    • 優點:
    • 缺點:

1. graph功能

graph在整個falcon項目中的位置就是把transfer push上來的數據進行采樣存儲,並提供查詢接口。

graph使用rrdtool保存數據,上報來的數據,被存在一個個的rrd文件中,同時會對數據進行采采樣,最大值,最小值,和平均值,保存歷史數據歸檔,這樣既節省了存儲空間,又不會在查詢長時間段時導致數據量太大,加載效率變低。

2. graph源碼分析

2.1 graph中重要的數據結構

首先,介紹下graphs中幾個重要的數據結構:

  1. MD5 Endpoint+Metric+Tags拼接之后通過MD5計算出的HASH
  2. RRD緩存數據的KEY MD5+dsType+step拼接的字符串
  3. UUID endpoint+metric+tags+dstype+step拼接之后通過MD5計算出的HASH
  4. IndexedItemCache 一個大MAPkeyMD5valueUUIDGraphItem組成的struct,用來保存每個上報的數據對應的索引,默認最大大小500W
  5. unIndexedItemCache 一個大MAPkeyMD5valueUUIDGraphItem組成的struct,用來保存沒有被上報到數據庫中的數據的索引默認最大大小500W
  6. dbEndpointCache graph庫中的endpoint表的內存緩存,key:endpoint(string) / value:id(int64)
  7. dbEndpointCounterCache graph庫中的endpoint_counter表的內存緩存, key:endpoint_id-counter(string) / val:dstype-step(string)緩存時間10分鍾,每1分鍾檢查一次
  8. GraphItemMapMAP,默認大小是1800的一個list,來了數據之后,先對RRD-KEY進行CRC32進行循環冗余之后,對1800取余,獲取索引,該索引對應的是一個MAPkeyRRD-KEYvalue是鏈表,鏈表的每個節點保存一個GraphItem
  9. HistoryCacheMAPkeyMD5value是鏈表,每個節點是GraphItem,只保留最新的三個數據

2.2 graph的簡要流程圖

下面是整個graph的流程簡圖:
graph處理流程

2.3 graph處理數據過程

上面已經做好了前期鋪墊,接下來展開分析一下graph中數據處理的流程。
首先介紹graphtransfer中拿到數據后的操作:

  1. Graph.Send方法獲取到transfer傳輸過來的GraphItems,交給HandleItems處理。
  2. 循環GraphItems,獲取每個GraphItem都進行下面三個操作:
    • GraphItem pushstore.GraphItems這個大MAP對應的位置中
    • 調用index.ReceiveItem方法,判斷數據是否之前已經上報過,如果上報過,更新到IndexedItemCache MAP中,否則,判斷其對應的rrd文件是否存在,如果存在,直接加入到IndexedItemCache中,如果不存在,放到unIndexedItemCache map中。
    • 調用store.AddItem方法,將數據添加到HistoryCache中,並把老的數據刪掉,只保留最近三個數據
  3. unIndexedItemCache中的數據會定期刷新到數據庫的graph庫的endpointtag_endpointendpoint_counter表中並添加到IndexedItemCache中,最后在unIndexedItemCache中刪除。
  4. store.GraphItems中的數據定期刷入到磁盤上的RRD文件中。

graph中的Graph.Query方法獲取要查詢的數據后進行的操作:

  1. 根據param.Endpoint, param.Counter生成MD5值,去IndexedItemCache中找dsTypestep,若沒找到,去dbEndpointCachedbEndpointCounterCache查詢,若還是沒找到,則到數據庫中查找對應的dsTypestep,后把找到的數據緩存到dbEndpointCachedbEndpointCounterCache中。
  2. 計算start_tsend_ts,從store.GraphItems中拿到還沒被緩存進RRD文件的數據,再去RRD文件中取出對應的數據(如果cfg支持migrate,以及判斷查詢數據不在這個Graph實例,則從其它Graph實例進行查詢)
  3. RRD文件中查到的數據和緩存的數據進行merge之后,生成最終數據返回給調用方。

graph中的Graph.Delete方法接收GraphDeleteParam組成的列表,並徹底刪除相應的數據

  1. IndexedItemCacheunIndexedItemCache中刪除對應的數據
  2. store.GraphItems中清空對應節點緩存的數據
  3. 刪除對應的RRD文件

以上就是主要提供使用最頻繁的 RPC API,下面介紹Http提供的主要API

  1. /index/updateAllAPI將觸發索引全量更新, 同步操作,會把所有IndexedItemCache中的數據,全部刷入到數據庫中,這個功能在調試的時候有用。
  2. /index/updateAll/concurrentAPI能獲取索引全量更新的並行數
  3. /api/v2/index 更新一條索引數據,用於手動建立索引 endpoint metric step dstype tags
  4. /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設計優缺點

優點:

  1. 使用rrdtool存儲數據,相對於數據庫存儲數據,大大減輕了壓力,最大的性能瓶頸被解決了
  2. 支持集群數據冗余,以及數據動態拉取,對於數據災備提供了很好的支持

缺點:

  1. 對磁盤資源消耗嚴重。rrdtool自帶的歸檔功能,會消耗大量的磁盤IO。
  2. 精確的歷史數據保存時間短,不利於歷史的現場回放。默認只保存12H的原始數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM