去皮卡多 发表于 2024-7-26 17:23:13

根本篇丨链路追踪(Tracing)其实很简单

一、分布式链路追踪的起源

当周末躺在被窝里,点外卖时;双 11 的零点,疯狂提交订单时;假期和基友激情开黑,五杀超神…在这个出色纷呈的互联网天下里,这些应用背后又隐蔽着什么?每一次点击行为在 IT 天下里会流经哪些节点,调用哪些服务,带来哪些变化?这一切庞杂且细密,超出了人力探索的界限,而分布式链路追踪就是追溯请求在 IT 系统间流转路径与状态的一门技能。接下来,让我们通过对分布式链路追踪的来了解这个 IT 天下!
说到分布式链路追踪,就绕不开分布式系统与微服务的鼓起。早期 IT 系统非常简单,险些所有程序都运行在同一个节点,相互之间也没有什么依靠。但随着硬件技能突飞猛进,硬件本钱大幅降落,软件复杂度却越来越高。单一系统性能无法满足复杂的数据计算任务,而软件逻辑的复杂性也导致维护本钱大幅上升。另外,单节点的可靠性也难以保障,不可避免的会偶然出现宕机等行为,影响软件的可用性。“性能、可维护性和可用性”这三大因素促使了分布式系统与微服务的诞生。
为了解决上述问题,人们很天然想到:既然一个硬件节点无法很好的运行软件,那能不能够通过多个节点来共同完成?并且为差别节点分派差别任务去提高服从。就比如通过差别角色分工协同的汽车生产流水线,分布式系统与微服务的理念亦是云云,如下图所示。
https://i-blog.csdnimg.cn/blog_migrate/f3668931ffccf9e0f3b2f403923643ad.png
分布式系统与微服务自诞生就被广泛应用,主要得益于以下上风:


[*]扩展性
分布式系统天然具备“按需扩展”的能力,比如双 11 大促前通过添加呆板实现快速水平扩容,大促结束后释放呆板,充分利用云计算的分时复用能力,节约本钱。利用微服务,还可以实现按需精准扩容,比如登录服务扩容 10 倍,下单服务扩容3倍,最大化的节流资源。


[*]可靠性
分布式系统可以有用反抗“单点风险”,不会因为某一个节点的故障,影响团体的服务可用性。联合流量调治、离群实例摘除和弹性扩容等技能,甚至可以实现故障自愈。


[*]可维护性
分布式系统可维护性更强,一方面我们将一个复杂服务拆分成多个简单的微服务,每个微服务的逻辑都更加清楚、更易理解。就比如我们写代码,将一个几百行的复杂函数重构成若干个简单函数,代码可读性就会直线上升。另一方面,一些通用的微服务可以被高度复用,无需重复开辟和维护,比如你在开辟一个电商 APP,可以直接调用第三方提供的支付、物流等服务接口,团体开辟和维护服从将大幅提升。
固然分布式系统与微服务具有非常显著上风,但凡事有利必有弊,它们在有用解决原有问题根本上,也为系统开辟和运维带来了新挑战,主要包罗以下几点:


[*]模糊性
随着系统的分布式水平越来越高,异常表象与根因之间的逻辑接洽变得愈加模糊,问题诊断的难度急剧上升。比如 A、B 两个服务共享同一个数据库实例,当 A 服务在压测期间,大量占用数据库的服务端连接和计算资源,会导致 B 服务出现连接超时或响应变慢等问题。如果 B 服务是通过 C 服务间接依靠该数据库实例,问题的定位就会变得更加困难。


[*]不一致
固然分布式应用从总体上变的更加可靠,但是每一个独立节点的状态却难以保证。导致这种不一致的原因有很多,比如前文提到的单机故障这种预期外的不一致,大概应用 Owner 执行分批发布或流量灰度时导致的预期老手为不一致。这种不一致性导致我们难以确定一个用户请求在系统内的准确执行路径与行为逻辑,大概引发不可预知的逻辑灾难。


