分布式系统为什么需要链路追踪?

随着互联网业务快速扩展,软件架构也日益变得复杂,为了适应海量用户高并发请求,系统中越来越多的组件开始走向分布式化,如单体架构拆分为微服务、服务内缓存变为分布式缓存、服务组件通信变为分布式消息,这些组件共同构成了繁杂的分布式网络。

微服务架构(极简版)

假如现在有一个系统部署了成千上万个服务,用户通过浏览器在主界面上下单一箱茅台酒,结果系统给用户提示:系统内部错误,相信用户是很崩溃的。

运营人员将问题抛给开发人员定位,开发人员只知道有异常,但是这个异常具体是由哪个微服务引起的就需要逐个服务排查了。

界面出现异常难以排查后台服务

开发人员借助日志逐个排查的效率是非常低的,那有没有更好的解决方案了?

答案是引入链路追踪系统

什么是链路追踪?

分布式链路追踪就是将一次分布式请求还原成调用链路,将一次分布式请求的调用情况集中展示,比如各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等等。

链路跟踪主要功能:

  • 故障快速定位:可以通过调用链结合业务日志快速定位错误信息。

  • 链路性能可视化:各个阶段链路耗时、服务依赖关系可以通过可视化界面展现出来。

  • 链路分析:通过分析链路耗时、服务依赖关系可以得到用户的行为路径,汇总分析应用在很多业务场景。

链路追踪基本原理

链路追踪系统(可能)最早是由Goggle公开发布的一篇论文

《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》

被大家广泛熟悉,所以各位技术大牛们如果有黑武器不要藏起来赶紧去发表论文吧。

在这篇著名的论文中主要讲述了Dapper链路追踪系统的基本原理和关键技术点。接下来挑几个重点的技术点详细给大家介绍一下。

Trace

Trace的含义比较直观,就是链路,指一个请求经过所有服务的路径,可以用下面树状的图形表示。

traceId串联请求形成链路

图中一条完整的链路是:chrome -> 服务A -> 服务B -> 服务C -> 服务D -> 服务E -> 服务C -> 服务A -> chrome。服务间经过的局部链路构成了一条完整的链路,其中每一条局部链路都用一个全局唯一的traceid来标识。

Span

在上图中可以看出来请求经过了服务A,同时服务A又调用了服务B和服务C,但是先调的服务B还是服务C呢?从图中很难看出来,只有通过查看源码才知道顺序。

为了表达这种父子关系引入了Span的概念。

同一层级parent id相同,span id不同,span id从小到大表示请求的顺序,从下图中可以很明显看出服务A是先调了服务B然后再调用了C。

上下层级代表调用关系,如下图服务C的span id为2,服务D的parent id为2,这就表示服务C和服务D形成了父子关系,很明显是服务C调用了服务D。

Span使请求具有父子关系

总结:通过事先在日志中埋点,找出相同traceId的日志,再加上parent id和span id就可以将一条完整的请求调用链串联起来。

Annotations

Dapper中还定义了annotation的概念,用于用户自定义事件,用来辅助定位问题。

包含四个注解信息:

cs:Client Start,表示客户端发起请求;

sr:ServerReceived,表示服务端收到请求;

ss:Server Send,表示服务端完成处理,并将结果发送给客户端;

cr:ClientReceived,表示客户端获取到服务端返回信息;

一次请求和响应过程

上图中描述了一次请求和响应的过程,四个点也就是对应四个Annotation事件。

如下面的图表示从客户端调用服务端的一次完整过程。如果要计算一次调用的耗时,只需要将客户端接收的时间点减去客户端开始的时间点,也就是图中时间线上的T4 - T1。如果要计算客户端发送网络耗时,也就是图中时间线上的T2 - T1,其他类似可计算。

请求和响应的时间线

带内数据与带外数据

链路信息的还原依赖于带内带外两种数据。

带外数据是各个节点产生的事件,如cs,ss,这些数据可以由节点独立生成,并且需要集中上报到存储端。通过带外数据,可以在存储端分析更多链路的细节。

带内数据如traceid,spanid,parentid,用来标识trace,span,以及span在一个trace中的位置,这些数据需要从链路的起点一直传递到终点。通过带内数据的传递,可以将一个链路的所有过程串起来。

采样

