#研发解决方案介绍#基于StatsD+Graphite的智能监控解决方案-程序员宅基地

技术标签: python  php  数据库  

郑昀 基于李丹和刘奎的文档 创建于2014/12/5
关键词: 监控 、dashboard、PHP、graphite、statsd、whisper、carbon、grafana、influxdb、Python

本文档适用人员:研发和运维员工
提纲:
  1. 监控平台要做到什么程度?为什么要自己做?
  2. 几个通用技术问题
  • 绘图所依赖的数据如何收集?如何加工?如何存储?
  • 图形如何绘制,各种指标如何叠加?
  • 拓扑关系如何绘制?
技术选型哲学 最终选了statsd+graphite 数据的采集 数据存储的粒度 天机的技术选型

一,监控平台要做到什么程度?为什么要自己做?
  运维监控满满都是着各种开源系统以及它们的 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 能在一张图上展示某个主机的它定义好的几个指标,如下图所示:
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,如下图所示:
ebay云的监控报警
图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。

graphite图例

图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,自带管理工具
管理界面如下图所示:
influxdb图例
图5 influxdb图例
 

3.5.Grafana

 

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

  grafana 与 influxdb 整合后的效果如下图所示:
grafana+influxdb整合图例
图6 grafana+influxdb整合图例
 
四,最终选了statsd+graphite
  最终李丹和刘奎选择的方案是: statsd(采集) + graphite(绘制, whisper 负责存储)
  搭建了 Graphite 之后,你可以在它自带的管理站点上看到所有指标的历史数据,可以选时间范围,如下图所示:
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 图如下所示:
graphite high level
图9 graphite high level
  从上图看出,Carbon 接到度量数据后,写入 Whisper 库里,Graphite Webapp 去 Whisper 读取数据,系统应该也做了一份缓存,所以你发送数据给 Carbon,立即就可以在 Webapp 中绘图,这也是为什么在磁盘 I/O 反应不过来的时候,Webapp 的图形仍能以接近实时的方式显示的原因。
  下面两张图能帮助大家进一步理解 Graphite 里 Carbon 和 Whisper 如何协同的。

graphite 逻辑图

图10 graphite 逻辑图

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/
 

转载于:https://my.oschina.net/zhengyun/blog/372101

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chuanxinhu2060/article/details/100961969

智能推荐

在think-cell数据表中,“撤消” (Ctrl+Z) 操作无效,怎么解决?_表格的ctrl+z没反应是什么-程序员宅基地

文章浏览阅读270次。解决方案您随时可以撤消 PowerPoint 中的更改。关闭数据表以返回到 PowerPoint,然后单击快速访问工具栏上的撤消按钮(或按 Ctrl+Z )。幻灯片上的图表将还原为先前的状态,并相应撤消图表的数据表中的更改。说明think-cell 的数据表是 Excel 表格。您更改某些数据后,在 PowerPoint 幻灯片更新时会保存该数据表。遗憾的是,Excel 会在保存时放弃其撤消缓冲区。若直接使用 Excel,在保存工作簿后,也会出现该行为。..._表格的ctrl+z没反应是什么

Qt实现右键菜单的五种方法!(以QListWidget为例)_qt右键菜单-程序员宅基地

