openfalcon源码分析之graph

本节内容

  1. graph功能
  2. graph源码分析
    • 2.1 graph中重要的数据结构
    • 2.2 graph的简要流程图
    • 2.3 graph处理数据过程
    • 2.4 graph数据迁移
  3. graph设计优缺点
    • 优点:
    • 缺点:

1. graph功能

graph在整个falcon项目中的位置就是把transfer push上来的数据进行采样存储,并提供查询接口。

graph使用rrdtool保存数据,上报来的数据,被存在一个个的rrd文件中,同时会对数据进行采采样,最大值,最小值,和平均值,保存历史数据归档,这样既节省了存储空间,又不会在查询长时间段时导致数据量太大,加载效率变低。

2. graph源码分析

2.1 graph中重要的数据结构

首先,介绍下graphs中几个重要的数据结构:

  1. MD5 Endpoint+Metric+Tags拼接之后通过MD5计算出的HASH
  2. RRD缓存数据的KEY MD5+dsType+step拼接的字符串
  3. UUID endpoint+metric+tags+dstype+step拼接之后通过MD5计算出的HASH
  4. IndexedItemCache 一个大MAPkeyMD5valueUUIDGraphItem组成的struct,用来保存每个上报的数据对应的索引,默认最大大小500W
  5. unIndexedItemCache 一个大MAPkeyMD5valueUUIDGraphItem组成的struct,用来保存没有被上报到数据库中的数据的索引默认最大大小500W
  6. dbEndpointCache graph库中的endpoint表的内存缓存,key:endpoint(string) / value:id(int64)
  7. dbEndpointCounterCache graph库中的endpoint_counter表的内存缓存, key:endpoint_id-counter(string) / val:dstype-step(string)缓存时间10分钟,每1分钟检查一次
  8. GraphItemMapMAP,默认大小是1800的一个list,来了数据之后,先对RRD-KEY进行CRC32进行循环冗余之后,对1800取余,获取索引,该索引对应的是一个MAPkeyRRD-KEYvalue是链表,链表的每个节点保存一个GraphItem
  9. HistoryCacheMAPkeyMD5value是链表,每个节点是GraphItem,只保留最新的三个数据

2.2 graph的简要流程图

下面是整个graph的流程简图:

2.3 graph处理数据过程

上面已经做好了前期铺垫,接下来展开分析一下graph中数据处理的流程。
首先介绍graphtransfer中拿到数据后的操作:

  1. Graph.Send方法获取到transfer传输过来的GraphItems,交给HandleItems处理。
  2. 循环GraphItems,获取每个GraphItem都进行下面三个操作:
    • GraphItem pushstore.GraphItems这个大MAP对应的位置中
    • 调用index.ReceiveItem方法,判断数据是否之前已经上报过,如果上报过,更新到IndexedItemCache MAP中,否则,判断其对应的rrd文件是否存在,如果存在,直接加入到IndexedItemCache中,如果不存在,放到unIndexedItemCache map中。
    • 调用store.AddItem方法,将数据添加到HistoryCache中,并把老的数据删掉,只保留最近三个数据
  3. unIndexedItemCache中的数据会定期刷新到数据库的graph库的endpointtag_endpointendpoint_counter表中并添加到IndexedItemCache中,最后在unIndexedItemCache中删除。
  4. store.GraphItems中的数据定期刷入到磁盘上的RRD文件中。

graph中的Graph.Query方法获取要查询的数据后进行的操作:

  1. 根据param.Endpoint, param.Counter生成MD5值,去IndexedItemCache中找dsTypestep,若没找到,去dbEndpointCachedbEndpointCounterCache查询,若还是没找到,则到数据库中查找对应的dsTypestep,后把找到的数据缓存到dbEndpointCachedbEndpointCounterCache中。
  2. 计算start_tsend_ts,从store.GraphItems中拿到还没被缓存进RRD文件的数据,再去RRD文件中取出对应的数据(如果cfg支持migrate,以及判断查询数据不在这个Graph实例,则从其它Graph实例进行查询)
  3. RRD文件中查到的数据和缓存的数据进行merge之后,生成最终数据返回给调用方。

graph中的Graph.Delete方法接收GraphDeleteParam组成的列表,并彻底删除相应的数据

  1. IndexedItemCacheunIndexedItemCache中删除对应的数据
  2. store.GraphItems中清空对应节点缓存的数据
  3. 删除对应的RRD文件

以上就是主要提供使用最频繁的 RPC API,下面介绍Http提供的主要API

  1. /index/updateAllAPI将触发索引全量更新, 同步操作,会把所有IndexedItemCache中的数据,全部刷入到数据库中,这个功能在调试的时候有用。
  2. /index/updateAll/concurrentAPI能获取索引全量更新的并行数
  3. /api/v2/index 更新一条索引数据,用于手动建立索引 endpoint metric step dstype tags
  4. /counter/all/statistics/all 获取所有关于graph中各种操作的统计数据

