openfalcon源碼分析之transfer
本節內容
- transfer功能
- transfer接收數據來源
- transfer數據去向
- transfer的一致性hash
- transfer的一致性hash key的計算
- transfer源碼分析
- 2.1 初始化連接池,發送隊列
- 2.2 初始化rpc和socket接收端
- 2.3 初始化http服務
- transfer設計優缺點
- 優點:
- 缺點:
1. transfer功能
transfer模塊的作用是接收所有被監控服務器上發送過來的數據進行一些判斷和處理之後轉發至後面的graph和judge模塊。
transfer接收數據來源
transfer主要從四個來源接收數據:
- agent采集的數據
- agent執行用戶自定義插件返回的數據
- client-library,業務系統內嵌的監控收集數據並上報
- 用戶自己產生的一些自定義數據,可通過RPC接口上報
transfer數據去向
transfer設計時支持三種數據後端,分別是:judge、graph、OpenTSDB.傳輸給judge是為了對收集上來的數據進行實時告警判斷,graph是使用RRD技術存儲監控數據的組件,OpenTSDB是開源的時間序列數據存儲服務。
transfer的一致性hash
transfer的後端judge和graph為了提供高可用及負載均衡,都可能部署了多節點,transfer使用一致性hash對數據映射到不同節點。而OpenTSDB沒有使用一致性hash,只提供了一個接口寫數據。
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
是開啟定時任務,記錄不同隊列發送數據的情況。
- 創建連接池時,judge集群是循環獲取judge集群中的每一個node,生成一個node連接池組成的連接池。graph集群是循環集群中的每個node,每個node可能又有多個主機地址,最後把這所有的地址進行去重後創建一個大的連接池。
- 創建發送隊列時,judge根據每個node創建一個
safe list
。graph
是兩層循環,拼接成node+addr
創建一個safe list
。tsdb如果開啟,創建了一個safe list
。 - 調用
initNodeRings
創建一致性hash環時,只獲取了judge
和graph
的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直接傳輸數據,兩種方式將在下面介紹:
- RPC方式:
rpc方法 | 接收數據 | 作用 |
---|---|---|
Ping | 空 | 檢測transfer是否存活,code=0說明正常,code=1說明請求異常 |
Update | MetricValue 列表 |
將上報的數據進行簡單處理,檢測是否滿足格式條件,最後將數據發送到隊列中 |
- socket方式:
socket方式提供兩個接口,一個是quit,用來退出數據發送,另一個是update,上報數據,數據之間用\n
進行分割。
socket指令 | 接收數據 | 作用 |
---|---|---|
quit | 空 | 退出該次處理 |
update | 上報數據,用\n 分隔 |
上報數據進行處理後發送到對應的發送隊列中 |
在open-falcon中基本都是使用rpc和http進行傳輸數據,這裏添加了socket支持,可能是為了用戶使用其他語言寫的客戶端,發送一些自定義的監控數據的上報,基本不使用。
2.3 初始化http服務
http服務含有一個上報數據的接口,是"/api/push"
,該接口可以接受其他服務push
上來的數據,其他主要是一些關於transfer統計信息,狀態信息等的獲取。
3. transfer設計優缺點
優點:
- transfer將數據集中匯總,再分散到不同的後端處理程序,相當於充當了數據集散地的作用
缺點:
- transfer提供的數據接入方式除了
golang
能用的rpc
和Http
以外,另外提供的socket
感覺不友好,希望能夠改進以支持其他語言編寫的服務能夠比較方便的上報數據。
openfalcon源碼分析之transfer