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

  • 相关阅读:
    Web安全实践
    认证授权的设计与实现
    Elasticsearch 分页查询
    【算法】三色旗
    【转】互联网项目中mysql应该选什么事务隔离级别
    Elasticsearch 聚合
    Elasticsearch 结构化搜索、keyword、Term查询
    Elasticsearch 单字符串多字段查询
    Elasticsearch 复合查询——多字符串多字段查询
    JavaScript 原型与原型链
  • 原文地址:https://www.cnblogs.com/pycode/p/6722386.html
Copyright © 2020-2023  润新知