首页 > 编程知识 正文

鹰眼识别系统,阿里鹰眼监控

时间:2023-05-04 21:58:45 阅读:225143 作者:3483

业务背景

上图是 2012 年淘宝核心业务应用关系的拓扑图,还不包含了其他的非核心业务应用,所谓的核心业务就是和交易相关的,和钱相关的业务。这张图大家可能看不清楚,看不清楚才是正常的,因为当时的阿里应用数量之多、应用间关系之混乱靠人工确实已经无法理清楚了。

基于微服务体系之下构建的业务系统存在的问题基本上分为四类:

第一个是故障定位难,今天我们淘宝下单的动作,用户在页面上点购买按钮,这么一个简单操作,其实它背后是由十几个甚至数十个的微服务去共同完成的,这十几个甚至几十个微服务也由不同的团队去负责,这是微服务的过度协同带来的结果,一旦出现问题,最坏情况下我们也许就要拉上十几个团队一起来看问题。

第二个问题是容量预估难,阿里每年要做若干次大促活动,在以前的巨石系统当中做容量预估是非常容易的,因为我们大促时候按照预估的流量与当前系统的单机压测容量做一个对比,把所有的系统按比例去扩容就可以了。而实际上在大促的场景下,每一个系统在核心链路当中的参与度、重要性都是不一样的,我们并不能对每一个系统做等比例的扩容,所以微服务架构下的容量预估也是一件难事。

第三个问题就是资源浪费多,资源浪费多首先是容量预估不准的一个后果,同时资源浪费多背后隐含的另一个问题就是性能优化难,为什么这么说呢?我们当打开一个页面发现它慢的时候,我根本不知道这个页面慢在哪里,瓶颈在哪里,怎么去优化,这些问题累积下来,资源的浪费也成为了一个巨大的问题。

第四个是链路梳理难,我们一个新人加入阿里的时候,老板让他负责一个系统,他在这个复杂的微服务体系中,就像人第一次在没有地图没有导航的情况下来到一个大城市一样,根本不知道自己身在何处。应用负责人不知道自己的系统被谁依赖了,也不知道自己的系统下游会影响其他哪些人。

伶俐的柠檬是什么

伶俐的柠檬就是主要的目的就是解决上面所说的这四个问题,我们首先来定义一下伶俐的柠檬这个系统,它是一个以链路追踪技术为核心的监控系统,它主要的手段是通过收集、存储、分析、分布式系统中的调用事件数据,协助开发运营人员进行故障诊断、容量预估、性能瓶颈定位以及调用链路梳理。它的灵感是来自于 Google 的 Dapper。

整体技术架构

技术原理

在阿里巴巴每天有超过一万亿次的分布式调用,这个数据其实也是很早之前统计的,如果在这一万亿次调用当中出现了一个问题,我们怎么去定位?看一下这个例子,系统 A 调用 B,B 调用 C,在这之后 A 又调用了 D,如果 B 调 C 出了问题的话,那么负责维护 A 系统的开发人员根本不知道问题到底出在哪里,他只知道这次调用失败了,那么我们怎么样解决这个问题?虽然现在的很多大公司都在重复造很多轮子,但还好在阿里巴巴中间件这个东西没有被重复造出两个,基础设施还是相对比较统一的。所以我们可以在一套中间件里做统一埋点,在分布式调用框架、分布式消息系统、缓存系统、统一接入层、Web 框架层的发送与接收请求的地方做统一埋点,埋点的数据能够被一套中间件在系统之间进行无缝透传。

当用户的请求进来的时候,我们在第一个接收到这个请求的服务器的中间件会生成唯一的 TraceID,这个 TraceID 会随着每一次分布式调用透传到下游的系统当中,所有透传的事件会存储在 RPC log 文件当中,随后我们会有一个中心化的处理集群把所有机器上的日志增量地收集到集群当中进行处理,处理的逻辑比较简单,就是做了简单清洗后再倒排索引。只要系统中报错,然后把 TraceID 作为异常日志当中的关键字打出来,我们可以看到这次调用在系统里面经历了这些事情,我们通过 TraceID 其实可以很容易地看到这次调用是卡在 B 到 C 的数据库调用,它超时了,通过这样的方式我们可以很容易追溯到这次分布式调用链路中问题到底出在哪里。其实通过 TraceId 我们只能够得到上面这张按时间排列的调用事件序列,我们希望得到的是有嵌套关系的调用堆栈。