2.4 graph数据迁移

graph支持数据迁移,在配置文件中打开相应的配置

"migrate": {
"enabled": false, // 默认不开启
"concurrency": 2, // 开启的任务协程数量
"replicas": 500, // 一致性hash环中的重复点数
"cluster": { // 集群节点配置
"graph-00" : "127.0.0.1:6070"
}

3. graph设计优缺点

优点:

  1. 使用rrdtool存储数据,相对于数据库存储数据,大大减轻了压力,最大的性能瓶颈被解决了
  2. 支持集群数据冗余,以及数据动态拉取,对于数据灾备提供了很好的支持

    缺点:

  3. 对磁盘资源消耗严重。rrdtool自带的归档功能,会消耗大量的磁盘IO。
  4. 精确的历史数据保存时间短,不利于历史的现场回放。默认只保存12H的原始数据。

 
 
 

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

  1. openfalcon源码分析之hbs

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

  2. openfalcon源码分析之Judge

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

  3. openfalcon源码分析之transfer

    本节内容 transfer功能 transfer接收数据来源 transfer数据去向 transfer的一致性hash transfer的一致性hash key的计算 transfer源码分析 2. ...

  4. openfalcon源码分析之agent

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

  5. Spark GraphX图计算简单案例【代码实现,源码分析】

    一.简介 参考:https://www.cnblogs.com/yszd/p/10186556.html 二.代码实现 package big.data.analyse.graphx import o ...

  6. docker 源码分析 四(基于1.8.2版本),Docker镜像的获取和存储

    前段时间一直忙些其他事情,docker源码分析的事情耽搁了,今天接着写,上一章了解了docker client 和 docker daemon(会启动一个http server)是C/S的结构,cli ...

  7. 【Cocos2d-x 3.x】 事件处理机制源码分析

    在游戏中,触摸是最基本的,必不可少的.Cocos2d-x 3.x中定义了一系列事件,同时也定义了负责监听这些事件的监听器,另外,cocos定义了事件分发类,用来将事件派发出去以便可以实现相应的事件. ...

  8. 《深入理解Spark:核心思想与源码分析》(第2章)

    <深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...

  9. docker 源码分析 一(基于1.8.2版本),docker daemon启动过程;

    最近在研究golang,也学习一下比较火的开源项目docker的源代码,国内比较出名的docker源码分析是孙宏亮大牛写的一系列文章,但是基于的docker版本有点老:索性自己就git 了一下最新的代 ...

随机推荐

  1. python采用pika库使用rabbitmq总结,多篇笔记和示例(转)

    add by zhj:作者的几篇文章参考了Rabbitmq的Tutorials中的几篇文章. 原文:http://www.01happy.com/python-pika-rabbitmq-summar ...

  2. 将expression转化为数据类型int时发生算术溢出错误

    在SQL Server 中,某列的数据都在int范围之内,但是使用sum聚集函数求该列和的时候,出现“将expression转化为数据类型int时发生算术溢出错误”. 问题在于定义的数据类型: 首先, ...

  3. RedHat Linux文本模式下乱码解决方法

    如果在安装RedHat Linux时选择中文未缺省语言,在文本模式下会出现乱码情况,对于在CLI(command-line interface,命令行界面)方式下调试程序时诸多不便,因为出错信息全是乱 ...

  4. Java基础知识Set、List、Map的区别

    就学习经验,浅谈Java中的Set,List,Map的区别,对JAVA的集合的理解是相对于数组: 数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),JAVA集合可以存储和操 ...

  5. 2015ACM/ICPC亚洲区沈阳站 Solution

    A - Pattern String 留坑. B - Bazinga 题意:找一个最大的i,使得前i - 1个字符串中至少不是它的子串 思路:暴力找,如果有一个串已经符合条件,就不用往上更新 #inc ...

  6. poj1228 Grandpa's Estate

    地址:http://poj.org/problem?id=1228 题目: Grandpa's Estate Time Limit: 1000MS   Memory Limit: 10000K Tot ...

  7. Openresty学习汇总

    在锤子科技发布会上,提到给Openresty的捐赠的事情,出于好奇我在是网上查询了Openresty,看到了Openresty的官网(http://openresty.org/en/).看到介绍说的很 ...

  8. Java final finally finalize有什么不同

    ① final 可以用来修饰类.方法.变量, ----final修饰的class代表不可以继承扩展 ----final的变量不可以修改 ----final的方法不可以override ----fina ...

  9. Android ActionBar自定义

    关于自定义的ActionBar的实现过程,这里做下笔记以供之后查看. 1.默认状态 使用Android Studio新建一个名为“ActionBar”的应用,默认actionbar如图(1)所示. 图 ...

  10. 中通快递单api查询

    request POST https://hdgateway.zto.com/WayBill_GetDetail HTTP/1.1Host: hdgateway.zto.comConnection: ...