2018-04-25-falcon-plus之graph模块详解.md

数据存储

graph模块负责将agent采集到的监控数据存储到rrd中。根据源代码整理了如下流程图。

需要了解四个关键的数据结构:

  • GraphItems:一个用来保存接收到的所有监控数据(之后会定期写入磁盘rrd文件中)
  • HistoryCache: 保存最近三次接收到的历史数据(主要用于绘图数据的查询)
  • IndexedItemCache: 已经写入mysql的索引数据
  • UnIndexedItemCache: 尚未写入mysql的索引

大致流程为:

  1. 接收数据=>保存监控数据=>保存索引=>保存历史数据
  2. 定期将内存数据GraphItems写入磁盘
  3. 定期更新索引到mysql

1、2、3这三个过程并行运行

流程图

graph数据存储流程图

扩容

简介

首先说明falcon需要扩容的场景:数据量过大,整个graph集群中,单台graph占用的内存达到机器的瓶颈,若短期内不处理,机器的内存使用将超限,严重的将导致机器宕机。

因此,扩容的意思即是:增加graph集群使用的机器数量,分散监控数据,使得单台graph占用的机器内存减小。

falcon绘图数据的存储使用的是rrd,依据的算法是一致性hash算法。因此,增加机器意味着之前写入A机器的数据现在可能写入新增加的机器B,必须要把旧机器上A的数据迁移到新的机器B上,才能保证查询数据的正确性。

原理

知道了为什么扩容以及扩容的基础知识,就可以更好的理解其原理了。

  1. 当增加机器时,部分数据会写入新机器B(这些数据在未扩容之前是写入A机器),数据写入时,先不落盘,而是先从旧的机器A上拉取历史数据(就是一个rrd文件),拉取成功,则将整个文件写入本地磁盘。若拉取超时(1s),则将新接收到的数据传送给旧的A机器。待下一个周期再重复此过程,直到A机器上的历史数据写入本地磁盘成功。
  2. 为保证扩容过程中依然可以查看绘图数据,当查询数据时落到新加的机器时,若本地有数据则直接返回本地数据,若本地没有数据则从旧的机器A上查询并与本地cache合并返回给用户。

流程图

扩容流程

扩容过程

  1. 配置新的graph实例
  2. 重启所有graph(最好一台一台重启,防止重启过程中丢失数据)
  3. 修改transfer配置,加入新graph,重启
  4. 修改api配置,加入新graph,重启
  5. 等待扩容完毕

此过程可参见作者写的详细文档扩容操作过程

扩容过程监控

一些关键指标

  • 扩容相关

curl http://localhost:6071/api/v2/counter/migrate

名称 解释 备注
FETCH_S_ERR 拉取rrd文件失败 严重错误,数据堆积内存,无法写入本地磁盘
FETCH_S_SUCCESS 拉入rrd文件成功 成功标识
FETCH_S_ISNOTEXIST 远端机器没有rrd文件 直接将数据写入本地,成功标识
SEND_S_SUCCESS 向远端机器发送数据成功 说明fetch超时了,将数据写入远端成功
SEND_S_ERR 向远端机器发送数据失败 说明fetch超时了,写入远端也失败了,将会有数据丢失
QUERY_S_SUCCESS 查询成功 扩容过程中有查询操作,从远端查询数据成功
QUERY_S_ERR 查询失败 扩容过程中有查询操作,从远端查询数据失败(不影响扩容)
  • graph相关

curl http://localhost:6071/counter/all

名称 解释 备注
GraphRpcRecvCnt graph接收到的数据个数

监控图

指标监控

参考