#研发解决方案介绍#基于StatsD+Graphite的智能监控解决方案

郑昀 基于李丹和刘奎的文档 创建于2014/12/5

关键词:监控、dashboard、PHP、graphite、statsd、whisper、carbon、grafana、influxdb、Python


本文档适用人员:研发和运维员工

提纲:

  1. 监控平台要做到什么程度?为什么要自己做?
  2. 几个通用技术问题
    • 绘图所依赖的数据如何收集?如何加工?如何存储?
    • 图形如何绘制,各种指标如何叠加?
    • 拓扑关系如何绘制?
  3. 技术选型哲学
  4. 最终选了statsd+graphite
  5. 数据的采集
  6. 数据存储的粒度
  7. 天机的技术选型

一,监控平台要做到什么程度?为什么要自己做?

运维监控满满都是着各种开源系统以及它们的 Dashboard:

  • Zabbix
  • Nagios
  • Centreon
  • Logstash
  • Ganglia+Cacti

以及各种业务指标趋势的 Dashboard。

我们认为,监控不能只是各种数据的采集和罗列,不仅仅是弄若干个报表并进一步配置成仪表盘,而是有一定智能,仿照我们日常的排查问题思路,建立一定规则,自动检查,深度检查,友情提示

随手举一个例子:


规则:模仿我们发现问题后先检查数据库主从同步是否有问题的习惯

天机系统发现成单金额或验证券数或短信发送条数环比大幅下降后,启动检查规则,

自动逐一检查各种从库的主从同步情况。

如果发现主从延迟超过阈值,则天机 DashBoard 应浮出两条红色警告提示(可点击进入):

  • 5分钟销售数据环比下降50%
  • 某某从库DBXXXX与主库DBYYYY的同步延迟了300秒

如果发现主从同步失败导致了同步停止,则应浮出两条红色警告提示(可点击进入):

  • 5分钟验证券数环比下降40%
  • 某某从库DBXXXX与主库DBYYYY的同步停止,失败原因为:blabla

就这样,只有自己动手,才能把我们日常分析问题、定位问题的经验变成一条条系统规则,还是那句话:

自动化才是王道。

二,几个通用技术问题
  大致想来,李丹刘奎还需要解决这么几个基础问题:

2.1.绘图所依赖的监控原始数据如何收集?如何加工?如何存储?

不同运维指标和业务指标的时间粒度大小不一,1秒、1分钟、5分钟……

数据是业务方自行上报?还是主动采集?考虑一下可伸缩性:如果是数以百计物理机、成千上万个虚拟机或容器的数以万计指标呢?如果采集频率非常高呢?

拿到原始数据后,原始数据至少还要经过 min/max/sum/count/mean/media……等计算才能变为可视化图表要展示的维度。

这些东西又怎么存储?

2.2.图形如何绘制,各种指标如何叠加?

在使用 Centreon 时,我们就抱怨不能把多个维度的指标自由组合后叠加在一张图上看。是的,Centreon 能在一张图上展示某个主机的它定义好的几个指标,如下图所示:

图1 centreon图例

但我们希望还能把不同主机的不同指标按我们的意愿放在一张图上绘制,也就是可配置的,这样有利于排查问题,能快速看出趋势变化和关联关系。

其次,绘图得快,而且运维看的都是近乎实时的度量数据,怎么才能足够快。

2.3.拓扑关系如何绘制?

拓扑关系很重要,最好能自动可视化,毕竟一图胜过千言万语。

随手举个例子:


数据库拓扑关系

在监控系统里登记了 DB 的IP和分组后,其实已经可以探测到 DB 之间的主从关系(包括级联关系)了,能自动绘制出登记的所有数据库服务器之间的关系。举例如下:

图2 自动绘制数据库拓扑

三,技术选型哲学

选型两个重要观点:

  1. 不重复制造轮子;
  2. 既然找轮子,那这个轮子就应该只做一件事,且把它做到最好。

可供选择的方案有:

  1. grafana + influxdb
  2. statsd + graphite
  3. collectd + graphite
  4. grafana + graphite

3.1.StatsD

2013年eBay 云谈及 OpenStack 的监控和报警时,提及了 statsd 和 graphite,如下图所示:

图3 ebay云的监控报警

StatsD 是一个 NodeJs 的 daemon 程序,简单轻巧,使用 UDP 协议,专门用来收集数据,收集完数据就发送到其他服务器进行处理。

3.2.Graphite

Graphite 是一个企业级的监控工具,用 Python 编写,采用 django 框架,sqlite 数据库存储,自有简单文本协议通讯,绘图功能强大。最初由 Chris Davis 在 Orbitz 工作时,作为一个辅助项目开发的,最终成了一个监控基础工具,如他所言,Graphite provides real-time visualization and storage of numeric time-series data,重点解决:

  • 实时可视化
  • 时间序列数据的存储

