对于分布式系统来说,出现故障的是常有的事情,如何在短时间内找到故障的原因,排除故障是非常重要的,而监控系统是就像系统的眼睛可以通过分析相关数据,进一步管理和运维整个分布式系统。
监控系统的的基本功能包含
- 全栈监控
- 关联分析
- 跨系统调用的串联
- 实时报警和自动处置
- 系统性能分析
多层体系的监控
全栈监控其实就是三层监控
- 基础层:监控主机和底层资源,比如CPU、内存、网络吞吐、磁盘I/O、硬盘使用等。
- 中间层:中间件层的监控,网关层Nginx、缓存Redis、消息队列RabbitMQ、Kafka、数据层MySQL、Tomcat,Es等。
- 应用层:监控应用层的使用,HTTP访问量,响应时间,返回码,调用链路分析,性能瓶颈,用户短监控,异常状态监控,异常指标数据监控等。
什么是好的监控系统
监控的指标化
- 日志数据结构化
- 监控数据格式标准化
- 统一的监控平台
- 统一的日志分析
如何作出好的监控
大多数系统监控做的并不到位,主要包含以下几点。
- 1.监控数据是隔离开的,因为分工原因,开发、应用运维、各管各的,所以很多公司的监控系统是隔离的,比如基础层监控报警,运维只能发到大群里@相关业务人员查看。开发人员依赖的中间件系统出现问题,只能运维人员查看。
- 2.监控的数据项太多,没有重点,指标太多等于没有重点没有信息。需要监控关键数据。
好的监控系统应该具备以下特征。
- 关注整体应用的SLA,主要为用户服务的API监控整个系统。
- 关联指标聚合,将基础层、中间层、应用层数据监控关联起来,和具体的机器绑定在一起。
- 快速故障定位,出现故障不可怕,可怕的是不能快速定位故障,找到根本原因。导致故障恢复的时间过长,从而因为用户的稳定性。所以需要为分布式系统做一个用户请求跟踪的trace监控,整体的调用链路。
一个很好的说法就是,定时的体检,监控系统是否有问题,另一个就是出现问题进行急诊。
体检
容量管理,提供一个全局的系统运行时数据的展示,工程师可以知道是否需要增加机器或者其他资源。
性能管理,可以查看大盘,找到系统瓶颈,并针对性的优化系统和相应代码。
急诊
定位问题,可以快速找到问题的根本原因。快速修复。
性能分析,出现高并发流量时,可以快速排除问题。
如何做出一个好的监控系统
服务调用链跟踪
从用户请求的地方开始,通过调用链,将经过的网关、服务、相关数据中间件等服务进行串联起来,一旦出现问题,就可以快速定位问题在什么地方。
推荐使用Zipkin。java服务可以通过字节码注入方式做到无侵入式。
服务调用时长分布
当出现相应慢或者超时的时候,可以通过调用时长,定位出现问题的地方。
服务的Top N试图
通过邮件或者其他方式,发送每日的接口Top 10的接口。访问次数、耗时接口、热点排名等
数据库操作关联
记录相关数据库操作,可以通过字节码技术进行记录SQL操作的执行时间。
服务资源跟踪
我们的服务可能运行在物理机上,也可能运行在虚拟机里,还可能运行在一个 Docker 的容器里,Docker 容器又运行在物理机或是虚拟机上。我们需要把服务运行的机器节点上的数据(如 CPU、MEM、I/O、DISK、NETWORK)关联起来。
通过上述的方式,就可以将基础监控和业务联系起来,。
1.当一台机器挂掉是因为CPU或IO过高的时候,就可以马上知道影响到哪些对外服务的API。
2.当一个服务相应过慢的时候,可以通过关联JVM GC或者资源等 或者依赖服务定位问题。
3.SQL操作过慢的时候,可以定位影响的是哪个对外服务的API
4.消息队列拥塞的时候,可以马上知道对外影响服务的API。
工作中实际经验
对于接触的公司来说,基本都会进行基础层、应用层、中间层的系统监控。但是并没有将数据进行整合在一起。
当出现问题时,基本的手段就是。
1.当天是否有上线新功能,排除是否是新功能引发的BUG问题。
2.进行搜索 ERROR日志,是否存在大量异常。
3.数据库、中间件层是否出现问题。 数据库是否连接失败,网络操作。JVM相关。
4.系统的CPU、内存、磁盘、网络是否有问题,使用TOP、free -h等查看。
5.是否出现瞬间的高流量导致服务扛不住压力崩溃。
6.系统存在的BUG 导致的系统故障。
7.依赖下游系统出现故障,三方服务不正常等。
如果是逻辑问题,看测试环境能否复原出生产现象,从而进一步排除。
总体来说就是出现故障不可怕,即时解决,减少故障的恢复时间 最重要。