-->

左耳听风_025_24_分布式系统关键技术全栈监控

你好,我是陈浩网名做耳朵house子。

对于布布式系统来说呢,首先我们需要的是全栈系统监控。

它呢就像是我们的眼睛,没有它呀,我们就不知道系统到底发生了什么。

我们呢就没有办法管理或者运维整个分布式系统,所以呢这个系统啊是非常非常关键的。

而在分布式或者clounative的情况下呢,系统啊会分成多层服务,各种关联需要监控的东西啊特别多。

如果没有一个好的监控系统啊,我们就无法进行自动化运维和资源调度。

那这个监控系统啊需要完成的功能,包括全站监控、关联分析、跨系统调用的串联、实时报警和自动处置。

还有呢系统性能分析。

那所谓全站监控呢,其实就是三层监控。

那第一层呢是基础层监控主机和底层资源,比如CPU内存、网络吞吐、硬盘IO,还有硬盘使用等等。

那第三层呢是中间层啊,就是中间件层的监控,比如enginx、 REDISSTMQ、返夫卡、mysql,还有tomcat啊等等。

那第三层呢是应用层调来监控,应用层的使用,比如HTB访问的吞吐量,想用时间返回码调用链路分析性能瓶颈,还包括用户端的监控。

我在文中呢把这三层监控和它其中的技术内容啊画了一张图,那你可以打开看一看。

当然啊这里还需要一些监控的标准化。

这个标准化呢包括日志数据的结构化监控,数据格式的标准化,统一的监控平台,还有呢统一的日志分析。

那怎样才能算是一个好的监控系统呢?那这里呢我要多说一句,现在我们的很多监控系统啊都做的很不好。

他们呢主要有两个很大的问题。

那第一个问题呢在于监控数据啊是隔离开来的。

因为公司分工的问题啊,因为应用运维系统运维各管各的,所以很多公司的监控系统之间啊都有一道墙,完全串不起来。

那第二呢就是监控的数据项太多了。

有些公司的运维团队啊,甚至把监控数据项多作为一个亮点,到处讲,因如监控指标达到五万多个。

老实说啊,这太丢人了。

因为信息太多啊,等于没有信息,还不到重点的监控啊,才会做成这个样子,完全啊就是史蛮力的做法。

我认为呢一个好的监控系统啊应该有这么几个特征。

第一呢是关注整体应用的SLA,主要是从为用户服务的API来监控整个系统。

那第二点呢在于关联指标的聚合,把有关联的系统和它的指标聚合展示。

那主要呢是这三层系统的数据,包括基础层平台、中间件层和应用层。

那其中最重要的是把服务相关的中间件和主机关联在一起。

那服务呢有可能运行在docker中,也有可能运行在微服务平台上的多个JVM中,也有可能啊运行在tom cat中。

总之呢,无论运行在哪里,我们都需要把服务的具体实力和主机关联在一起。

否则对于一个分布式系统来说啊,定位问题啊就好像大海捞针一样。

那第三点呢在于故障的快速定位。

总之于现有的系统来说呢,故障总是会发生的,而且呢还会频繁发生。

故障发生啊不可怕,可怕的是故障的恢复时间过长。

所以呢快速的定位故障就相当的关键。

那快速定位问题啊,需要对整个分布式系统做一个用户请求跟踪的trace监控。

我们啊需要监控到所有的请求在分布式系统中的调用链。

那这个事儿呢最好是做成没有侵入性的那换句话说,一个好的监控系统啊,主要是为体检和急诊两个场景所设计的。

所谓体检呢,首先在于容量管理,提供一个全局的系统运行时的数据的展示,可以让工程师团队啊知道是否需要增加机器啊或者其他的资源。

那其次呢是性能管理,可以通过查看大盘找到系统的瓶颈,并用针对性的优化系统和相应的代码。

而所谓的急诊场景呢,首先在于定位问题啊,可以快速的暴露,并且找到问题的发生点,帮助技术人员啊诊断问题。

那其次呢是性能分析,当出现非预期的流量提升的时候,可以快速的找到系统的瓶颈,并且啊帮助开发人员深入代统。

那只有做到了这些关键点啊,才算是一个好的监控系统。

那我们应该怎么做出一个好的监控系统呢?啊,我认为啊一个好的监控系统啊,应该实现的功能啊有这几个。

那第一个功能呢是服务调用量的跟踪。