[*]去中央化
当你的系统拥有上千个微服务镜像运行在数百台呆板实例上,你该怎样梳理它们之间的依靠关系,又该怎样找到焦点业务的关键执行路径?特殊是在分布式的场景下,你没有一个中央化的节点(Master)来生存每个服务之间的依靠与调治状态,每个独立节点都在自行其是,无法分辨自己在整个系统中的位置,只能“瞽者摸象、管中窥豹”,缺乏全局视图。
分布式系统与微服务带来的新挑战无疑让人头痛,但也带来了新技能的发展契机,科技的发展总是如许循环往复,螺旋式上升。它们带来的新问题,促使了分布式链路追踪的诞生,使你能够有用的观察全局,追踪流量。我们将在下个章节了解分布式链路追踪的诞生历程与核生理念。
二、分布式链路追踪的诞生

为了应对分布式环境下的不一致、模糊性等前文提到的各类问题问题,人们试图通过请求粒度的轨迹追踪与数据透传,实现节点间的确定性关联,分布式链路追踪技能也由此诞生。
里程碑事件:Google Dapper

分布式链路追踪诞生的标志性事件就是 Google Dapper 论文的发表。2010 年 4 月,Benjamin H. Sigelman 等人在 Google Technical Report 上发表了《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》,揭开了分布式链路追踪的技能大幕,开启了一段全新技能海潮。
Dapper 起首明确了分布式链路追踪的两个目的:任意部署和持续监测。进而给出了三个具体的计划准则:


[*]低开销:确保焦点系统不会因为额外的性能开销拒绝利用。
[*]应用级透明:对应用开辟透明,无需开辟人员的帮忙,降低接入门槛,提高迭代服从。
[*]可扩展:在将来相称长一段时间内,随着业务的高速发展,仍旧可以有用运转。
下面几张图展示了 Dapper 对链路透传、调用链布局和数据收罗流程的描述,我们将在后续章节详细展开先容,对 Dapper 感爱好的同砚发起直接阅读原作。
https://i-blog.csdnimg.cn/blog_migrate/ef6476d929086f8424a3710d89ff7dc8.png
Dapper 论文有两个紧张的意义,一是详细阐述了分布式链路追踪的计划理念,为厥后的实现者提供了紧张的理论引导;二是通过 Dapper 在 Google 生产环境的大规模落地实践,证实了分布式链路追踪技能的企业级价值,为分布式链路追踪的推广作出了不可磨灭的贡献。
根本原理

分布式链路追踪并不是无中生有、凭空诞生的新概念,而是轨迹追踪在 IT 范畴的又一次成功运用。轨迹追踪理念早已被广泛应用于社会生活方方面面,比如物流订单追踪。一个快递包裹在发件站被赋予快递单号,沿途中转节点会记录该快递到达时间等信息,而用户通过快递单号就可以查询自己的包裹途径了哪些站点,耗时多久,是否存在滞留或丢件情况。下表对比了物流追踪与链路追踪的关联与差异性,以便各人理解。
https://i-blog.csdnimg.cn/blog_migrate/94f017cd238472e7c679768ea99a83db.png
分布式链路追踪的根本原理就是在分布式应用的接口方法上设置一些观察点(雷同快递中转站记录点),然后在入口节点给每个请求分配一个全局唯一的标识 TraceId(雷同快递单号),当请求流经这些观察点时就会记录一行对应的链路日记(包含链路唯一标识,接口名称,时间戳,主机信息等)。最后通过 TraceId 将一次请求的所有链路日记进行组装,就可以还原出该次请求的链路轨迹,如下图所示。
https://i-blog.csdnimg.cn/blog_migrate/fff74a62eafa2ba33e53b8e0dbff327d.png
分布式链路追踪实现请求回溯的关键点有两个:一是低本钱、高质量的观察点设置,也就是链路插桩,确保我们追踪的信息充足丰富,能够快速定位异常根因;二是保证链路上下文在差别环境下都能够完备透传,避免出现上下文丢失导致的断链现象。关于链路插桩和上下文透传的具体内容我们将在实战篇进行详细先容。下面,我们来看一个高速公路例子,进一步加深对链路追踪实现原理的熟悉。
一辆汽车飞驰在高速公路上

