分布式系统的关键技术:全栈监控

1、全栈系统监控的重要性

  • 全栈系统监控就像分布式系统的眼睛,没有它我们就不知道系统到底放生了什么,将无法管理或是运维整个分布式系统;
  • 在云原生以及微服务的业务系统下,系统分成多层,服务各种关联,需要监控的东西特别多,没有一个好的监控我们将无法进行自动化运维和资源调度;
  • 需要监控提供的能力包括:全栈监控、关联分析、跨系统调用的串联、实时报警和自动处置、系统性能分析。

 

2、基础层、中间层和应用层的监控内容

所谓全栈监控就是所谓的三层监控,包括:基础层、中间层和应用层监控。

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

 

对于监控的数据还需要一些监控的标准化:

  • 日志数据结构化;
  • 监控数据格式标准化;
  • 统一的监控平台;
  • 统一的日志分析。

 

3、什么才是好的监控系统

1)当前监控系统通常的问题:

  • 监控数据是隔离开来:公司各个部门之间的监控数据,完全串不起来;
  • 监控数据项太多:因为信息太多等于没信息,抓不住重点,完全使蛮力。

2)一个好的监控系统应该具备的关键特征:

  • 关注整体应用的SLA:主要从为用户服务的API来监控整个系统;
  • 关联指标聚合:把有关联的系统及其指标聚合展示。通过三层系统的层级把服务具体的实例和主机等资源关联在一起,便于快速定位问题;
  • 快速故障定位:故障不可怕,可怕的是故障恢复的时间过长。在这个过程中快速定位问题就变得特别的重要了。快速定位问题需要对整个分布式系统做一个用户请求跟踪的 trace 监控,我们需要监控到所有请求在分布式系统中的调用链,并且最好做成无侵入性的。

3)一个好的监控系统应该关注的场景
1>.“体检”

  • 容量管理:提供一个全局系统运行时数据展示,可以让工程师团队知道是否需要增加机器或者其他资源;
  • 性能管理:通过监控大盘可以找到系统瓶颈,并有针对性的优化系统和相应的代码。

2>.“急诊”

  • 定位问题:可以快速地暴露并找到问题的发生点,帮助技术人员诊断问题;
  • 性能分析:当出现非预期的流量提升时,可以快速地找到系统的瓶颈,并帮助开发人员深入代码。

 

4、如何做出好的监控

好的监控应该具备的能力:

  • 服务调用链跟踪:监控系统应该从对外的API开始,然后将后台的实际服务给关联起来,然后再进一步将这个服务的依赖服务关联起来,直到最后一个服务(如:MySQL或Redis),这样就可以把整个系统的服务全部串联起来了;
  • 服务调用时长分布:通过查看调用链上的时间分布,从而可以知道最耗时的服务是什么;
  • 服务的 TOP N 视图:指的是一个系统请求的排名情况,如:按调用量排名;按请求最耗时排名;按热点排名(一段时间内的请求次数的响应时间和)
  • 数据库操作关联:对于 Java 应用,我们可以很方便地通过 JavaAgent 字节码注入技术拿到 JDBC 执行数据库操作的执行时间。对此,我们可以和相关的请求对应起来。
  • 服务资源跟踪:把服务运行的机器节点上的数据(如:CPU、MEM、I/O、DISK、NETWORK)关联起来

这样一来,我们就可以知道服务和基础层资源的关系。如果是 Java 应用,我们还要和 JVM 里的东西进行关联,这样我们才能知道服务所运行的 JVM 中的情况(比如 GC 的情况)。

有了这些数据上的关联,我们就可以达到如下的目标:

  • 当一台机器挂掉是因为 CPU 或 I/O 过高的时候,我们马上可以知道其会影响到哪些对外服务的 API。
  • 当一个服务响应过慢的时候,我们马上能关联出来是否在做 Java GC,或是其所在的计算结点上是否有资源不足的情况,或是依赖的服务是否出现了问题。
  • 当发现一个 SQL 操作过慢的时候,我们能马上知道其会影响哪个对外服务的 API。
  • 当发现一个消息队列拥塞的时候,我们能马上知道其会影响哪些对外服务的 API。

 

5、思考

 

 

6、参考资料

1、《分布式系统的关键技术:全栈监控》;

posted @ 2023-05-18 13:26  hlc-123  阅读(132)  评论(0编辑  收藏  举报