功能
-
负责数据转发,接受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与请求方保持长连接,数据之间通过
分割,一共分为两中命令:"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)份数据。