1 没有监控怎么样?

        将无法进行自动化运维和资源调度;

        全栈系统监控,它就像是我们的眼睛,没有它,我们就不知道系统到底发生了什么,我们会无法管理或是运维整个分布式系统。

2 监控系统完成的功能

  • 全栈监控;
  • 关联分析;
  • 跨系统调用的串联;
  • 实时报警和自动处置;
  • 系统性能分析;

3 全栈监控(三层监控)

  1. 基础层:监控主机和底层资源。比如:CPU、内存、网络吞吐、硬盘 I/O、硬盘使用等。
  2. 中间层:就是中间件层的监控。比如:Nginx、Redis、ActiveMQ、Kafka、MySQL、Tomcat 等。
  3. 应用层:监控应用层的使用。比如:HTTP 访问的吞吐量、响应时间、返回码、调用链路分析、性能瓶颈,还包括用户端的监控。

4 监控的标准化

  1. 日志数据结构化;
  2. 监控数据格式标准化;
  3. 统一的监控平台;
  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  什么才是好的监控系统,以及如何做出好的监控。