由于每一个请求都会生成一个链路,为了减少性能消耗,避免存储资源的浪费,dapper并不会上报所有的span数据,而是使用采样的方式。举个例子,每秒有1000个请求访问系统,如果设置采样率为1/1000,那么只会上报一个请求到存储端。

数据采样

通过采集端自适应地调整采样率,控制span上报的数量,可以在发现性能瓶颈的同时,有效减少性能损耗。

存储

存储多样化

链路中的span数据经过收集和上报后会集中存储在一个地方,Dapper使用了BigTable数据仓库,常用的存储还有ElasticSearch, HBase, In-memory DB等。

业界常用链路追踪系统

Google Dapper论文发出来之后,很多公司基于链路追踪的基本原理给出了各自的解决方案,如Twitter的Zipkin,Uber的Jaeger,pinpoint,Apache开源的skywalking,还有国产如阿里的鹰眼,美团的Mtrace,滴滴Trace,新浪的Watchman,京东的Hydra,不过国内的这些基本都没有开源。

为了便于各系统间能彼此兼容互通,OpenTracing组织制定了一系列标准,旨在让各系统提供统一的接口。

下面对比一下几个开源组件,方便日后大家做技术选型。

开源组件对比

附各大开源组件的地址:

  • zipkin  -> https://zipkin.io/

  • Jaeger  -> https://www.jaegertracing.io/

  • Pinpoint  -> https://github.com/pinpoint-apm/pinpoint

  • SkyWalking  ->  http://skywalking.apache.org/

接下来介绍一下Zipkin基本实现。

分布式链路追踪系统Zipkin实现

Zipkin 是 Twitter 的一个开源项目,它基于 Google Dapper 实现,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。

Zipkin基本架构

Zipkin架构

在服务运行的过程中会产生很多链路信息,产生数据的地方可以称之为Reporter。将链路信息通过多种传输方式如HTTP,RPC,kafka消息队列等发送到Zipkin的采集器,Zipkin处理后最终将链路信息保存到存储器中。运维人员通过UI界面调用接口即可查询调用链信息。

Zipkin核心组件

Zipkin有四大核心组件

Zipkin核心组件

(1)Collector

一旦Collector采集线程获取到链路追踪数据,Zipkin就会对其进行验证、存储和索引,并调用存储接口保存数据,以便进行查找。

(2)Storage

Zipkin Storage最初是为了在Cassandra上存储数据而构建的,因为Cassandra是可伸缩的,具有灵活的模式,并且在Twitter中大量使用。除了Cassandra,还支持支持ElasticSearch和MySQL存储,后续可能会提供第三方扩展。

(3)Query Service

链路追踪数据被存储和索引之后,webui 可以调用query service查询任意数据帮助运维人员快速定位线上问题。query service提供了简单的json api来查找和检索数据。

(4)Web UI

Zipkin 提供了基本查询、搜索的web界面,运维人员可以根据具体的调用链信息快速识别线上问题。

总结

  1. 分布式链路追踪就是将每一次分布式请求还原成调用链路。

  2. 链路追踪的核心概念:Trace、Span、Annotation、带内和带外数据、采样、存储。

  3. 业界常用的开源组件都是基于谷歌Dapper论文演变而来;

  4. Zipkin核心组件有:Collector、Storage、Query Service、Web UI。

- END -

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:

长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

