本节内容

  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模块。

transfer接收数据来源

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

  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,只提供了一个接口写数据。

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是开启定时任务,记录不同队列发送数据的情况。

  • 创建连接池时,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统计信息,状态信息等的获取。

3. transfer设计优缺点

优点:

  • transfer将数据集中汇总,再分散到不同的后端处理程序,相当于充当了数据集散地的作用

缺点:

  • transfer提供的数据接入方式除了golang能用的rpcHttp以外,另外提供的socket感觉不友好,希望能够改进以支持其他语言编写的服务能够比较方便的上报数据。
 
 
 

openfalcon源码分析之transfer的更多相关文章

  1. openfalcon源码分析之graph

    openfalcon源码分析之graph 本节内容 graph功能 graph源码分析 2.1 graph中重要的数据结构 2.2 graph的简要流程图 2.3 graph处理数据过程 2.4 gr ...

  2. openfalcon源码分析之Judge

    openfalcon源码分析之Judge 本节内容 Judge功能 源码分析 设计优缺点 1. Judge功能 在open-falcon中,Judge模块的功能是通过从HBS上同步告警的strateg ...

  3. openfalcon源码分析之hbs

    openfalcon源码分析之hbs 本节内容 hbs功能 hbs源码分析 hbs设计优劣 1. hbs功能 hbs在整个open-falcon项目中承担的角色就是连接数据库,作为数据库缓存,缓存配置 ...

  4. openfalcon源码分析之agent

    本节内容 agent功能 1.1 agent上报数据 1.2 agent与HBS同步 1.3 agent Http服务 agent源码分析 2.1 初始化config配置 2.2 初始化根目录,本地I ...

  5. Java并发包源码分析

    并发是一种能并行运行多个程序或并行运行一个程序中多个部分的能力.如果程序中一个耗时的任务能以异步或并行的方式运行,那么整个程序的吞吐量和可交互性将大大改善.现代的PC都有多个CPU或一个CPU中有多个 ...

  6. 【JUC】JDK1.8源码分析之ConcurrentHashMap(一)

    一.前言 最近几天忙着做点别的东西,今天终于有时间分析源码了,看源码感觉很爽,并且发现ConcurrentHashMap在JDK1.8版本与之前的版本在并发控制上存在很大的差别,很有必要进行认真的分析 ...

  7. 【JUC】JDK1.8源码分析之SynchronousQueue(九)

    一.前言 本篇是在分析Executors源码时,发现JUC集合框架中的一个重要类没有分析,SynchronousQueue,该类在线程池中的作用是非常明显的,所以很有必要单独拿出来分析一番,这对于之后 ...

  8. HashMap实现原理及源码分析

    哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memcached)的核心其实就是在内存中维护一张大的哈希表,而HashMap的实现原理也常常出 ...

  9. Java集合源码分析(七)HashMap<K, V>

    一.HashMap概述 HashMap基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了不同步和允许使用 null 之外,HashMap  ...

随机推荐

  1. AndroidManifest.xml的targetSdkVersion 与 project.properties中target

    (1)minSdkVersion与maxSdkVersion :在安装程序的时候,如果目标设备的API < minSdkVersion,或者目标设备的API > maxSdkVersion ...

  2. 【Python】sasa版:文件中csv读取在写入csv读取的数据和执行是否成功。

    sasa写的文件(包含解析文字) # coding=utf- from selenium import webdriver from time import sleep import keyword ...

  3. centos lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress 安装phpmyadmin 定时备份mysql两种方法 第二十五节课

    centos  lamp/lnmp阶段复习 以后搬迁discuz论坛不需要重新安装,只需修改配置文件即可 安装wordpress  安装phpmyadmin  定时备份mysql两种方法  第二十五节 ...

  4. linux rsync安装与使用

    rsync Usage: /etc/init.d/rsync {start|stop|reload|force-reload|restart|status} rsync默认配置文件 # default ...

  5. Python常用模块(logging&re&时间&random&os&sys&shutil&序列化&configparser&&hashlib)

    一. logging(日志模块) 二 .re模块 三. 时间模块 四. random模块 五. os模块 六. sys模块 七. shutil模块 八. 序列化模块(json&pickle&a ...

  6. in `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)

    最近在用ruby的一些库的时候,总是出现这个错误. 在使用net/imap库的时候,或者net/http库(主要是用到了https,https是用了ssl) 的时候,具体如下: 错误提示:E:/Rub ...

  7. uva 1456

    这题说的是 给了 n 个 点 然后每个点 都有 相应的概率,你要将这n个点划分成w个集合使得 下面定义的这种算法 得到的 值最小 n1 是集合一的 个数  是 集合一内的每个点的概率和, 下面是分成两 ...

  8. surface知识点

    SurfaceView和TextureView 在学习直播的过程遇到一个问题:连麦场景下能够支持大小窗口切换(即小窗口变大,大窗口变小),大窗口是TextView(用于拉流显示),而小窗口是Surfa ...

  9. python openpyxl 封装Execl常用操作的方法

    封装Excel操作方法:先装openpyxl:pip install openpyxl==2.4.5(可以指定版本) 封装脚本:#encoding=utf-8 from openpyxl import ...

  10. 20145301赵嘉鑫《网络对抗》逆向及Bof基础

      20145301赵嘉鑫<网络对抗>逆向及Bof基础 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:main调用foo函数,foo函数会简单回 ...