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. Web开发:URL编码与解码(转)

    原文:http://www.cnblogs.com/greatverve/archive/2011/12/12/URL-Encoding-Decoding.html 通常如果一样东西需要编码,说明这样 ...

  2. 004-ant design -dispatch、request、fetch

    一.dispatch 函数 typedispatch = (a: Action) => Action dispatching function 是一个用于触发 action 的函数,action ...

  3. chrome 关闭安全模式

    chrome.exe --disable-web-security --user-data-dir

  4. Python笔记 #09# Basic plots with matplotlib

    源:DataCamp 气泡的大小表示人口的多少,横坐标表示人均GDP(美元),纵坐标表示预期寿命.-- 作者:Hans Rosling Python 中有许许多多用于可视化的包,而 matplotli ...

  5. bzoj1607 / P2926 [USACO08DEC]拍头Patting Heads

    P2926 [USACO08DEC]拍头Patting Heads 把求约数转化为求倍数. 累计每个数出现的个数,然后枚举倍数累加答案. #include<iostream> #inclu ...

  6. 20145104张家明 《Java程序设计》第3周学习总结

    20145104张家明 <Java程序设计>第4周学习总结 教材学习内容总结 第四章 认识对象 4.1 类与对象 4.1.1 定义类 类定义时使用class关键词,建立实例要用new关键词 ...

  7. 20145309 李昊 《网络攻防》 Exp2 后门原理与实践

    实践内容: (1)理解免杀技术原理(1分) (2)正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧:(2分) (3)通过组合应用各种技术实现恶意代码免杀( ...

  8. Javaworkers团队第二周项目总结

    本周项目进展 本周我们小组成员在图书馆和网上查阅了很多资料,基本达到了预期的计划,完成了项目框架设计及代码模块设计. 设计思路 1.首先,根据用户需求合理分配代码密度,即: 用户直接操作(点击运行)的 ...

  9. HashMap 遍历的两种方式及性能比较

    HashMap 是Java开发中经常使用的数据结构.相信HashMap 的基本用法你已经很熟悉了.那么我们该如何遍历HashMap 呢?哪种遍历方式的性能更好呢?本篇文章来为你解决这个疑惑. 一.Ha ...

  10. JS封装简单后代选择器

    大概思路是这样的:通过判断传过来的参数是什么类型,如果是对象,那这里就是this(因为封装是自己用的,肯定不会随便乱传一个对象过来),如果是一个函数(匿名函数),那就是Dom加载(这里先不讲),如果是 ...