小明、小红、小玉计划在“五一”期间去自驾游,他们的旅游门路各不相同。如果我们想追踪他们的行程轨迹与时间该怎样实现?
大概你会发起在每辆车上安装一个追踪器。确实,这是一种行之有用的方法。但当出行车辆扩展到天下数以十亿计的规模,安装追踪器本钱就会很高。此时我们换个角度思考,高速公路的门路是固定的,每隔一段距离就会有一个收费站,如果我们在每个收费站上安装监控,记录车辆在每个收费站的轨迹与时间,就可以很经济的实现车辆轨迹与行驶时间的追踪。终极,我们得到了如下行程记录:
游客行程门路行驶距离行驶时间小明北京 -> 石家庄 -> 郑州 -> 西安1140 公里13 小时 34 分钟小红北京 -> 天津 -> 济南 -> 南京 -> 杭州1280 公里14 小时 33 分钟小玉北京 -> 天津 -> 济南 -> 南京 -> 上海1234 公里13 小时 53 分钟 https://i-blog.csdnimg.cn/blog_migrate/8b86bb83d88579cae3dad2f2c0b5b6b5.png
如果我们将每个游客替换为服务请求,收费站替换为服务接口,那我们就可以得到每次请求在分布式系统中的调用轨迹与状态,这就是分布式链路追踪的含义。
根本术语

固然分布式链路追踪的实现方式多种多样,差别开源或商业化产品都有自己的数据模型和界说。但是仍旧有一些根本术语在业界具备广泛的共识,以 OpenTracing 为例。
Trace

一条 Trace 代表一次入口请求在 IT 系统内的完备调用轨迹及其关联数据集合。其中,全局唯一的链路标识 TraceId,是最具代表的一个属性。通过 TraceId 我们才能将同一个请求分散在差别节点的链路数据准确的关联起来,实现请求粒度的“确定性关联”价值。这也是 Trace 区别于 Metrics、Log 其他两类可观测技能的关键属性。
Span

光有 TraceId 还不够,请求在每一跳的接口方法上执行了什么动作,耗时多久,执行状态是成功照旧失败?承载这些信息的根本对象就是 Span。通常一个完备的 Span 具有如部属性:


[*]Operation Name:描述了当前接口的行为语义,比如 /api/createOrder 代表执行了一次创建订单的动作。
[*]SpanId/ParentSpanId:接口调用的层级标识,用于还原 Trace 内部的层次调用关系。
[*]Start/FinishTime:接口调用的开始和结束时间,二者相减就是该次调用的耗时。
[*]StatusCode:响应状态,标识当次调用是成功或失败。
[*]Tags & Events:调用附加信息,详见下面的描述。
Tags

SpanName 的描述通常是高度抽象的,仅仅回答这个接口是做什么的。如果必要进一步记录请求的行为特征,可以利用 Tags 来扩展语义。Tags 是一组由 {Key:Value} 构成的键值对集合,描述这一次接口调用的具体属性,比如将 UserType 添加到 Tags 中,就可以观察某一类用户(比如 VIP 用户)的链路行为状态。如果将设备类型加到 Tags 中,可以对比差别设备的性能差异。
由于 Tags 只支持布局化的 KV 键值对,因此,它可以作为标签添加到聚合后的链路指标中,有用提升监控告警的数据精度。更准确的回答异常或性能问题发生的原因,比如集中在某个地域、设备或版本。
Logs

Tags 会随着链路上下文自动向卑鄙透传,如果希望记录一些不必要透传的事件信息,可以利用 Logs 字段。每个 Span 都可以进行多次 Logs 操作,但每个 Logs 对象都必要带有一个时间戳,Logs 的内容可以是非布局化的复杂对象。为了节流本钱,一般不会对 Logs 字段创建索引,也不支持 Logs 的查询或统计,仅仅作为附加信息关联在调用链上,用于单请求诊断。
下图展示了一个 OpenTracing 的 Span 示例,差别开源实现的链路模型我们将在后续章节再展开先容。
https://i-blog.csdnimg.cn/blog_migrate/4a799e88639aa742394bbed8f91b24ba.png
分布式链路追踪已经被广泛应用于中大型企业的 IT 运维范畴,为分布式应用的性能诊断与稳定性保障提供了有用的资助。别的,分布式链路追踪的开源和商业化生态也发展迅猛,大量独立服务商或云厂商纷纷跟进,共同推动了分布式链路追踪技能的崛起。
三、分布式链路追踪的应用