那这个监控系统啊应该从对外的API开始,然后呢将后台的实际服务啊给关联起来,然后再进一步将这个服务的依赖服务关联起来啊,直到最后一个服务。

那这样呢就可以把整个系统的服务啊全部都串联起来了。

那这个事情的最佳时间呢是google的demo系统啊,它对应的开源实现是是ip in.那对于java类的服务啊,我们可以使用字节码的技术进行字节码注入,啊,做到代码无侵入。

我在文中呢放了一张我做的一个APM的监控系统的截图啊,你可以看一看。

那第二个功能呢是服务调用时长的分布。

那使用zip in呢可以看到一个服务调用链上的时间分布。

那这样呢有助于我们知道最耗时的服务是什么。

那文中这里呢有一张zip的服务调调时时间,布布图供参参考。

第三三功功呢是服务的top n视图。

所谓top n视图呢,就是一个系统的请求的排名情况。

那一般来说呢,这个排名啊会有三种排名的方法,一是按调用量排名,二呢是按请求最耗时排名。

三是按热点排名,也就是在一个时间段内的请求次数的响应时间和。

那第四个功能呢是数据库操作观点。

那对于java应用呢,我们可以很方便的通过java agent字节码注入技术,拿到JBDC执行数据库操作的执行时间。

那对此呢我们可以和相关的请求啊对应起来。

那第五个功能呢是服务的资源跟踪,我们的服务啊,可能运行在物理机上,也可能运行在虚拟机里,还有可能啊运行在一个docker容器里面。

Docker容器啊就可能运行在物理机或者虚拟机上。

所以我们啊就需要把服务运行的机器节点上的数据啊关联起来。

那这样一来呢,我们就可以知道服务和基础层资源的关系了。

那如果是java应用呢,我们还要和JVM里的东西啊进行关联。

那这样呢我们才能知道服务所运行的JVM中的情况。

有了这些数据上的关联之后呢,我们啊就可以达到这样几个目标了。

那第一呢是当一台机器挂掉的原因是CPU或者IO过高的时候,我们马上就可以知道它会影响到哪些对外服务的API.那第二呢,是当一个服务响应过慢的时候,我们马上就能关联出来。

是否在做java GC,或者呢是它所在的计算节点上是否有资源不足的情况啊,或者依赖的服务啊是否出现了问题。

第三呢是当我们发现一个sql操作过慢的时候,我们啊马上就能知道它会影响哪个对外服务的API.那另外呢就是当我们发现一个消息队列拥塞的时候,我们也能很快的知道啊,它会影响哪些对外服务的API.总之呢我们就是想知道用户访问哪些请求啊会出现问题。

那这个呢对于我们了解故障的影响面啊非常有帮助。

那一旦了解了这些信息啊,我们就可以做出调度。

比如一旦发现某个服务,过慢是因为CPU使用过多了,而我们就可以做弹性伸缩。

或者呢一旦发现某个服务过慢,是因为mysql出现了一个慢查询,我们呢就无法在应用层上做弹性伸缩啊,只能做流量限制或者降级操作了。

所以呢一个分布式系统或者是一个自动化运维系统,又或者是一个cloud native云化系统。

最重要的是啊就是把监控系统做好,再把数据收集好的,同时呢更重要的是把数据关联好。

那这样呢我们才能很快的定位故障,进而才能进行自动化调度。

那文中这里呢有一张图,简单展示了一个分布式系统的服务调用链上都在报错。

那问题的根本原因啊是数据库链接过多了啊,服务不过来。

那另外一个原因呢,就是java在做复制c导致处理过慢了。

于是呢消息队列就出现了消息堆积堵塞。

那这个图呢只是一个示例,它形象的体现了在分布式系统中监控数据关联的重要性。

那这节课呢到这里就结束了,我们来回顾一下今天的要点内容。

首先呢我强调了全站系统监控的重要性,那它呢就像是我们的眼睛,没有它,我们就根本不知道系统到底发生了什么。

那随后呢我从基础层、中间层和应用层三个层面讲述了全站监控系统要监控哪些内容。

然后呢,我阐释了什么才是一个好的监控系统。

还有呢就是怎么做出一个好的监控。

最后呢欢迎你也来分享一下你在监控系统中的比较好的实践和方法。

那下节课呢我将讲一讲分布式系统的另外一个关键技术啊,也就是服务调度。

我在文末呢也列出了分布式系统架构本质的系列文章的目录,方便你啊快速找到自己感兴趣的内容。