open-falcon之transfer


功能

  • 負責數據轉發,接受agent上報的數據,然后使用一致性hash規則對數據進行分片,最后將分片后的數據分別轉發至judge,graph

  • 對接收到的數據進行合法性校驗、規整

  • 針對每個后端實例維護一個RPC連接池

  • 准備內存Queue中轉監控數據,可以保證后端judge和graph平穩接收數據

  • 根據一致性hash規則將Queue中的數據轉發給judge和graph

  • 當后端宕機時做少量緩存,提供重試機制,但是容隊列爆滿之后會造成內存溢出

配置文件


 debug: true/false, 如果為true,日志中會打印debug信息



    http

        - enable: true/false, 表示是否開啟該http端口,該端口為控制端口,主要用來對transfer發送控制命令、統計命令、debug命令等

        - listen: 表示監聽的http端口



    rpc

        - enable: true/false, 表示是否開啟該jsonrpc數據接收端口, Agent發送數據使用的就是該端口

        - listen: 表示監聽的http端口



    socket #即將被廢棄,請避免使用

        - enable: true/false, 表示是否開啟該telnet方式的數據接收端口,這是為了方便用戶一行行的發送數據給transfer

        - listen: 表示監聽的http端口



    judge

        - enable: true/false, 表示是否開啟向judge發送數據

        - batch: 數據轉發的批量大小,可以加快發送速度,建議保持默認值

        - connTimeout: 單位是毫秒,與后端建立連接的超時時間,可以根據網絡質量微調,建議保持默認

        - callTimeout: 單位是毫秒,發送數據給后端的超時時間,可以根據網絡質量微調,建議保持默認

        - pingMethod: 后端提供的ping接口,用來探測連接是否可用,必須保持默認

        - maxConns: 連接池相關配置,最大連接數,建議保持默認

        - maxIdle: 連接池相關配置,最大空閑連接數,建議保持默認

        - replicas: 這是一致性hash算法需要的節點副本數量,建議不要變更,保持默認即可

        - cluster: key-value形式的字典,表示后端的judge列表,其中key代表后端judge名字,value代表的是具體的ip:port



    graph

        - enable: true/false, 表示是否開啟向graph發送數據

        - batch: 數據轉發的批量大小,可以加快發送速度,建議保持默認值

        - connTimeout: 單位是毫秒,與后端建立連接的超時時間,可以根據網絡質量微調,建議保持默認

        - callTimeout: 單位是毫秒,發送數據給后端的超時時間,可以根據網絡質量微調,建議保持默認

        - pingMethod: 后端提供的ping接口,用來探測連接是否可用,必須保持默認

        - maxConns: 連接池相關配置,最大連接數,建議保持默認

        - maxIdle: 連接池相關配置,最大空閑連接數,建議保持默認

        - replicas: 這是一致性hash算法需要的節點副本數量,建議不要變更,保持默認即可

        - cluster: key-value形式的字典,表示后端的graph列表,其中key代表后端graph名字,value代表的是具體的ip:port(多個地址用逗號隔開, transfer會將同一份數據發送至各個地址,利用這個特性可以實現數據的多重備份)

附加配置        

migrating: 是否數據遷移,用於擴容graph,由於一致性hash原則問題,擴容graph之后,為保證近期數據的連續性,需要預先將數據寫入第二個集群,等寫入一段時間之后,再將新集群上線。開啟此參數之后,transfer將

再生成一個hash環,此時維護的是兩套hash環,同時往里面寫數據

clubsterMigrating: { 新的graph 集群 }



    tsdb

        - enabled: true/false, 表示是否開啟向open tsdb發送數據

        - batch: 數據轉發的批量大小,可以加快發送速度

        - connTimeout: 單位是毫秒,與后端建立連接的超時時間,可以根據網絡質量微調,建議保持默認

        - callTimeout: 單位是毫秒,發送數據給后端的超時時間,可以根據網絡質量微調,建議保持默認

        - maxConns: 連接池相關配置,最大連接數,建議保持默認

        - maxIdle: 連接池相關配置,最大空閑連接數,建議保持默認

        - retry: 連接后端的重試次數和發送數據的重試次數

        - address: tsdb地址或者tsdb集群vip地址, 通過tcp連接tsdb.

默認端口:

  • rpc:8433 接受agent 上報的數據

  • http:6060 控制transfer,也可接受用戶自定義上報數據

  • socket:4444 telnet 方式的數據接受端口

用戶自定義上報數據的格式:


[{"metric":"123",

 "endpoint":"cpu.idle",

  "timestamp":123123123,

  "step":60, 

  "value":9,

  "counterType":"GAUGE",

  "tags":"testtag"

 }] 



 API:"127.0.0.1:6060/api/push"

其中,Step和CounterType中RRD中的概念。Step就是數據采集的間隔,單位為秒。而CounterType分為五個類型,分別如下表:

  • COUNTER: 必須是遞增的,除非是計數器溢出(overflows)。在這種情況下,RRDtool 會自動修改收到的值。例如網絡接口流量、收到的packets 數量都屬於這一類型。

  • DERIVE: 和 COUNTER 類似。但可以是遞增,也可以遞減,或者一會增加一會兒減少。

  • ABSOLUTE: ABSOLUTE 比較特殊,它每次都假定前一個interval的值是0,再計算平均值。

  • GAUGE: GAGUE 和上面三種不同,它沒有“平均”的概念,RRDtool 收到值之后字節存入 RRA 中。

  • COMPUTE: COMPUTE 比較特殊,它並不接受輸入,它的定義是一個表達式,能夠引用其他DS並自動計算出某個值。

數據轉發流程

初始化

  • 初始化連接池

模塊啟動時,會根據配置初始化RPC連接池。Judge模塊初始化的連接池個數為Judge.Cluster數量。從代碼中可以看出,每一個Cluster中的Judge模塊進行的是單點部署。Graph模塊初始化的連接池個數為Graph.Cluster中的地址數。

  • 初始化發送隊列

當Transfer接收到數據之后,跟根據一致性哈希確定節點,傳遞給相應的發送隊列,隊列中再去發送至Judge以及Graph模塊。其中,發送給Judge模塊一份數據(因為只配置了一個Judge實例),發送給所有屬於該節點的所有Graph模塊一份數據。 發送隊列和連接池是一一對應的。

PS:transfer 會根據endpoint、metric、tag進行一致性hash計算key,保證多台transfer時同樣的key可以發送至同一個graph,保證數據連續性

  • 接收

Transfer模塊有兩種方式接收數據:原始TCP,和RPC。

* 原始TCP方式,Transfer與請求方保持長連接,數據之間通過 \n 分割,一共分為兩中命令:"quit"和"update",前者為退出連接,后者為上報數據。

* RPC方式,和Ping和Update方法,前者只會返回一個空response,后者為上報數據。
  • 發送

通過原始TCP或者RPC方式接收到數據之后,會根據配置決定是否向Judge或Graph發送數據。 對於向Judge發送數據,首先會將數據轉換為對應模塊要求的格式,之后對於每一份數據(item),計算其key,找到一致性哈希中的節點node。通過node找到隊列,將數據Push至隊列尾部。 向Graph發送數據的邏輯和Judge的基本類似,區別就是找到一致性哈希的節點node之后,遍歷該node中的所有地址addr,通過node + addr找到隊列,將數據Push至隊列尾部,一共發送了len(addr)份數據。


免責聲明!

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



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