1 没有监控怎么样?
将无法进行自动化运维和资源调度;
全栈系统监控,它就像是我们的眼睛,没有它,我们就不知道系统到底发生了什么,我们会无法管理或是运维整个分布式系统。
2 监控系统完成的功能
- 全栈监控;
- 关联分析;
- 跨系统调用的串联;
- 实时报警和自动处置;
- 系统性能分析;
3 全栈监控(三层监控)
- 基础层:监控主机和底层资源。比如:CPU、内存、网络吞吐、硬盘 I/O、硬盘使用等。
- 中间层:就是中间件层的监控。比如:Nginx、Redis、ActiveMQ、Kafka、MySQL、Tomcat 等。
- 应用层:监控应用层的使用。比如:HTTP 访问的吞吐量、响应时间、返回码、调用链路分析、性能瓶颈,还包括用户端的监控。
4 监控的标准化
- 日志数据结构化;
- 监控数据格式标准化;
- 统一的监控平台;
- 统一的日志分析;
5 什么才是好的监控系统?
5.1 现有监控做不好的原因:
监控数据是隔离开来的:分工问题导致,开发、应用运维、系统运维,各管各的-->监控系统之间都有一道墙,完全串不起来;
监控的数据项太多:指标太多导致没有重点监控,蛮力干;
5.2 好的监控系统有什么特征?
5.2.1 关注于整体应用的 SLA。主要从为用户服务的 API 来监控整个系统;可以使用接口的可用性几个9来表示,5个9表示全年8次的失败;
5.2.2 关联指标聚合。指标数据发生地比如podId、IP信息等;
5.2.3 快速定位故障。故障不可怕,可怕的是恢复时间时长。快速定位问题需要对整个分布式系统做一个用户请求跟踪的 trace 监控,我们需要监控到所有的请求在分布式系统中的调用链,这个事最好是做成没有侵入性的。比如skywalking的traceId;
5.3 好的监控系统
5.3.1 容量管理。提供一个全局的系统运行时数据展示,让工程师团队知道是否需要增加机器或者系统资源。--体检
5.3.2 性能管理。 通过系统大盘,找到系统瓶颈,并有针对性的优化系统和相应代码。--体检
5.3.3 定位问题。找到问题发生点,比如定位到代码行或者资源瓶颈口。--急诊
5.3.4 性能分析。非预期的流量提升时,定位系统瓶颈。--急诊
5.4 how?
服务调用链跟踪。把整个系统的服务全部都串连起来了。这个事情的最佳实践是 Google Dapper 系统,其对应于开源的实现是 Zipkin。对于 Java 类的服务,我们可以使用字节码技术进行字节码注入,做到代码无侵入式。 开源:skywalking
服务调用时长分布。使用 Zipkin,可以看到一个服务调用链上的时间分布,这样有助于我们知道最耗时的服务是什么。
服务的 TOP N 视图。a)按调用量排名,b) 按请求最耗时排名,c)按热点排名(一个时间段内的请求次数的响应时间和)
数据库操作关联。对于 Java 应用,我们可以很方便地通过 JavaAgent 字节码注入技术拿到 JDBC 执行数据库操作的执行时间。
服务资源跟踪。服务可能运行在物理机上,也可能运行在虚拟机里,还可能运行在一个 Docker 的容器里,Docker 容器又运行在物理机或是虚拟机上。我们需要把服务运行的机器节点上的数据(如 CPU、MEM、I/O、DISK、NETWORK)关联起来。
5.5 知道用户访问哪些请求会出现问题,这对于我们了解故障的影响面非常有帮助。
5.5.1 一旦发现某个服务过慢是因为 CPU 使用过多,我们就可以做弹性伸缩。
MySQL 出现了一个慢查询,我们就无法在应用层上做弹性伸缩,只能做流量限制,或是降级操作了。
6 问题定位实践
上图简单地展示了一个分布式系统的服务调用链接上都在报错,其根本原因是数据库链接过多,服务不过来。另外一个原因是,Java 在做 Full GC 导致处理过慢。于是,消息队列出现消息堆积堵塞。形象地体现了在分布式系统中监控数据关联的重要性。
7 小结
7.1 我强调了全栈系统监控的重要性,它就像是我们的眼睛,没有它,我们根本就不知道系统到底发生了什么
7.2 基础层、中间层和应用层,各自需要监控的内容。
7.3 什么才是好的监控系统,以及如何做出好的监控。