严格地说,Graphite 只是一个根据数据绘图的工具,数据收集通常由第三方工具或插件完成,它自带了 carbon 和 whisper,还可根据其协议选用别的数据源供其绘图。官方描述,预计用 Ceres 替代 Whisper。

图4 graphite图例

简单的文本协议和强大的绘图功能使得它可以方便地扩展到任何需要监控的系统上。豆瓣、Google、GitHub、Instagram、Uber等公司都用它。

3.3.CollectD

C语言开发的 collectd 是一个较为古老的工具,像 statsd 一样它也做周期性收集统计数据,collectd 还管数据存储。它能够通过插件支持检测各种各样的系统信息,如数据库、UPS。

要想查看 collectd 收集的信息,还需要安装 web 界面或者 Cacti,于是工作模式就是:

collectd 作为守护进程运行,每隔 10 秒收集信息,而 Cacti 每隔5分钟运行一个 PHP 脚本来收集信息(两者的时间间隔可配置)。

3.4.Influxdb

InfluxDB 是一个开源分布式时序、事件和指标数据库。使用 Go 语言编写,无需外部依赖。其设计目标是实现分布式和水平伸缩扩展。向这个时间序列数据库插入数据,每条数据都会自动附加上两个字段,一个时间,一个序列号(用来作为主键的)。

特点:

  • schemaless(无结构),可以是任意数量的列
  • Scalable
  • min, max, sum, count, mean, median 一系列函数,方便统计
  • Native HTTP API, 内置http支持,使用http读写
  • Powerful Query Language,类似SQL
  • Built-in Explorer,自带管理工具

管理界面如下图所示:

图5 influxdb图例

3.5.Grafana

grafana 则类似 ES Kibana 的可视化面板,有着非常漂亮的图表和布局,目前支持 Graphite、Influxdb 和 Opentsdb) + influxdb(分布式时序、事件和指标数据库)等配搭。

grafana 与 influxdb 整合后的效果如下图所示:

图6 grafana+influxdb整合图例

四,最终选了statsd+graphite

  最终李丹和刘奎选择的方案是:statsd(采集) + graphite(绘制, whisper 负责存储)

搭建了 Graphite 之后,你可以在它自带的管理站点上看到所有指标的历史数据,可以选时间范围,如下图所示:

图7 graphite管理站点图例

graphite 管理界面里的图形,请求格式如下所示:

http://graphite系统域名/render/?width=586&height=308&_salt=1410088306.115&target=stats.timers.mysql.172_16_999_999-3306.aborted_clients.upper_90

如果我们的监控系统要把多个指标拼到一个图形上渲染,则请求格式如下所示:

http://监控系统域名/db/createImage/target/%5B%22stats.timers.mysql.172_16_999_991-3306.com_select_persecond.upper%22%2C%22stats.timers.mysql.172_16_999_992-3306.com_select_persecond.upper%22%2C%22stats.timers.mysql.172_16_999_993-3306.com_select_persecond.upper%22%5D/from/-1hour.html?width=492&n=0.8623758849623238

从而绘制出如下图形,这就是我在前面2.2小节说想要的特性:

图8 三个主机的指标绘制在一起

Graphite 分为三个组件:

  1. carbon - a Twisted daemon that listens for time-series data
  2. whisper - a simple database library for storing time-series data (similar in design to RRD)
  3. graphite webapp - A Django webapp that renders graphs on-demand using Cairo

它的 High Level 图如下所示:

图9 graphite high level

从上图看出,Carbon 接到度量数据后,写入 Whisper 库里,Graphite Webapp 去 Whisper 读取数据,系统应该也做了一份缓存,所以你发送数据给 Carbon,立即就可以在 Webapp 中绘图,这也是为什么在磁盘 I/O 反应不过来的时候,Webapp 的图形仍能以接近实时的方式显示的原因。

下面两张图能帮助大家进一步理解 Graphite 里 Carbon 和 Whisper 如何协同的。

图10 graphite 逻辑图

图11 Graphite 数据流转图

五,数据的采集

  采集数据共有两种方式:Get_Data 和 Push_Data。

  • 天机平台主动拉数据,主要集中在数据库的主从同步、数据库的拓扑关系等这样的关系型数据采集上。
  • 其他场景下,基本都需要采集单点状态的数据,则由客户端脚本(即 agent)获取数据后,再推送到天机平台。

 

  采集到的数据会走 UDP 协议发给 StatsD,由 StatsD 解析、提取、计算处理后,周期性地发送给 Graphite。

