以下整理总结来自去哪儿网运维团队的工程师张悦于6月4日下午在创客168沙龙的分享:去哪儿网监控系统实践Watcher,希望能对大家了解监控系统有所帮助。
去哪儿网的运维团队基于开源项目 Graphite+Grafana+Nagios 二次开发了监控系统Watcher,用来支撑去哪儿百万级别的基础/业务监控指标。想不想知道去哪儿网Watcher的秘密?让我们跟随美女老师张悦的脚步,探索Watcher的设计、选型和架构,一窥去哪儿网监控的奥妙。
美女介绍
张悦,去哪儿运维开发工程师, 于2013年加入去哪儿。一直从事运维开发,参与开发Watcher监控系统,现负责监控相关的开发和运维工作。
我们为什么需要监控
监控的重要性众所周知,但监控的目的归纳起来主要就是四点。第一点是实时报警,比如服务器、交换机挂了,服务访问不了了,或流量骤增被攻击了等等,我们通过报警第一时间发现问题,并通知相关的人员去处理。第二点是提前预警,比如通过看一个服务的qps、响应时间等监控指标,如果访问量大增、响应时间变长,提前预警出来,就可以考虑加大并发或用其他方式进行优化。第三点是追查问题,用监控快速的定位追查问题是很重要的部分,并且在去哪儿网有很多应用场景。例如当收到一个报警发现酒店的有效报价量突然间暴跌时,这里假如有个逻辑是有效报价等于总报价减去空报价,那么就需要去看一下总报价量是否下跌或空报价量是否上升了,然后具体情况具体处理。因为有很多监控指标之间是具备包含关系的,一个总指标可能是许多子指标通过计算得出来的,所以出现问题我们就需要详实的数据来定位问题、追查问题。第四点是容量规划,比如MFS存储空间,从它的增长速率可以预估其使用情况,及时合理规划,安排扩容;还可以通过历史数据,看扩容前后和优化前后的效果对比。以上就是需要监控的四个原因。
Watcher监控系统的起源
初期去哪儿网也是使用大众监控工具cacti,cacti有丰富的第三方插件,当时也做到了监控覆盖率100%。但随着业务发展,日益增长的指标量,cacti在性能上、扩展性上以及用户的使用效率方面就有些无法支撑,归根结底是因为cacti存在一些问题。首先cacti一个致命问题是单点,如果出现问题,并且修复时间较长的话,那么相当于那一段时间监控系统是不可用的,这时出现故障系统就无法及时报警。再者,cacti无法横向扩展。一个机器的存储空间是一定的,当数据越来越大时不得不通过压缩数据换取空间,但这样会导致历史数据不准确。并且cacti的监控可视化比较差,对外也没有提供API接口,所以很难基于它做二次开发。因为它不支持横向扩展,所以它没有办法支撑所有的业务线,所以去哪儿网从2014年底着手做新的监控系统。
基于在使用cacti过程中遇到的一些问题,从应用的需求出发,设定了新的目标。新的监控系统一定要可靠、高可用、易扩容,而且一定要加强数据准确性和监控可视化。基于该需求,选型时主要考虑了以下几种:OpenTSDB、InfluxDB和Graphite。OpenTSDB是基于hbase做存储的,可以把所有的指标、所有的点存下来,但启动成本较高,不适合一个机房做一套;并且使用OpenTSDB需要Hadoop的运维经验,对于当时来说没有足够的掌控力觉得比较危险。至于当时的InfluxDB,远没有现在这么完备、活跃,模拟了监控数据后一个select *就搞挂了。后来经过豆瓣洪教授推荐和内部测试后最终选定Graphite。Graphite的优势在于它有强大的数据采集,友好的Render API,还支持丰富的函数获取图片或数据,存储上使用whisper文件,结构简单易运维,最重要的是它是分布式的,它的设计完全scale out,每一层都可以横向扩展。
最终,去哪儿网基于Graphite,及它周边比较活跃的可视化工具Grafana和 Nagios,进行二次开发后,形成了监控系统Watcher。Graphite的组件主要由carbon、whisper和graphite-api三部分组成。Carbon负责接收数据,用非常简单的文本协议,因为够简单,所以有很多现成的插件。Whisper是将收到的数据存储成whisper文件。 whisper文件类似于cacti的rrd文件,固定大小,容易运维。Graphite-api支持Restful URL获取图片或者数据,URL中还支持带各种有用的函数。
它们之间的关系如下图所示:
什么是Watcher监控系统
整个Watcher的数据走向如下图所示:
图中左侧部分是数据采集。Linux机器上部署collectd用来收集基础监控数据,windows机器上部署SSC Serv,这些都是graphite周边工具链,业务指标收集用去哪儿网开发的Qmonitor Server,也可以程序主动push数据,采集数据门槛较低,一条nc命令也是可以打监控数据的。中间就是整个watcher后端的集群,接收数据并存储。 然后就是数据展示以及报警,dashboard是数据展示部分,checker+nagios做报警,
上图代表了整个Watcher的集群,那单个的集群是什么样的架构呢?
如上图所示,第一层的carbon relay可以是多台的服务器做一个负载均衡,对外提供一个地址,功能是向下一层转发数据,这一层可以横向扩展。发给第二层relay通过一致性hash这样保证指标每次是打到同一台机器上,并设置把数据打两份,做一个数据冗余,这样一台机器挂了也不会影响服务,下面一层的carbon relay接收到数据后发给carbon cache,然后转成whisper文件写入磁盘, 第二层relay也是可以横向扩展的,如果存储不够加机器就可以了。另一端通过graphite-api取数据返回给用户。这就是一个典型的线上集群架构。
Watcher在去哪儿的应用
这里按照监控的分类来说。首先是系统级别的监控,像机器的load、CPU、网卡流量等指标通过装机自动部署agent,采集完数据上报给Watcher,展示在dashboard上支持多维度,定义了很多监控模板。报警可以根据机器的属性,比如机器名、类型、系统、机架等等这些去定制规则,然后自动匹配。系统级别监控和报警都是全自动的。
业务级别的监控报警,像接口的响应时间、调用次数、端口http、tcp监控或者业务逻辑相关的booking量、订单量等等, 大多数是通过qmonitor来采集数据,并在dashboard上自定义报警。 Qmonitor是通过程序引入qmonitor client包,然后在程序中埋点,把要监控的指标计数并输出成一个JSP,发布之后把机器和应用的关系配置在qmonitor Server上, 这样Server就可以按照应用一一去机器上拉取数据,汇总做一些计算或聚合再上报给Watcher。 以下是qmonitor工作的流程。总之Watcher支持push和pull两种方式去采集数据。
指标只要打进Watcher之后就可以直接展示了,通过指标名直接在指标tab中就可以查看,这和cacti的区别是不再需要繁琐的步骤做一些配置,只要代码写好,数据打过来时就可以显示,不过指标维度只能一个一个指标的看。如果想把核心的监控单独拎出来,或者把原始数据做一些渲染就可以放在自定义的dashboard上展示,这就实现了业务监控的数据展示。接下来的业务级别的报警自定义配置,可以把指标打进来之后再做,也可以通过API批量配置。Watcher除了提供其他主流报警系统能提供的功能外,还按照业务的需求提供了不同时间段设置不同的报警规则、通知方式多种、支持轮班、临时规则等功能。
除了系统级别和业务级别监控,还有MySQL、JVM和Memcached/Redis等中间件的监控,它们的收集方式是不同的,但最终都集成在dashboard上展示。Dashboard上提供了各种维度的方式展示数据。至于日志监控,去哪儿网运维的数据团队单独开发了日志的监控平台,主要做数据的收集、分析、检索、展示等工作。
小结
根据张悦美女的介绍,Watcher做到了最初的目标设定,高可用、可横向发展,dashboard多维度展示,且支持自定义,在可视化部分也足够灵活。现在Watcher的现状是基本涵盖所有的基础监控,有600万+的系统级别监控指标、200W+的业务逻辑监控指标,每分钟集群要支撑1500万指标上报。但Watcher也有美中不足的地方,下一步去哪儿网对于Watcher的关注点将在于如何快速扩容问题和提高人员的效率。