狭义上分布式链路追踪(Tracing)是指跟踪请求在分布式系统中的流转路径与状态,主要用途是帮忙开辟运维人员进行故障诊断、容量预估、性能瓶颈分析与调用链路梳理等工作。技能实现上包含了数据埋点、收罗、存储、分析、可视化等环节,形成了一套完备的技能体系。
而更广义的分布式链路追踪,则涵盖了由数据透传能力衍生的生态系统,比如全链路压测、微服务流量路由、业务场景链路拆分等。我们可以为调用链路赋予业务语义,也可以将一次调用生命周期内的所有数据进行关联整合,不再范围于链路数据本身。
由此可见,分布式链路追踪的应用场景广阔,潜力巨大,它的焦点属性就是“关联”。然而,分布式链路追踪(Tracing)相对于统计指标(Metrics)和应用日记(Logging)来说更加难以理解,不容易运用,更难用好。接下来,我们通过一个生动形象的例子,了解下分布式链路追踪的经典用法,加深对它的技能本质的掌握。
游客、收费站和交通局

分布式链路追踪的用法有很多,但最经典、最常用的有三种,照旧以上一节的高速公路为例,差别角色对应着差别的用法。


[*]游客,只关心自身的行程门路,必要途经哪些收费站点?行驶时间有多长?沿途是否有拥堵或危险路段等。
[*]收费站,只关心自身站点的状态,比如站点吞吐量、均匀过闸时间等,以便于提前安排检票口值班人数。
[*]交通局,会将所有的出行记录汇总,提前估算整个高速公路网的出行流量、易拥堵路段、事故多发路段等,以便于提前疏通或加固问题路段,并给出合理的发起出行门路,有时还必要提前制定车辆限流策略等。
分布式链路追踪的应用和行程轨迹追踪雷同,游客关心的是单次请求的轨迹回溯,收费站关注的是服务接口维度的汇总统计,旅游局则雷同全局链路拓扑梳理。
单请求轨迹回溯

单请求轨迹回溯是分布式链路追踪最根本的功能,它记录了一次请求经过的所有服务节点以及对应的节点状态信息(接口名称、耗时、状态码等),这就比如记录了游客自驾游时经过的所有收费站,以及沿途的路况与行驶时间等信息。单请求轨迹回溯是诊断特定请求异常/超时原因的有用手段,可以快速定位异常节点(拥堵的收费站)。
比力成熟的 Tracing 产品(比如阿里云的应用实时监控服务 ARMS)除了根本的链路数据外,还会记录请求出入参、本地方法栈、关联 SQL 与异常堆栈等信息。这些细节信息就比如车辆的型号巨细、驾驶员驾龄、是否醉酒、沿途每一起段的详细路况等,当调用不符合预期(行程异常)时,就可以精准的定位根因,如下图所示:
   ARMS:https://help.aliyun.com/document_detail/64995.htmlhttps://i-blog.csdnimg.cn/blog_migrate/1a5e1bfeb43a237ae95fb481037c7710.png
服务监控

假如你是收费站的站长,你会关注哪些信息?收费站的车辆吞吐量?均匀的过闸时间?车辆的来源与去处?同理,每一个服务节点,将途经的所有调用信息汇总后,就可以得到当前服务接口的吞吐量、耗时、来源与去处等统计指标。这些指标可以资助我们快速识别当前服务的健康状态。在实际生产系统中,还可以与告警系统联合,实现风险的快速识别与处理惩罚,降低业务损失。
https://i-blog.csdnimg.cn/blog_migrate/ac1cdf05754fa8a9c34119e7cf0102a0.png
链路拓扑

假如你是交通局的局长,你大概会关注天下高速公路网的团体运行状态,有哪些易拥堵或事故多发路段与站点,怎样确保春运高峰期焦点路段运行通畅,不会出现庞大交通瘫痪事件等等。此时,你必要对所有的车辆行程轨迹进行汇总分析。
同理,链路拓扑就是将全局或某一入口服务的所有调用链路进行汇总,聚合为链路拓扑大图,进而分析当前链路的性能瓶颈点、易故障点等,提进步行性能优化或风险防控,还可以根据历史流量来引导将来(比如双 11 大促)的容量评估。
https://i-blog.csdnimg.cn/blog_migrate/162e35851eae6f4b8c2f9042f6cf812a.png
分布式链路追踪的发显现状

