功能

  • 存储agent push的数据

  • 为query 提供查询数据接口

参考RRDtool的理念,在数据每次存入的时候,会自动进行采样、归档。在默认的归档策略,一分钟push一次的频率下,

历史数据保存5年。同时为了不丢失信息量,数据归档的时候,会按照平均值采样、最大值采样、最小值采样存三份。

用户在查询某个metric,在过去一年的历史数据时,Graph会选择最合适的采样频率,返回采样过后的数据,提高了数据查询速度。

配置文件



{

    "debug": false, //true or false, 是否开启debug日志

    "http": {

        "enabled": true, //true or false, 表示是否开启该http端口,该端口为控制端口,主要用来对graph发送控制命令、统计命令、debug命令

        "listen": "0.0.0.0:6071" //表示监听的http端口

    },

    "rpc": {

        "enabled": true, //true or false, 表示是否开启该rpc端口,该端口为数据接收端口

        "listen": "0.0.0.0:6070" //表示监听的rpc端口

    },

    "rrd": {

        "storage": "/home/work/data/6070" //绝对路径,历史数据的文件存储路径(如有必要,请修改为合适的路)

    },

    "db": {

        "dsn": "root:@tcp(127.0.0.1:3306)/graph?loc=Local&parseTime=true", //MySQL的连接信息,默认用户名是root,密码为空,host为127.0.0.1,database为graph(如有必要,请修改)

        "maxIdle": 4  //MySQL连接池配置,连接池允许的最大连接数,保持默认即可

    },

    "callTimeout": 5000,  //RPC调用超时时间,单位ms

    "migrate": {  //扩容graph时历史数据自动迁移

        "enabled": false,  //true or false, 表示graph是否处于数据迁移状态

        "concurrency": 2, //数据迁移时的并发连接数,建议保持默认

        "replicas": 500, //这是一致性hash算法需要的节点副本数量,建议不要变更,保持默认即可(必须和transfer的配置中保持一致)

        "cluster": { //未扩容前老的graph实例列表

            "graph-00" : "127.0.0.1:6070"

        }

    }

}

默认端口

  • http:6071 提供graph本身的管理功能API

  • rpc:6070 用于接收transfer push 的分片数据和为query提供查询接口

存储过程

  • 接收数据

    接收到transfer push的数据之后,按rrd数据库解析数据,计算出UUID和MD5,计算方式为:

    * item.UUID = item.endpoint + item.metric + item.tags + item.dstype + item.step
    
    * item.md5 = item.endpoint + item.metric + item.tags
  • 处理数据

    graph会将item进行三种处理

    • 刷入本地缓存,即内存队列中,定期将队列中的数据存储到rrd文件,rrd命名规则:RRDFileName = rrd_base_path + item.md5 + item.dstype + item.step

    • 建立本地索引,首先会尝试增量建立索引,当索引接受到数据后,通过数据的checksum值来确定是不是这个来自endpoint的metric是否是第一次采集数据。如果不是第一次采集数据,

则在indexedItemCache中能够找到,并且如果uuid没变则只更新item。如果uuid变了重新index操作(涉及dstype和step的改变)。

如果是第一次数据采集,在indexeditemCache中找不到,添加到unindexeditemCache中,等待被索引。最后定时会unindexeditemCache中创建索引,保存到mysql数据库中,此时涉及mysql数据库三张表

* endpoint 表。该表记录了所有上报数据的endpoint,并且为每一个endpoint生成一个id即 endpoint_id。

* tag_endpoint表。拆解item的每一个tag。用tag和endpoint形成一个主键的表。记录每个endpoint包含的tag。每条记录生成一个id,为tagendpoint_id

* endpoint_counter表。counter是metric和tags组合后的名词


mysql> desc endpoint;

+----------+------------------+------+-----+-------------------+-----------------------------+

| Field    | Type             | Null | Key | Default           | Extra                       |

+----------+------------------+------+-----+-------------------+-----------------------------+

| id       | int(10) unsigned | NO   | PRI | NULL              | auto_increment              |

| endpoint | varchar(255)     | NO   | UNI |                   |                             |

| ts       | int(11)          | YES  |     | NULL              |                             |

