openfalcon源码分析之transfer

本节内容

  1. transfer功能
    • transfer接收数据来源
    • transfer数据去向
    • transfer的一致性hash
    • transfer的一致性hash key的计算
  2. transfer源码分析
    • 2.1 初始化链接池,发送队列
    • 2.2 初始化rpc和socket接收端
    • 2.3 初始化http服务
  3. transfer设计优缺点
    • 优势:
    • 缺点:

1. transfer功能

transfer模块的做用是接收全部被监控服务器上发送过来的数据进行一些判断和处理以后转发至后面的graph和judge模块。node

transfer接收数据来源

transfer主要从四个来源接收数据:golang

  1. agent采集的数据
  2. agent执行用户自定义插件返回的数据
  3. client-library,业务系统内嵌的监控收集数据并上报
  4. 用户本身产生的一些自定义数据,可经过RPC接口上报

transfer数据去向

transfer设计时支持三种数据后端,分别是:judge、graph、OpenTSDB.传输给judge是为了对收集上来的数据进行实时告警判断,graph是使用RRD技术存储监控数据的组件,OpenTSDB是开源的时间序列数据存储服务。后端

transfer的一致性hash

transfer的后端judge和graph为了提供高可用及负载均衡,均可能部署了多节点,transfer使用一致性hash对数据映射到不一样节点。而OpenTSDB没有使用一致性hash,只提供了一个接口写数据。api

transfer的一致性hash key的计算

transfer经过接收的数据的endpoint+metric+排序后的tags组成的pk做为key,进行hash(进行crc32循环冗余校验),最后获取该数据应该发送到的node。下面是pk生成的源码:服务器

func PK(endpoint, metric string, tags map[string]string) string {
    if tags == nil || len(tags) == 0 {
        return fmt.Sprintf("%s/%s", endpoint, metric)
    }
    return fmt.Sprintf("%s/%s/%s", endpoint, metric, SortedTags(tags))
}

2. transfer源码分析

transfer源码分析须要结合数据流动的方向来进行梳理。负载均衡

2.1 初始化链接池,发送队列

初始化时首先初始化链接池,而后初始化发送队列,最后初始化一致性hash环。
初始化完成以后开始执行发送数据任务startSendTasks将会按期将队列中的数据发送到不一样的后端,至于最后的startSenderCron是开启定时任务,记录不一样队列发送数据的状况。socket

  • 建立链接池时,judge集群是循环获取judge集群中的每个node,生成一个node链接池组成的链接池。graph集群是循环集群中的每一个node,每一个node可能又有多个主机地址,最后把这全部的地址进行去重后建立一个大的链接池。
  • 建立发送队列时,judge根据每一个node建立一个safe listgraph是两层循环,拼接成node+addr建立一个safe list。tsdb若是开启,建立了一个safe list
  • 调用initNodeRings建立一致性hash环时,只获取了judgegraph的node名称,经过名称生成hash值,再生成hash环。
  • 调用startSendTasks发送数据时,对于judge,循环每一个judge node队列中的数据,将其发送到对应的node中,对于graph node队列,将循环该node列表中的全部地址,每一个地址将接收到一份数据,这样,同一份数据被拷贝了len(node.addr)份发送。
// 初始化数据发送服务, 在main函数中调用
func Start() {
    // 初始化默认参数
    MinStep = g.Config().MinStep
    if MinStep < 1 {
        MinStep = 30 //默认30s
    }
    //
    initConnPools()
    initSendQueues()
    initNodeRings()
    // SendTasks依赖基础组件的初始化,要最后启动
    startSendTasks()
    startSenderCron()
    log.Println("send.Start, ok")
}

2.2 初始化rpc和socket接收端

transfer接收数据有三种方式,除了Http提供数据接收以外,另两种,一种是使用golang的rpc模块,另外一种是使用socket直接传输数据,两种方式将在下面介绍:函数

  1. RPC方式:
rpc方法 接收数据 做用
Ping 检测transfer是否存活,code=0说明正常,code=1说明请求异常
Update MetricValue列表 将上报的数据进行简单处理,检测是否知足格式条件,最后将数据发送到队列中
  1. socket方式:
    socket方式提供两个接口,一个是quit,用来退出数据发送,另外一个是update,上报数据,数据之间用\n进行分割。
socket指令 接收数据 做用
quit 退出该次处理
update 上报数据,用\n分隔 上报数据进行处理后发送到对应的发送队列中

在open-falcon中基本都是使用rpc和http进行传输数据,这里添加了socket支持,多是为了用户使用其余语言写的客户端,发送一些自定义的监控数据的上报,基本不使用。源码分析

2.3 初始化http服务

http服务含有一个上报数据的接口,是"/api/push",该接口能够接受其余服务push上来的数据,其余主要是一些关于transfer统计信息,状态信息等的获取。ui

3. transfer设计优缺点

优势:

  • transfer将数据集中汇总,再分散到不一样的后端处理程序,至关于充当了数据集散地的做用

缺点:

  • transfer提供的数据接入方式除了golang能用的rpcHttp之外,另外提供的socket感受不友好,但愿可以改进以支持其余语言编写的服务可以比较方便的上报数据。
相关文章
相关标签/搜索