文章浏览阅读2.7w次,点赞36次,收藏150次。学习了Qt很久,下面总结了5种实现右键菜单的方法(以QListWidget为例): 下面5种方法选其一即可.当然越简单越好啦! 1.重写QListWidget的virtual void mousePressEvent(QMouseEvent *event);鼠标点击函数. 2.重写QListWidget的virtual void contextMenuEvent(QContextMenuEv..._qt右键菜单

Autonomous Driving System Engineer_autonomous driving csdn-程序员宅基地

文章浏览阅读395次。Location: ShanghaiNVIDIA is hiring System Engineers for its Autonomous Vehicle teams. As a member of our team you will be responsible for developing and maintaining software to drive the car, given _autonomous driving csdn

phpspreadsheet 中文文档(七)技巧和诀窍-程序员宅基地

文章浏览阅读625次。2019年10月11日14:08:35以下页面为您提供了一些使用广泛的PhpSpreadsheet食谱。请注意,这些文件没有提供有关特定PhpSpreadsheet API函数的完整文档,而只是一个起步。如果您需要特定的API函数,请参阅API文档。例如,设置工作表的页面方向和大小可将页面方向设置为A4。其他纸张格式(例如US Letter)不在本文档中讨论,而是在PhpSpreadshe..._getdefaultcolumndimension 换行

机器学习笔记3-拆分数据集和训练集_拆分并训练数据集,根据数据集所提供孩子的相关信息-程序员宅基地

文章浏览阅读3.1k次。拆分数据集和训练集from sklearn import cross_validation # for version 0.17# For version 0.18# from sklearn.model_selection import train_test_split### set the random_state to 0 and the test_size to 0.4 so_拆分并训练数据集,根据数据集所提供孩子的相关信息

matlab | BSDS500/BSDS300分割数据集的下载以及简单处理-程序员宅基地

文章浏览阅读7.7k次,点赞11次,收藏27次。转自:https://blog.csdn.net/u014722627/article/details/60140789这两个是berkely (伯克利大学)computer vision group提供的数据集,用来做segmentation(图像分割)或contour detection(轮廓检测)的,还有人拿这个做super resolution(超分重建)的BSDS500:数据库包含200..._bsds500

随便推点

设计考勤打卡的心得体会_125k 打卡-程序员宅基地

文章浏览阅读3.8k次。    在今年8-10份,独自一个人担任促销管理系统的考勤系统的开发。从需求理解、到表设计、到API接口的输出,bug的修复到最后的完工。今天停下脚步总结一下。在整个过程中,给我最深刻的时最开始的表设计。考勤打卡每个企业个性化比较强,我的这个项目是促销人员使用的考勤打卡系统,模式:班次–排版-考勤。 每个人各不相同,不具备使用考勤组的。一个促销人员一天..._125k 打卡

IE10和IE9兼容性常见问题解答(FAQ)_compatibility view settings在哪里-程序员宅基地

文章浏览阅读1.8k次。本文档介绍了诊断和解决与IE10和IE9的文档兼容性有关的具体问题的一系列过程。1. 我们在本文档中提到“ IE10和IE9”时有什么意义?以前版本的IE都不是符合标准的。从IE9发布起,微软开始遵守HTML5 (工作草案)、W3C 层级样式表第3级规范(工作草案)、Scalable Vector Graphics (SVG) 1.0规范以及其他标准。“IE10和IE9”这个术语指_compatibility view settings在哪里

2023年全国职业院校技能大赛-信息安全管理与评估-赛题 1_计算机全国职业院校技能大赛-程序员宅基地

文章浏览阅读1.1k次,点赞23次,收藏23次。竞赛有固定的开始和结束时间,参赛队伍必须决定如何有效的分配时间。请认真阅读以下指引!(1)当竞赛结束,离开时请不要关机;(2)所有配置应当在重启后有效;(3)请不要修改实体机的配置和虚拟机本身的硬件设置。_计算机全国职业院校技能大赛

Android进阶 View事件体系(三):典型的滑动冲突情况和解决策略_android 滑动冲突-程序员宅基地

文章浏览阅读3k次,点赞2次,收藏15次。本篇文章为总结View事件体系的第三篇文章,前两篇文章的在这里:* [Android进阶 View事件体系(一):概要介绍和实现View的滑动](https://blog.csdn.net/Tai_Monster/article/details/130830213?spm=1001.2014.3001.5501)* [Android进阶 View事件体系(二):从源码解析View的事件分发](https://blog.csdn.net/Tai_Monster/article/details/130871_android 滑动冲突

think php静态路由,实验一、静态路由实验-程序员宅基地

文章浏览阅读54次。实验一、静态路由实验实验要求:1、掌握路由器的基本配置,几种工作模式的进入退出方法。2、掌握静态路由的作用和配置方法。3、掌握浮动路由的配置方法。4、掌握配置静态负载均衡的方法。实验拓扑:根据实验要求,实验拓扑如图1-1所示。 图1-1静态路由实验拓扑实验步骤:1、根据实验拓扑对路由器R1、R2和R3配置接口IP地址。Router(config)#hostname R1R1(config)#in..._问题6:配置后在r3上查看路由表,和原来有什么不同?

RAID详解-程序员宅基地

文章浏览阅读62次。RAID的由来 磁盘阵列简称RAID(Redundant Arrays of Inexpensive Disks,RAID),有“价格便宜且多余的磁盘阵列”之意。其原理是利用数组方式来作磁盘组,配合数据分散排列的设计,提升数据的安全性。磁盘阵列主要针对硬盘,在容量及速度上,无法跟上CPU及内存的发展,提出改善方法。磁盘阵列是由很多便宜、容量较小..._连续地分割数据并并行地

推荐文章

热门文章

相关标签