停止到 2021年,分布式链路追踪(Tracing)已经成为主流软件架构不可或缺的根本技能之一,它与指标(Metrics)、日记(Logging)并称为可观测范畴的“三驾马车”,它们三者之间的关系如下图所示:
https://i-blog.csdnimg.cn/blog_migrate/8a5a4a4472239bd74d760763a837c397.png
随着 Kubenetes 容器技能与云计算的普及,将来的软件架构会更加趋向分布式云、微服务化的方向,软件开辟、部署本钱将大幅降落,但是系统维护和问题诊断的难度却急剧上升。因此,分布式链路追踪以及由它提供的“确定性关联”价值将愈加凸显,如下图所示:
https://i-blog.csdnimg.cn/blog_migrate/699c618ce12c498f2c2dbefe56ed2f2a.png
Tracing 在开源社区也颇受喜爱,拥有着茂盛的生命力,主流的开源标准包罗 OpenTelemetry、OpenTracing、OpenCensus 和国内利用较多的 SkyWalking。其他影响力较强的实现还包罗 Jaeger、Zipkin、Pinpoint 等,如下图所示。
https://i-blog.csdnimg.cn/blog_migrate/e3456030474192a7dc00f051e7bd8eb4.png
在商业化范畴,Tracing 与 APM(Application Performance Mornitoring) 密切绑定,绝大部门厂商会面向应用视角提供更加全面、易用的 APM 服务,而不仅仅是 Tracing 服务。参考 2021 年 Gartner 评测机构给出的 APM 魔力象限,可以大抵评估各大厂商的 APM 与 Tracing 产品能力,如下图所示。
https://i-blog.csdnimg.cn/blog_migrate/cdebdc0fe53b39a7f3e212e0806e1368.png
停止 2021年,阿里巴巴 98% 的 Java 应用(上万级别)均已接入内部自研的分布式链路追踪系统 EagleEye;阿里云上有近万家企业在持续利用 ARMS 提供的分布式链路追踪服务。而从整个业界来看,无论是谷歌、亚马逊如许的国际大厂,照旧新兴的互联网公司,或是传统企业,都在大规模接入和应用分布式链路追踪技能,Tracing 生态正在蓬勃发展。
四、分布式链路追踪的挑战与限制

作为一门“新”技能,分布式链路追踪的技能演进史并不算长,仅有十数年。目前,它仍处于不断被探索、快速迭代的周期。为了更好的了解与应用分布式链路追踪技能,我们来看下它目前面临的几项关键挑战与限制。
关键挑战与应对

分布式链路追踪技能从诞生到大规模应用,中间履历了一段较长的蛰伏期,直到近几年才渐渐被各人广泛接受和承认。影响其快速推广的关键挑战包罗如下几点:


[*]前期创建本钱高
无论是在差别组件接口上进行插桩埋点,照旧保证链路上下文能够精确传播,亦或是搭建一套稳定可靠的链路数据后端处理惩罚系统,都不是一件易事,必要投入大量的研发人力。


[*]数据处理惩罚本钱高
由于链路数据与请求流量成正比,每一次请求都会记录相应的链路日记,当系统流量爆炸式增长,相应的链路数据天生、收罗、处理惩罚、存储、查询的本钱也会急剧上升,带来巨大的 IT 资源开销。


[*]价值没有得到普遍承认
根本的链路数据仅仅表达了接口间的调用依靠,没有释放充足的业务价值,难以得到领导和同事们的全力支持。


[*]链路标准差别一
分布式链路追踪发展前期没有同一的业界标准,各家厂商百花齐放,固然一定水平上促进 Tracing 技能的多元化探索,但也为链路融合、迁移和推广带来了巨大的挑战。
当然,挑战同样也是机遇,为了应对上述问题,分布式链路追踪近几年实现了如下技能突破


[*]无侵入探针 + 一体化解决方案
雷同 JavaAgent 的探针插桩技能,实现了 0 代码入侵,0 改造本钱的链路自动埋点,而雷同 SkyWalking 的开源实现还提供了端到端的一体化解决方案,从链路数据天生到最后的可视化,中小企业可以快速搭建并享受到分布式链路追踪技能的价值,大幅降低了 Tracing 的前期创建本钱和接入门槛。