要想还原调用堆栈,我们还需要另外一个东西叫做 RPCId(在 OpenTracing 中有类似的概念,叫做 SpanID),RPCId 是一个多维序列。它经过第一次链路的时候初始值是 0,它每进行一次深入调用的时候就变成 0.1,然后再升就是 0.1.1,它每进行一次同深度的调用,就是说 A 调完 B 以后又调了 D 就会变成 0.2,RPCId 也随着本次调用被打印至同一份 RPC Log 中,连同调用事件本身和 TraceId 一起被采集到中心处理集群中一起处理。

收集完了以后,我们对所有调用事件按照 RPCId 进行一个深度遍历,我们就可以获得这样的一个调用堆栈,上图中的调用堆栈实际上就是真实的淘宝交易系统里面进行下单的交易调用堆栈,可以看到这次调用经历了很多系统。但大家在伶俐的柠檬的视角上面来看,就好像是在本地发生的一样,我们可以很容易地去看到如果一次调用出现了问题,那问题的现象是出现在哪里,最后问题的根因又是发生在了哪里。除了调用异常的返回码之外,我们在右边其实还可以看到每次调用的耗时是多少,我们也可以看到每一次调用如果慢了它是慢在哪里。我们从这张图中解释了伶俐的柠檬是如何解决微服务四大问题中的故障定位难的问题,它可以通过倒排索引,让用户反查出每一次调用的全貌是怎样的。

 

如果我们对万亿级别的调用链数据进行聚合,是否能够获得更有价值的信息?我们可以看一下,每一次调用除了它唯一标识 TraceID 和 RPCID 之外,还包含了一些标签信息 (Tag),什么是标签呢?就是具备共性的, 大家都会有的这么一些信息,比如说这次调用它分别经历了这些系统,这些系统它每次调用的 IP 是什么,经过哪个机房,服务名是什么?有一些标签是可以通过链路透传下去的,比如入口 url,它透传下去以后我就知道这次请求在下去之后发生的每一次事件都是由通过这个入口去发起的,那么如果把这些标签进行聚合计算,我们可以得到调用链统计的数据,例如按某机房标签统计调用链,我们就可以得到每个机房的调用次数的趋势图。

 

相似组件

Zipkin 是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper 的论文设计而来,由 Twitter公司开发贡献。其主要功能是聚集来自各个异构系统的实时监控数据,用来追踪微服务架构下的系统延时问题应用系统需要进行装备(instrument)以向 Zipkin 报告数据。Zipkin 的用户界面可以呈现一幅关联图表,以显示有多少被追踪的请求通过了每一层应用。Zipkin 以 Trace 结构表示对一次请求的追踪,又把每个 Trace 拆分为若干个有依赖关系的 Span。在微服务架构中,一次用户请求可能会由后台若干个服务负责处理,那么每个处理请求的服务就可以理解为一个 Span(可以包括 API 服务,缓存服务,数据库服务以及报表服务等)。当然这个服务也可能继续请求其他的服务,因此 Span 是一个树形结构以体现服务之间的调用关系Zipkin 的用户界面除了可以查看 Span 的依赖关系之外还以瀑布图的形式显示了每个 Span 的耗时情况可以一目了然的看到各个服务的性能状况。打开每个 Span,还有更详细的数据以键值对的形式呈现,而且这些数据可以在装备应用的时候自行添加。

链接:zipkin:https://manzhizhen.iteye.com/blog/2348175

           伶俐的柠檬:https://www.cnblogs.com/gzxbkk/p/9600263.html

           google dapper论文:https://blog.csdn.net/纯真的仙人掌/article/details/79402084

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。