主要分系统监控和业务监控两类

系统监控就是每台主机的CPU,内存网络带宽等使用情况以及Mysql, Redis, Nginx等服务的核心指标等这是比较基本的监控必须得有如果这块监控做的好生产环境可以提前发现很多问题防患于未然。

业务监控就是业务相关的指标如某API每秒调用次数每分钟该API的平均响应时间服务的在线人数甚至一些运营相关的数据如七日留存率啦每日新增用户每日流失用户等。这些数据也很重要他是你整个业务的晴雨表为你做一些重要决策提供依据。

对于系统监控有很多开源软件可以拿来用如比较出名的nagios,cacti,zabbix等部署都比较复杂客户端要部agent还得装一个center用来收集存储展现数据还有好多插件需要维护。通过队列把信息发送给主服务,如果是同机房当然还是写nagios的插件会比较好,这样是统一管理,而只需要写插件如果是机房是分布的,可以考虑nagios之间的消息传递写一些脚本完成,自己写的话是时间问题和管理上不统一的麻烦。但有一个比较简单的东西是collectd它自带了各种插件如系统CPU磁盘利用率mysql,nginx,redix等常用服务都可以进行监控而且自动给你推荐了要监控哪些指标。安装很方便基本上./configuration && make && make install就可以了。

对于业务监控肯定是需要自己写代码上报业务数据的现在比较流行的方案是statsd+graphite比较轻量级而且有很多语言的sdk可以很轻松把各种指标监控起来。

监控的选择 一般要看你的服务器分布:
如果是分布式的机房, 机房很多, 那么对集中监控和处理要求比较高, ganglia本身就有分布式特性, 是第一选择; nagios需要再做些插件的优化和结构调整才能更好的支持分布式的需求. 因为分布式面临的问题是集中管理和可靠性, 可靠性: 网络传输可能出现的问题都要避免监控才能让监控准确; 集中管理: 才可以减少工作量
如果是集中的, 在量很大的情况下还是建议使用ganglia, 如果小其它的很多监控都可以选择, 报警监控还是用nagios, 好像很少有他这样灵活的工具, 但一定要将配置改成最适合自己环境的, 并且最简单和快速的配置 需要自己制定一些规则会比较好。


大多监控体系都差不多如下

  1. 每台机器上安装一个agent用来采集本机的性能数据服务数据

  2. 每台机器部署的业务根据一个sdk向center提交本业务相关的数据

  3. 每个agent可以动态的按需求加载一些插件以便监控新的指标

  4. 一般一个机房内有一个center用来收集各agent和各业务上报的指标

  5. center要把采集到的指标数据进行存储归档压缩一般用rrd database

  6. center还得有一个web界面来查看各个指标的历史图表甚至要有各种视图和dashborad来显示一组相关的指标。

  7. center还要每天把用户自定义的几个关键的指标生产报表发给运维或者相关人员。

  8. center还需要保存各种告警规则如某个指标连续几次超过某个阈值产生告警或者波动超过某个范围产生告警或者某个指标超过多长时间没有上报数据产生告警

  9. center还要进行各种告警的收敛如同类告警的合并临时屏蔽某类告警防止因为网络抖动引起大量告警等没有这些运维人员会淹没在各种告警声中。

  10. center要以各种方式将告警发送给运维人员如短信邮件微信语音等。

  11. center还要对每次告警进行回顾统计分析得出每个系统的薄弱点可用率在线时间稳定性等。

所以说自己搭建一套完善可靠的监控体系挺不容易的需要投入大量的人力和精力去开发和维护。

现在国外也有一些专门做运维外包的厂商center托管在给他们免去了很大的工作量剩下的agent和plugin还是得自己安装但这就简单了反正有很多可以做批量部署的运维工具。

比较出名的有NewRelic,StatHat,hostedgraphite可以去了解一下基本上就是安装个agent就可以向它们的center上报数据了或者是利用他们的Sdk提交一些自定义数据他们负责存储展现告警方面的事情节省很多人力。

国内的话也有人做类似的事情如DNSPod的D监控最近推出了自定义监控的功能兼容graphite的上报接口你自己部署个collectd就可以把各种系统监控指标监控起来了如果要做业务监控graphite也有各种语言的sdk。graphite本身开源周边工具和软件也特别多能满足很多的需求。

服务器数量不太大时,比如小于200台,建议试试Nagios Nagios监控系统的CPU、内存、硬盘等各个基本面都很方便。监控自己的服务也很容易,组合些插件、写点简单的脚本啥的就能做到。

如果服务器数量很多,超过1000台。高效采集这些信息就是个复杂的事情,想想每秒钟要有多少数据往你的监控服务器传送就有点头疼了。这就需要自己精心设计下拓扑结构、写不少代码。当然,也能利用已有的开源框架做到这些信息采集。