功能
-
負責數據轉發,接受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)份數據。