| t_create | datetime         | NO   |     | NULL              |                             |

| t_modify | timestamp        | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |

+----------+------------------+------+-----+-------------------+-----------------------------+

5 rows in set (0.00 sec)

mysql> desc endpoint_counter ;

+-------------+------------------+------+-----+-------------------+-----------------------------+

| Field       | Type             | Null | Key | Default           | Extra                       |

+-------------+------------------+------+-----+-------------------+-----------------------------+

| id          | int(10) unsigned | NO   | PRI | NULL              | auto_increment              |

| endpoint_id | int(10) unsigned | NO   | MUL | NULL              |                             |

| counter     | varchar(255)     | NO   |     |                   |                             |

| step        | int(11)          | NO   |     | 60                |                             |

| type        | varchar(16)      | NO   |     | NULL              |                             |

| ts          | int(11)          | YES  |     | NULL              |                             |

| t_create    | datetime         | NO   |     | NULL              |                             |

| t_modify    | timestamp        | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |

+-------------+------------------+------+-----+-------------------+-----------------------------+

8 rows in set (0.00 sec)

mysql> desc tag_endpoint;

+-------------+------------------+------+-----+-------------------+-----------------------------+

| Field       | Type             | Null | Key | Default           | Extra                       |

+-------------+------------------+------+-----+-------------------+-----------------------------+

| id          | int(10) unsigned | NO   | PRI | NULL              | auto_increment              |

| tag         | varchar(255)     | NO   | MUL |                   |                             |

| endpoint_id | int(10) unsigned | NO   |     | NULL              |                             |

| ts          | int(11)          | YES  |     | NULL              |                             |

| t_create    | datetime         | NO   |     | NULL              |                             |

| t_modify    | timestamp        | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |

+-------------+------------------+------+-----+-------------------+-----------------------------+

6 rows in set (0.00 sec)

建立索引的目的是为了更快定位rrd文件,而rrd文件命名是受endpoint、metric、tags、dstype、step决定的,所以当查询请求时,不可能便利所有的rrd文件,会先读取数据表的数据,拼接出rrd文件路径,然后根据时间范围进行获取数据

  • 存入实时数据(HistoryCache,虽然叫history,但是其实只保存了每个指标的最近3份数据)

查询过程

  • 根据endpoint和counter,从索引中获取dsType和step

    • 生成md5 :endpoint + counter => md5

    • 从indexedItemCache查找md5对应的item

    • 没有找到的话,从DB中进行查找

  • 开始/结束时间,按照step进行取整

  • 根据endpoint、counter、dsType、step,获取对应的RRD文件名

  • 从cache中查询数据 :根据cache key获取items和flag

  • 从历史数据中查询数据,如果cfg支持migrate,以及判断查询数据不在这个Graph实例,则从其它Graph实例进行查询。否则,查询本地rrd文件

  • 将cache中的数据,以及rrd/其它Graph实例中的数据,进行合并

数据迁移过程

Graph模块支持在集群成员改变的情况下,将其它Graph模块的数据拉取过来,或者向其它Graph模块发送本地的数据,达到数据迁移的目的。

配置:



     "migrate": {

          "enabled": false,

          "concurrency": 2,

          "replicas": 500,

          "cluster": {

              "graph-00" : "127.0.0.1:6070"

          }

      }

字段含义为:

  • enabled:是否启动迁移功能

  • concurrency:每个一致性哈希节点,负责迁移数据的工作协程数

  • replicas:一致性哈希中,每份数据的重复数

  • cluster:节点名称以及具体IP端口