数据推送到 Graphite 时,时间周期为1分钟,采集1分钟内的业务数据按照 metric_path value timestamp\n 的格式发送。需要注意的是每次发送的数据必须以 \n 结尾,不能省略。

六,数据存储的粒度

首先,我们需要知道 statsD 默认10秒一个周期,可以通过修改 config.js 的 flushInterval 属性变更。

其次,Graphite 里有一个 retention(保留)的概念,即明确数据精度以及丢弃多久之前的数据,在 /opt/graphite/conf/storage-schemas.conf 配置文件里定义。retention 定义的表达式为 frequency:history,每一个 retention 之间用英文逗号分隔。

默认是按10秒一个数据的方式,存一天的数据,一天前的数据就没了,如下面的配置所言:

[default_1min_for_1day]
pattern = .*
retentions = 10s:1d

  可以自定义 retentions,注意表达式里每一个时间间隔必须是第一个的倍数,也就是说,第一个是10s,那么第二个只能是10s的整数倍,以此类推。

天机的数据库监控的粒度为:

[stats]
pattern = ^stats.*
retentions = 10s:1d,30s:7d,1m:28d,15m:5y

依次解释一下:

10s:1d——1天以内的数据是10秒为一个值,

30s:7d——大于1天小于7天内的数据是以30秒为一个值,

1m:28d——大于7天小于28天内的是以1分钟为一个值,

15m:5y——大于28天小于5年的,是以15分钟为一个值,

大于5年的数据丢弃。

当把10秒的数据降为1分钟数据时,默认是算平均值,但你也可以按合计值、最大值、最小值等,反正都在 storage-aggregation.conf 里配置。

天机的业务指标监控的粒度为:

[business_monitoring]pattern = ^business_monitoring\.retentions = 1m:5y

为什么这么定义?因为天机要能绘制任意时间段里粒度为1分钟的业务指标曲线图,所以 Graphite 不能缩小精度。

七,天机的技术选型

  涉及到的开发语言有:

php,node.js,python,javascript

  涉及相关的框架和服务:

Yii,graphite,StatsD,D3js(数据可视化JS框架),pt-query-digest(分析MySQL慢查日志)

最后,天机系统的目标是以最有效率的方式查找到事故点,为此要做到数据一体化和自动化。

-over-

参考资料:

StatsD plugin metrics explanation:http://cookbook.logstash.net/recipes/statsd-metrics/ 
Understanding StatsD and Graphite: http://blog.pkhamre.com/2012/07/24/understanding-statsd-and-graphite/

Measure Anything, Measure Everything:http://codeascraft.com/2011/02/15/measure-anything-measure-everything/

InfluxDB 开源分布式时序、事件和指标数据库

开源监控利器grafana-博客园

窝窝的解决方案介绍列表:

#研发解决方案#基于StatsD+Graphite的智能监控解决方案

#研发中间件介绍#定时任务调度与管理JobCenter

#研发解决方案介绍#Recsys-Evaluate(推荐评测)

#研发解决方案介绍#Tracing(鹰眼)

#研发解决方案介绍#基于持久化配置中心的业务降级

#研发中间件介绍#异步消息可靠推送Notify

#研发解决方案介绍#IdCenter(内部统一认证系统)

#研发解决方案介绍#基于ES的搜索+筛选+排序解决方案

#数据技术选型#即席查询Shib+Presto,集群任务调度HUE+Oozie

时间: 2024-10-12 08:36:29

#研发解决方案介绍#基于StatsD+Graphite的智能监控解决方案的相关文章

#研发解决方案介绍#基于ES的搜索+筛选+排序解决方案

郑昀 基于胡耀华和王超的设计文档 最后更新于2014/12/3 关键词:ElasticSearch.Lucene.solr.搜索.facet.高可用.可伸缩.mongodb.SearchHub.商品中心 本文档适用人员:研发和运维 提纲: 曾经的基于MongoDB的筛选+排序解决方案 MongoDB方案的缺陷 看中了搜索引擎的facet特性 看中了ES的简洁 看中了ES的天生分布式设计 窝窝的ES方案 ES的几次事故和教训 ES自身存在的问题 首先要感谢王超和胡耀华两位研发经理以严谨治学的研究精

#研发解决方案介绍#基于持久化配置中心的业务降级

郑昀 最后更新于2014/4/18 关键词:业务降级,配置中心,基本可用性, A.业务降级的背景知识: 淘宝就双十一课题曾经讲过: 『 所谓业务降级,就是牺牲非核心的业务功能,保证核心功能的稳定运行.简单来说,要实现优雅的业务降级,需要将功能实现拆分到相对独立的不同代码单元,分优先级进行隔离.在后台通过开关控制,降级部分非主流程的业务功能,减轻系统依赖和性能损耗,从而提升集群的整体吞吐率. 』 主动关闭系统功能的场景: 我们更新系统或数据库刷库时,可能会提出,某天凌晨几点到几点不能下单,几点到几

