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)份数据。

posted @ 2017-04-17 12:57  Fuzengjie  阅读(2851)  评论(0编辑  收藏  举报