open-falcon之graph的更多相关文章

  1. 【Open-Falcon】Linux下安装Open-Falcon

    一.Open-Falcon组件简述 [Open-Falcon绘图相关组件] Agent:  部署在目标机器采集机器监控项 Transfer : 数据接收端,转发数据到后端Graph和Judge Gra ...

  2. Hive SQL 监控系统 - Hive Falcon

    1.概述 在开发工作当中,提交 Hadoop 任务,任务的运行详情,这是我们所关心的,当业务并不复杂的时候,我们可以使用 Hadoop 提供的命令工具去管理 YARN 中的任务.在编写 Hive SQ ...

  3. Falcon Genome Assembly Tool Kit Manual

    Falcon Falcon: a set of tools for fast aligning long reads for consensus and assembly The Falcon too ...

  4. Falcon:三代reads比对组装工具箱

    主页:github: PacificBiosciences/FALCON 简介 Falcon是一组通过快速比对长reads,从而来consensus和组装的工具. Falcon工具包是一组简单的代码集 ...

  5. openfalcon源码分析之graph

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

  6. Falcon

    1. JE falcon还需要安装je用来处理jdbc,否则打不开falcon的页面,爆内部错误503,然后看异常信息:Caused by: org.apache.falcon.FalconExcep ...

  7. centos安装 Falcon+

    1:环境 准备 : 安装 go环境 :下载 - Golang中国 参照 :http://www.cnblogs.com/Amos-Turing/p/8494250.html 安装 mysql 安装 r ...

  8. 关于open falcon 与nightingale 的一些调研

    针对 open-falcon 与 nightingale 的调研 一.open-falcon 1.1 组件介绍 1.1.1 agent > agent用于采集机器负载监控指标,比如cpu.idl ...

  9. [开发笔记] Graph Databases on developing

    TimeWall is a graph databases github It be used to apply mathematic model and social network with gr ...

  10. Introduction to graph theory 图论/脑网络基础

    Source: Connected Brain Figure above: Bullmore E, Sporns O. Complex brain networks: graph theoretica ...

随机推荐

  1. Java如何显示不同语言的时间?

    在Java中,如何显示不同语言的时间? 此示例使用DateFormat类以中文语言显示时间. package com.yiibai; import java.text.DateFormat; impo ...

  2. lua------------------Unity3D研究院编辑器之打开unity不可识别的文件(十三)

    Unity3D研究院编辑器之打开unity不可识别的文件(十三) 雨松MOMO [Unity3D拓展编辑器] 围观8597次 9 条评论 编辑日期:2017-03-02 字体:大 中 小   有些特殊 ...

  3. vegan 包进行Adonis 分析

    Adonis 分析 是基于距离矩阵的多变量方差置换分析, 代码示例: 默认使用bray 距离来计算样本间的距离矩阵 参考资料: https://www.rdocumentation.org/packa ...

  4. QIIME1 聚OTU

    qiime 本身不提供聚类的算法,它只是对其他聚otu软件的封装 根据聚类软件的算法,分成了3个方向: de novo:                   pick_de_novo_otus.py  ...

  5. Easyradius对接WayOs维盟小区版XQ教程

    维盟极众多人的意见,然后又推出来一个新版本,唉~~~以前也是只有PC,有人给大量建议后,就再出个ISP,直接价格翻倍,再后来大家要桥接的功能又推出一个S9,这日子啥时候是个头啊. 小区版最主要的亮点就 ...

  6. UNIX环境编程学习笔记(5)——文件I/O之fcntl函数访问已打开文件的性质

    lienhua342014-08-29 fcntl 函数可以改变已打开的文件的性质. #include <fcntl.h> int fcntl(int filedes, int cmd, ...

  7. Spring Boot 添加JSP支持【转】

    Spring Boot 添加JSP支持 大体步骤: (1)            创建Maven web project: (2)            在pom.xml文件添加依赖: (3)     ...

  8. ABBYY FineReader Pro for Mac系统要求

    ABBYY FineReader Pro for Mac作为先进的OCR图文识别软件,为各种各样的任务提供全面的解决方案,可轻松将纸质文档.PDF文件和数字文本照片转换为可编辑和可搜索的文件,替代了手 ...

  9. 在mvc4中多语言建站的实例

    环境:vs2012 asp.net mvc4. 实现方式:resource 资源文件,根据路由规则中Lang参数来判断载入哪种语言方式 在网上找到了相关资料,顺便自己做了个练习,新建工程之类的步骤就免 ...

  10. VSCode升级后启动不了~

    之前安装了VSCode,一直用的好好的,每次启动后后下角总会提示自己有新版本可以更新,然后就手贱点击了更新,然后就出问题了,更新后VSCode无法启动,打不开了,哭死! 于是,我尝试了以下方法,均无济 ...