[*]链路采样 + 边沿计算
链路采样策略,例如固定比例采样、限流采样、错慢全采、自界说标签采样等,可以大幅降低链路数据的传输、处理惩罚、存储本钱;联适用户网络内的指标聚合,长文本编码/压缩等边沿计算技能,可以合理控制分布式链路追踪的数据本钱,保障链路系统持续健康运转。


[*]关联分析 + 立体化可观测
单条链路的价值难以凸显,但是基于成千上万条链路的聚合/关联分析却能快速定位,导致系统异常的关键因素,比如版本、地域、用户类型等。同时,联合业务、容器、根本办法等其他层面的可观测数据,创建一套端到端、立体化的可观测体系,能够更加有用地释放分布式链路追踪的技能价值。


[*]开源标准趋向同一
自从 2019 年 OpenTelemetry 开源立项,得到了两大主流开源实现 OpenTracing 和 OpenCensus 的鼎力大举支持,开启了可观测性的新时代。固然,目前 OpenTelemetry 仅在 Tracing 范畴拥有比力完善的技能标准,Metrics 和 Logging 仍在探索阶段,但是可观测性“三驾马车”融合一统的趋势已经势不可挡。将来基于同一完善的可观测数据标准,分布式链路追踪的“确定性关联”将得到更加广泛的应用。
现阶段能力限制

分布式链路追踪现有的模型计划与实现,可以有用满足许多经典场景的分布式诊断诉求。但是,仍旧有大量场景超出了现阶段分布式链路追踪的能力范畴,必要我们去探索更好的方案。
树形 YES!图形 NO!

前文先容了分布式链路追踪是通过 ParentSpanId 和 SpanId 来标识依靠关系,从而准确还原链路层级与顺序。但是,每个 Span 有且仅有一个 ParentSpanId,这就限制了所有链路形态只能是单个父节点的树形布局,而不能是多个父节点的图形布局。
某些系统为了提供重复调用的服从,会将多次 RPC 调用打包成一次 RPC 调用合并发送,这种入度大于1的图形布局,就无法通过调用链真实还原调用状态,而是会被拆成多条调用链,如下图所示:
https://i-blog.csdnimg.cn/blog_migrate/5283ad08f9245309dd09c1981a7b50b8.png
人工插桩 YES!智能插桩 NO!

无论是 SDK 或是 Agent 模式,目前工业界的链路插桩主要是依靠人工发现插桩点并实现插桩过程,很难通过算法自适应的实现插桩点的智能发现。然而,学术界在这方面已经进行了一些故意思的探索,固然在性能开销、安全等方面还不够成熟,但是值得关注。
2019 年波士顿大学发表了一篇研究智能插桩的文章,他们实现的 Pythia 原型系统针对性能退化问题,可以自动发现更有价值的内部插桩点。例如,我们在请求一个存储系统时,大概会直接掷中缓存快速返回结果,也大概未掷中缓存导致加载磁盘耗费了较多时间。我们仅在 RPC 层面进行插桩,只能看到请求耗时高低起伏,出现一种双峰式的分布,但无法确认根因是什么。Pythia 通过比对分析差别的链路数据,会自动发现影响性能的潜伏插桩点,比如慢请求大概会额外调用一次 fetchFromDisk 方法,从而更清楚的解释影响请求耗时的根因,如下图所示。
https://i-blog.csdnimg.cn/blog_migrate/09aaf8844b738b355c0c3b826f8190b5.png
https://i-blog.csdnimg.cn/blog_migrate/4aae3e5e0a718bb186de77311d4bb5b0.png
分布式链路追踪的能力限制远不止以上两种场景,在离线分析、呆板学习等多个范畴也等待我们去探索攻克。我们既要充分发挥现有的分布式链路追踪技能价值,解决当下的企业运维困难;同时也要把视野放宽,在将来更多的范畴中去拓展分布式链路追踪的界限。
作者:涯海
原文链接
本文为阿里云原创内容,未经允许不得转载。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 根本篇丨链路追踪(Tracing)其实很简单