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. day18(JDBC事务&连接池介绍&DBUtils工具介绍&BaseServlet作用)

    day18总结 今日思维导图: 今日内容 事务 连接池 ThreadLocal BaseServlet自定义Servlet父类(只要求会用,不要求会写) DBUtils à commons-dbuti ...

  2. WebDriver API 实例详解(四)

    三十一.使用页面的文字内容识别和处理新弹出的浏览器窗口 被测试网页的HTML源码: <html> <head> <meta charset="UTF-8&quo ...

  3. Spring整合Mybatis解决 Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required

    在Spring4和Mybatis3整合的时候,dao层注入'sqlSessionFactory'或'sqlSessionTemplate'会报错解决办法如下: package com.alibaba. ...

  4. CentOS 7 SSH 免密登录的方法

    先决条件 3 台 CentOS 7 HOSTNAME IP ROLE server1 10.8.26.197 Master server2 10.8.26.196 Slave1 server3 10. ...

  5. 微博开源框架Motan初体验

    前两天,我在开源中国的微信公众号看到新浪微博的轻量Rpc框架--Motan开源了.上网查了下,才得知这个Motan来头不小,支撑着新浪微博的千亿调用,曾经在2014年的春晚中有着千亿次的调用,对抗了春 ...

  6. 2018 Multi-University Training Contest 10 Solution

    A - Problem A.Alkane 留坑. B - Problem B. Beads 留坑. C - Problem C. Calculate 留坑. D - Problem D. Permut ...

  7. uva10537 dijkstra + 逆推

    21:49:45 2015-03-09 传送 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8& ...

  8. 20145202马超 2016-2017-2 《Java程序设计》第8周学习总结

    20145202马超 2016-2017-2 <Java程序设计>第8周学习总结 教材学习内容总结 第十四章 NIO与NIO2 NIO使用频道(channel)来衔接数据节点,对数据区的标 ...

  9. Spring MVC 复习笔记04

    复习 springmvc框架: DispatcherServlet前端控制器:接收request,进行response HandlerMapping处理器映射器:根据url查找Handler.(可以通 ...

  10. map.containsKey

    该方法判断Map集合对象中是否包含指定的键名.如果Map集合中包含指定的键名,则返回true,否则返回false. 语法  containsKey(Object key) . e.g public s ...