#研发中间件介绍#定时任务调度与管理JobCenter

郑昀 最后更新于2014/11/11 关键词:定时任务.调度.监控报警.Job.crontab.Java 本文档适用人员:研发员工 没有JobCenter时我们要面对的: 电商业务链条很长,业务逻辑也较为复杂,需要成百上千种定时任务.窝窝的大多数定时任务其实调用的是本地或远端 Java/PHP/Python Web Service.如果没有一个统一的调度和报警,在集群环境下,我们会: 不知道哪一个定时任务执行失败或超时,不见得能第一时间知道——直到最终用户投诉反馈过来: 要求每一个定时任务输出统

著名ERP厂商的SSO单点登录解决方案介绍一

      SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制.认证系统的主要功能是将用户的登录信息和用户信息库相比较,对用户进行登录认证:认证成功后,认证系统应该生成统一的认证标志(ticket),返还给用户.它是比较流行的企业业务整合的解决方案之一.       企业应用集成(EAI, Enterprise Application Integr

构建一个基本的前端自动化开发环境 —— 基于 Gulp 的前端集成解决方案(四)

通过前面几节的准备工作,对于 npm / node / gulp 应该已经有了基本的认识,本节主要介绍如何构建一个基本的前端自动化开发环境. 下面将逐步构建一个可以自动编译 sass 文件.压缩 javascript 文件.多终端多浏览器同步测试的开发环境,并且还可以通过 piblish 命令对项目下的文件进行打包操作. 相关连接导航 在windows下安装gulp —— 基于 Gulp 的前端集成解决方案(一) 执行 $Gulp 时发生了什么 —— 基于 Gulp 的前端集成解决方案(二) 常

#研发中间件介绍#NotifyServer

郑昀 基于朱传志的设计文档 最后更新于2014/11/11 关键词:异步消息.订阅者集群.可伸缩.Push模式.Pull模式 本文档适用人员:研发 电商系统为什么需要 NotifyServer? 如子柳所说,电商系统『需要两种中间件系统,一种是实时调用的中间件(淘宝的HSF,高性能服务框架).一种是异步消息通知的中间件(淘宝的Notify)』.那么用传统的 ActiveMQ/RabbitMQ 来实现 异步消息发布和订阅 不行吗? 2013年之前我们确实用的是 ActiveMQ,当然主要是订阅者

Hyper-V 2016 系列教程11 太仓民政局 微软 Hyper-V 虚拟化解决方案介绍 采用的是华为系列服务器

分享一个小型的Hyper-V 虚拟化解决方案介绍 采用的是华为系列服务器 软件清单简介: Windows Server 2012 客户可以利用Windows Server 2012 Hyper-V的虚拟化技术来降低成本以获利.传统的多个服务器角色可以整合到一台物理机器上的并行运行的不同操作系统的一组相互隔离的虚拟机上,并且能够利用X64架构的超强计算能力. 2. Microsoft System Center 2012 Microsoft System Center 2012是一套云计算和数据中

#研发中间件介绍#异步消息可靠推送Notify

郑昀 基于朱传志的设计文档 最后更新于2014/11/11 关键词: 异步消息 .订阅者集群.可伸缩.Push模式.Pull模式 本文档适用人员:研发 电商系统为什么需要 NotifyServer? 如子柳所说,电商系统『 需要两种中间件系统,一种是实时调用的中间件(淘宝的HSF,高性能服务框架).一种是异步消息通知的中间件(淘宝的Notify)』.那么用传统的 ActiveMQ/RabbitMQ 来实现 异步消息发布和订阅 不行吗? 2013年之前我们确实用的是 ActiveMQ,当然主要是订

文通产品及解决方案介绍

文通简介文通最早成立于1992年,技术源于清华大学,国内OCR技术的开创者,公司总部位于北京中关村核心区,在全国设有12个分支机构,燕郊拥有9000平米现代化工厂.文通已经为上百万家企业和单位提供了专业的OCR解决方案与服务.产品及解决方案1.软件类1.1:TH-OCR文档识别:支持识别纯英文.简繁体中文.日文.韩文.中英文混排的文本图像:支持识别藏文.维文.哈萨克文.阿拉伯文.柯尔克孜文1.2:表格票据识别:支持识别印刷数字.中文.字母.勾选框等:不同的票据可自定义模板识别.1.3:文字检测识