• open-falcon之graph


    功能

    • 存储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端口

  • 相关阅读:
    luogu P4852 yyf hates choukapai 单调队列优化dp
    luogu P2605 [ZJOI2010]基站选址 线段树优化dp
    7.9 NOI模拟赛 数列 交互 高精 字符串
    AGC 043 C
    7.9 NOI模拟赛 A.图 构造 dfs树 二分图
    7.9 NOI模拟赛 C.走路 背包 dp 特异性
    2020 高考记
    7.6 NOI模拟赛 灯 根号分治
    python-08-元组
    python-07-列表
  • 原文地址:https://www.cnblogs.com/pycode/p/6722403.html
Copyright © 2020-2023  润新知