openfalcon源碼分析之transfer

本節內容

  1. transfer功能
    • transfer接收數據來源
    • transfer數據去向
    • transfer的一致性hash
    • transfer的一致性hash key的計算
  2. transfer源碼分析
    • 2.1 初始化鏈接池,發送隊列
    • 2.2 初始化rpc和socket接收端
    • 2.3 初始化http服務
  3. transfer設計優缺點
    • 優勢:
    • 缺點:

1. transfer功能

transfer模塊的做用是接收全部被監控服務器上發送過來的數據進行一些判斷和處理以後轉發至後面的graph和judge模塊。node

transfer接收數據來源

transfer主要從四個來源接收數據:golang

  1. agent採集的數據
  2. agent執行用戶自定義插件返回的數據
  3. client-library,業務系統內嵌的監控收集數據並上報
  4. 用戶本身產生的一些自定義數據,可經過RPC接口上報

transfer數據去向

transfer設計時支持三種數據後端,分別是:judge、graph、OpenTSDB.傳輸給judge是爲了對收集上來的數據進行實時告警判斷,graph是使用RRD技術存儲監控數據的組件,OpenTSDB是開源的時間序列數據存儲服務。後端

transfer的一致性hash

transfer的後端judge和graph爲了提供高可用及負載均衡,均可能部署了多節點,transfer使用一致性hash對數據映射到不一樣節點。而OpenTSDB沒有使用一致性hash,只提供了一個接口寫數據。api

transfer的一致性hash key的計算

transfer經過接收的數據的endpoint+metric+排序後的tags組成的pk做爲key,進行hash(進行crc32循環冗餘校驗),最後獲取該數據應該發送到的node。下面是pk生成的源碼:服務器

func PK(endpoint, metric string, tags map[string]string) string {
    if tags == nil || len(tags) == 0 {
        return fmt.Sprintf("%s/%s", endpoint, metric)
    }
    return fmt.Sprintf("%s/%s/%s", endpoint, metric, SortedTags(tags))
}

2. transfer源碼分析

transfer源碼分析須要結合數據流動的方向來進行梳理。負載均衡

2.1 初始化鏈接池,發送隊列

初始化時首先初始化鏈接池,而後初始化發送隊列,最後初始化一致性hash環。
初始化完成以後開始執行發送數據任務startSendTasks將會按期將隊列中的數據發送到不一樣的後端,至於最後的startSenderCron是開啓定時任務,記錄不一樣隊列發送數據的狀況。socket

  • 建立鏈接池時,judge集羣是循環獲取judge集羣中的每個node,生成一個node鏈接池組成的鏈接池。graph集羣是循環集羣中的每一個node,每一個node可能又有多個主機地址,最後把這全部的地址進行去重後建立一個大的鏈接池。
  • 建立發送隊列時,judge根據每一個node建立一個safe listgraph是兩層循環,拼接成node+addr建立一個safe list。tsdb若是開啓,建立了一個safe list
  • 調用initNodeRings建立一致性hash環時,只獲取了judgegraph的node名稱,經過名稱生成hash值,再生成hash環。
  • 調用startSendTasks發送數據時,對於judge,循環每一個judge node隊列中的數據,將其發送到對應的node中,對於graph node隊列,將循環該node列表中的全部地址,每一個地址將接收到一份數據,這樣,同一份數據被拷貝了len(node.addr)份發送。
// 初始化數據發送服務, 在main函數中調用
func Start() {
    // 初始化默認參數
    MinStep = g.Config().MinStep
    if MinStep < 1 {
        MinStep = 30 //默認30s
    }
    //
    initConnPools()
    initSendQueues()
    initNodeRings()
    // SendTasks依賴基礎組件的初始化,要最後啓動
    startSendTasks()
    startSenderCron()
    log.Println("send.Start, ok")
}

2.2 初始化rpc和socket接收端

transfer接收數據有三種方式,除了Http提供數據接收以外,另兩種,一種是使用golang的rpc模塊,另外一種是使用socket直接傳輸數據,兩種方式將在下面介紹:函數

  1. RPC方式:
rpc方法 接收數據 做用
Ping 檢測transfer是否存活,code=0說明正常,code=1說明請求異常
Update MetricValue列表 將上報的數據進行簡單處理,檢測是否知足格式條件,最後將數據發送到隊列中
  1. socket方式:
    socket方式提供兩個接口,一個是quit,用來退出數據發送,另外一個是update,上報數據,數據之間用\n進行分割。
socket指令 接收數據 做用
quit 退出該次處理
update 上報數據,用\n分隔 上報數據進行處理後發送到對應的發送隊列中

在open-falcon中基本都是使用rpc和http進行傳輸數據,這裏添加了socket支持,多是爲了用戶使用其餘語言寫的客戶端,發送一些自定義的監控數據的上報,基本不使用。源碼分析

2.3 初始化http服務

http服務含有一個上報數據的接口,是"/api/push",該接口能夠接受其餘服務push上來的數據,其餘主要是一些關於transfer統計信息,狀態信息等的獲取。ui

3. transfer設計優缺點

優勢:

  • transfer將數據集中彙總,再分散到不一樣的後端處理程序,至關於充當了數據集散地的做用

缺點:

  • transfer提供的數據接入方式除了golang能用的rpcHttp之外,另外提供的socket感受不友好,但願可以改進以支持其餘語言編寫的服務可以比較方便的上報數據。
相關文章
相關標籤/搜索