openfalcon源码分析之graph
openfalcon源码分析之graph
本节内容
- graph功能
- graph源码分析
- 2.1 graph中重要的数据结构
- 2.2 graph的简要流程图
- 2.3 graph处理数据过程
- 2.4 graph数据迁移
- graph设计优缺点
- 优点:
- 缺点:
1. graph功能
graph在整个falcon项目中的位置就是把transfer push上来的数据进行采样存储,并提供查询接口。
graph使用rrdtool保存数据,上报来的数据,被存在一个个的rrd文件中,同时会对数据进行采采样,最大值,最小值,和平均值,保存历史数据归档,这样既节省了存储空间,又不会在查询长时间段时导致数据量太大,加载效率变低。
2. graph源码分析
2.1 graph中重要的数据结构
首先,介绍下graphs中几个重要的数据结构:
MD5Endpoint+Metric+Tags拼接之后通过MD5计算出的HASH值RRD缓存数据的KEYMD5+dsType+step拼接的字符串UUIDendpoint+metric+tags+dstype+step拼接之后通过MD5计算出的HASH值IndexedItemCache一个大MAP,key是MD5,value是UUID和GraphItem组成的struct,用来保存每个上报的数据对应的索引,默认最大大小500WunIndexedItemCache一个大MAP,key是MD5,value是UUID和GraphItem组成的struct,用来保存没有被上报到数据库中的数据的索引默认最大大小500WdbEndpointCachegraph库中的endpoint表的内存缓存,key:endpoint(string) / value:id(int64)dbEndpointCounterCachegraph库中的endpoint_counter表的内存缓存,key:endpoint_id-counter(string) / val:dstype-step(string)缓存时间10分钟,每1分钟检查一次GraphItemMap大MAP,默认大小是1800的一个list,来了数据之后,先对RRD-KEY进行CRC32进行循环冗余之后,对1800取余,获取索引,该索引对应的是一个MAP,key是RRD-KEY,value是链表,链表的每个节点保存一个GraphItem。HistoryCache大MAP,key是MD5,value是链表,每个节点是GraphItem,只保留最新的三个数据
2.2 graph的简要流程图
下面是整个graph的流程简图:

2.3 graph处理数据过程
上面已经做好了前期铺垫,接下来展开分析一下graph中数据处理的流程。
首先介绍graph从transfer中拿到数据后的操作:
Graph.Send方法获取到transfer传输过来的GraphItems,交给HandleItems处理。- 循环
GraphItems,获取每个GraphItem都进行下面三个操作:- 把
GraphItempush到store.GraphItems这个大MAP对应的位置中 - 调用
index.ReceiveItem方法,判断数据是否之前已经上报过,如果上报过,更新到IndexedItemCache MAP中,否则,判断其对应的rrd文件是否存在,如果存在,直接加入到IndexedItemCache中,如果不存在,放到unIndexedItemCache map中。 - 调用
store.AddItem方法,将数据添加到HistoryCache中,并把老的数据删掉,只保留最近三个数据
- 把
unIndexedItemCache中的数据会定期刷新到数据库的graph库的endpoint表tag_endpoint表endpoint_counter表中并添加到IndexedItemCache中,最后在unIndexedItemCache中删除。store.GraphItems中的数据定期刷入到磁盘上的RRD文件中。
graph中的Graph.Query方法获取要查询的数据后进行的操作:
- 根据
param.Endpoint,param.Counter生成MD5值,去IndexedItemCache中找dsType和step,若没找到,去dbEndpointCache和dbEndpointCounterCache查询,若还是没找到,则到数据库中查找对应的dsType和step,后把找到的数据缓存到dbEndpointCache和dbEndpointCounterCache中。 - 计算
start_ts和end_ts,从store.GraphItems中拿到还没被缓存进RRD文件的数据,再去RRD文件中取出对应的数据(如果cfg支持migrate,以及判断查询数据不在这个Graph实例,则从其它Graph实例进行查询) - 将
RRD文件中查到的数据和缓存的数据进行merge之后,生成最终数据返回给调用方。
graph中的Graph.Delete方法接收GraphDeleteParam组成的列表,并彻底删除相应的数据
IndexedItemCache和unIndexedItemCache中删除对应的数据store.GraphItems中清空对应节点缓存的数据- 删除对应的RRD文件
以上就是主要提供使用最频繁的 RPC API,下面介绍Http提供的主要API
/index/updateAll该API将触发索引全量更新, 同步操作,会把所有IndexedItemCache中的数据,全部刷入到数据库中,这个功能在调试的时候有用。/index/updateAll/concurrent该API能获取索引全量更新的并行数/api/v2/index更新一条索引数据,用于手动建立索引endpoint metric step dstype tags/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设计优缺点
优点:
- 使用rrdtool存储数据,相对于数据库存储数据,大大减轻了压力,最大的性能瓶颈被解决了
支持集群数据冗余,以及数据动态拉取,对于数据灾备提供了很好的支持
缺点:
- 对磁盘资源消耗严重。rrdtool自带的归档功能,会消耗大量的磁盘IO。
精确的历史数据保存时间短,不利于历史的现场回放。默认只保存12H的原始数据。
openfalcon源码分析之graph的更多相关文章
- openfalcon源码分析之hbs
openfalcon源码分析之hbs 本节内容 hbs功能 hbs源码分析 hbs设计优劣 1. hbs功能 hbs在整个open-falcon项目中承担的角色就是连接数据库,作为数据库缓存,缓存配置 ...
- openfalcon源码分析之Judge
openfalcon源码分析之Judge 本节内容 Judge功能 源码分析 设计优缺点 1. Judge功能 在open-falcon中,Judge模块的功能是通过从HBS上同步告警的strateg ...
- openfalcon源码分析之transfer
本节内容 transfer功能 transfer接收数据来源 transfer数据去向 transfer的一致性hash transfer的一致性hash key的计算 transfer源码分析 2. ...
- openfalcon源码分析之agent
本节内容 agent功能 1.1 agent上报数据 1.2 agent与HBS同步 1.3 agent Http服务 agent源码分析 2.1 初始化config配置 2.2 初始化根目录,本地I ...
- Spark GraphX图计算简单案例【代码实现,源码分析】
一.简介 参考:https://www.cnblogs.com/yszd/p/10186556.html 二.代码实现 package big.data.analyse.graphx import o ...
- docker 源码分析 四(基于1.8.2版本),Docker镜像的获取和存储
前段时间一直忙些其他事情,docker源码分析的事情耽搁了,今天接着写,上一章了解了docker client 和 docker daemon(会启动一个http server)是C/S的结构,cli ...
- 【Cocos2d-x 3.x】 事件处理机制源码分析
在游戏中,触摸是最基本的,必不可少的.Cocos2d-x 3.x中定义了一系列事件,同时也定义了负责监听这些事件的监听器,另外,cocos定义了事件分发类,用来将事件派发出去以便可以实现相应的事件. ...
- 《深入理解Spark:核心思想与源码分析》(第2章)
<深入理解Spark:核心思想与源码分析>一书前言的内容请看链接<深入理解SPARK:核心思想与源码分析>一书正式出版上市 <深入理解Spark:核心思想与源码分析> ...
- docker 源码分析 一(基于1.8.2版本),docker daemon启动过程;
最近在研究golang,也学习一下比较火的开源项目docker的源代码,国内比较出名的docker源码分析是孙宏亮大牛写的一系列文章,但是基于的docker版本有点老:索性自己就git 了一下最新的代 ...
随机推荐
- php版本管理工具composer安装及使用
类似于web前端有gulp,webpack,grunt.php也有专门的包安装管理和安装工具,即composer. composer官网:https://getcomposer.org 中文 ...
- DNS的MX记录和CNAME记录(转)
MX记录就是邮件域名对邮件服务器(域名)的映射.可以映射到多个邮件服务器,发送时会选择一台发送. 拿到新域名后,还要再查找DNS,将域名转不ip 原文:http://my.oschina.net/u/ ...
- 三个小时学会wordpress模板制作
最近接了一个项目需要用wordpress建站,版面相对简单,ytkah就琢磨着自己来设计wordpress模板,首页栏目页文章页(很多网站无外乎就这些页面),其中栏目页和首页又很像,都是调用文章列表. ...
- Redux 入门教程
Redux 入门教程(三):React-Redux 的用法(53@2016.09.21) Redux 入门教程(二):中间件与异步操作(32@2016.09.20) Redux 入门教程(一):基本用 ...
- [环境配置] 如何为Apache绑定多IP多域名
在Apache服务器上绑定方法比较简单,主要因为Apache是个开源独立的服务器软件,而且支持跨平台安装和配置,支持丰富的API扩展,所以很多人对Apache的好感要甚于IIS,Apache的优点就不 ...
- ng-深度学习-课程笔记-16: 自然语言处理与词嵌入(Week2)
1 词汇表征(Word representation) 用one-hot表示单词的一个缺点就是它把每个词孤立起来,这使得算法对词语的相关性泛化不强. 可以使用词嵌入(word embedding)来解 ...
- python 手动遍历迭代器
想遍历一个可迭代对象中的所有元素,但是却不想使用for 循环 为了手动的遍历可迭代对象,使用next() 函数并在代码中捕获StopIteration 异常.比如,下面的例子手动读取一个文件中的所有行 ...
- SQLServer cast()函数
语法: CAST (expression AS data_type) 参数说明: expression:任何有效的SQLServer表达式. AS:用于分隔两个参数,在AS之前的是要处理的数据,在AS ...
- Linux Makefile
动态库: gcc getmaxlen.c –fPIC –shared –o libtest.so ldd -r libtest.so 静态库: ar crv libfirst.a testlib ...
- 【转载】Java动态代理之JDK实现和CGlib实现(简单易懂)
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6542259.html 一:代理模式(静态代理) 代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是 ...