原来10张图就可以搞懂分布式链路追踪系统原理相关推荐

  1. 13 张图彻底搞懂分布式系统服务注册与发现原理

    作者 | 雷架 来源 | 爱笑的架构师(ID:DancingOnYourCode) 头图 |  CSDN 下载自东方IC 在微服务架构或分布式环境下,服务注册与发现技术不可或缺,这也是程序员进阶之路必 ...

  2. 13张图彻底搞懂分布式系统服务注册与发现原理

    在微服务架构或分布式环境下,服务注册与发现技术不可或缺,这也是程序员进阶之路必须要掌握的核心技术之一,本文通过图解的方式带领大家轻轻松松掌握. 引入服务注册与发现组件的原因 先来看一个问题,假如现在我 ...

  3. 分布式链路追踪系统深入理解

    背景 对于普通系统或者服务来说,一般通过打日志来进行埋点,然后再通过elk进行定位及分析问题,更有甚者直接远程服务器,使用各种linux命令单手操作查看日志,说到这,我也没摆脱这种困境.那么随着业务越 ...

  4. NET Core微服务之路:SkyWalking+SkyApm-dotnet分布式链路追踪系统的分享

    对于普通系统或者服务来说,一般通过打日志来进行埋点,然后再通过elk或splunk进行定位及分析问题,更有甚者直接远程服务器,直接操作查看日志,那么,随着业务越来越复杂,企业应用也进入了分布式服务化的 ...

  5. 微服务链路追踪_.NET Core微服务:分布式链路追踪系统分享

    (给DotNet加星标,提升.Net技能) 转自:另一个老李 cnblogs.com/SteveLee/p/10463200.html 对于普通系统或者服务来说,一般通过打日志来进行埋点,然后再通过e ...

  6. 从零开始使用Skywalking分布式链路追踪系统

    当我们用很多服务时,各个服务间的调用关系是怎么样的?各个服务单调用的顺序\时间性能怎么样?服务出错了,到底是哪个服务引起的?这些问题我们用什么方案解决呢,以前的方式是各个系统自己单独做日志,出了问题从 ...

  7. javascript 不让成为nan_一张图彻底搞懂JavaScript的==运算

    大家知道,==是JavaScript中比较复杂的一个运算符.它的运算规则奇怪,容易让人犯错,从而成为JavaScript中"最糟糕的特性"之一. 在仔细阅读了ECMAScript规 ...

  8. 25张图详解 | 大型分布式电商系统架构(二)

    本文是学习大型分布式网站架构的技术总结.对架构一个高性能.高可用.可伸缩及可扩展的分布式网站进行了概要性描述,并给出一个架构参考.文中一部分为读书笔记,一部分是个人经验总结,对大型分布式网站架构有较好 ...

  9. [资源分享] 【Springboot】实例讲解Springboot整合OpenTracing分布式链路追踪系统(Jaeger和Zipkin)

    1 分布式追踪系统 随着大量公司把单体应用重构为微服务,对于运维人员的责任就更加重大了.架构更复杂.应用更多,要从中快速诊断出问题.找到性能瓶颈,并不是一件容易的事.因此,也随着诞生了一系列面向Dev ...

最新文章

  1. Linux脚本获取日期,Shell脚本获取格式化日期与时间
  2. 关于Servlet的原理以及常用类
  3. 使用Boxfuse为您的REST API设置https
  4. Spring笔记——数据源配置
  5. bi 存储过程方案_BI 系统中容易被忽视的数据源功能
  6. uboot源码——内核启动分析
  7. 字节跳动全资收购北京麦田?回应称只收购了麦田旗下一家公司
  8. JAVA就诊叫号_基于B/S的JAVA门诊就诊系统
  9. 15 张前端高清知识地图,强烈建议收藏
  10. 简述python调试程序_简单调试 Python 程序
  11. Atitit。木马病毒原理机密与概论以及防御
  12. php tcp utp链接,【黑帽seo】php随机调用友情链接技术
  13. 使用片段嵌入进行文档搜索
  14. 浙江大学翁恺老师的城堡游戏源代码
  15. i5 6600 HD530联想扬天S5250黑苹果
  16. 请注意:黑客开始用云隐藏IP地址
  17. 剑指offer——二十六进制和十进制的相互转换
  18. 中国富豪的七条发家路--颇显中国特色
  19. 【转载】儒林外史人物——周进(二)
  20. PostgreSQL使用PostGIS插件,存储GIS数据

热门文章

  1. 7 个日常实用的 Shell 拿来就用脚本实例!
  2. 容斥 + 树形dp ---- 2021 icpc 沈阳 L Perfect Matchings
  3. Harmonic Number(调和级数+欧拉常数)
  4. UVA10652 Board Wrapping(求凸包、计算凸多边形面积)
  5. 【每日DP】day14、P2016 战略游戏(树形DP模板)难度⭐⭐⭐
  6. 建造者模式java_java设计模式3——建造者模式
  7. 科学教师与实验教师工作计算机,计算机实验指导教师工作职责
  8. oracle中before,Oracle中Before和After触发器的例子
  9. 有多个重载参数pow_面试深刨——150分面重载
  10. 三星android pro,够大才能爽 三星Galaxy Note Pro评测