分布式系统架构6:链路追踪

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 本文深入探讨了分布式系统中的链路追踪理论,涵盖追踪与跨度的概念、追踪系统的模块划分及数据收集的三种方式。链路追踪旨在解决复杂分布式系统中请求流转路径不清晰的问题,帮助快速定位故障和性能瓶颈。文中介绍了基于日志、服务探针和边车代理的数据收集方法,并简述了OpenTracing、OpenCensus和OpenTelemetry等链路追踪协议的发展历程及其特点。通过理解这些概念,可以更好地掌握开源链路追踪框架的使用。

这是小卷对分布式系统架构学习的第6篇文章,关于链路追踪,之前写过traceId的相关内容:https://juejin.cn/post/7135611432808218661,不过之前写的太浅了,且不成系统,只是简单的理解,今天来捋一下链路追踪的理论

1.为什么需要链路追踪

在复杂的分布式系统中,系统通常由多个独立的服务组成,几乎每一个前端请求都会形成一个复杂的分布式服务调用链路。

链路追踪1.png

这种复杂的系统会带来一系列问题:

1.如何快速定位问题,判断故障影响范围?

2.如何梳理服务间的依赖关系?

链路追踪的用途就是为了知道请求在系统中的流转路径,定位性能瓶颈,诊断故障等。

2.追踪与跨度

要理解链路追踪的原理,先理解Trace追踪 和 Span跨度两个概念。

  • Trace(追踪):一个完整的用户请求流程,从用户发起请求开始,到请求结束。一个追踪包含多个 Span。
  • Span(跨度):一种表示工作单元的结构,通常对应着请求经过的某个服务或者操作,每个Span包含以下信息:
    • Span ID:唯一标识当前Span
    • Trace ID:标识属于同一个Trace的所有Span
    • 父Span ID:如果当前Span由另一个Span引发,则会记录父Span ID
    • 时间戳、标签和日志

每一次Trace是由若干个有顺序、有层级关系的Span组成的一棵追踪树结构,图片来源Dapper论文

链路追踪2.png

3.链路追踪的概念

广义上,分布式链路追踪系统可以分为三个部分:数据收集、数据存储、数据展示

狭义上,指链路追踪的数据收集部分

比如:Spring Cloud Sleuth就属于狭义的追踪系统,通常会搭配 Zipkin 作为数据展示,搭配 Elasticsearch 作为数据存储来组合使用。

这里从Dapper论文的内容总结下链路追踪的设计目标如下:

  • 低开销:追踪系统对正在运行的服务应该具备很小的性能影响
  • 应用层透明性:开发人员无需关注追踪系统,作为业务组件,尽可能减少对业务系统的代码侵入性。使用时透明,减少开发负担。如果需要依赖开发者配合才能使追踪系统生效,这样是无法满足追踪系统“无所不在的部署”这个需求
  • 可扩展性:支持分布式部署,具备良好的扩展性,能支持的组件越多越好,至少在接下来几年内能处理服务和集群的规模
  • 数据的快速分析:追踪数据生成后的数据分析要快,分析维度尽可能多,理想情况下是一分钟内,数据的新鲜度能快速对生产异常做出反应。

4.功能模块

生产环境的链路追踪系统,主要分为4个大模块:

4.1 埋点与生成日志

分客户端埋点、服务端埋点、以及客户端和服务端双向埋点,埋点日志通常包含了traceId、spanId、调用的开始时间,协议类型、调用方ip和端口,请求的服务名、调用耗时,调用结果,异常信息等

需要写log,高并发服务中,性能影响越重,通常使用采样+异步log的方式解决

4.2 收集和存储日志

特点是需支持分布式日志采集方案,一般还会用MQ作为缓冲

每个机器上有个daemon,这里的daemon指的后台服务进程,专门用于日志收集和Trace转发;

多级collector,类似pub/sub架构,可以负载均衡;

聚合数据进行实时分析和离线存储;

离线分析 需将同一条调用链的日志汇总在一起;

4.3 分析和统计调用链数据

调用链跟踪分析:把同一TraceID的Span收集起来,按时间排序就是timeline。把ParentID串起来就是调用栈

4.4数据展现以及决策支持

5.数据收集的三种实现方式

不论是狭义还是广义的链路追踪系统,都必须包含数据收集的工作,介绍三种主流的数据收集方式:

5.1基于日志的追踪Log-based Tracing

思路是将 Trace、Span 等信息直接输出到应用日志中,然后将日志归集过程汇聚到一起,再从全局日志信息中反推出完整的调用链拓扑关系;

日志追踪对网络消息完全没有侵入性,对应用程序只有很少量的侵入性,对性能的影响也非常低

缺点:

  • 依赖日志归集过程,日志不求决对的一致和连续,精准性较低。
  • 业务服务的调度和日志归集不是由同一个进程同时完成的,存在日志延迟或丢失的问题,从而产生追踪失真的情况

5.2基于服务的追踪

目前最常见的追踪实现方式,如Zipkin、SkyWalking、Pinpoint 等主流追踪系统都采用这种方式,其实现思路是:通过某些手段给目标应用注入追踪探针(Probe),比如针对 Java 应用,一般就是通过 Java Agent 注入的。

探针可以看作是目标服务身上的小型微服务系统,有服务注册、心跳检测等功能,有专门的数据收集协议,可以把从目标系统收集的服务调用信息,通过HTTP 或者 RPC 请求,发送给追踪系统

该方式具备追踪的精确性和稳定性,缺点是消耗的资源更多,具备更强的侵入性

下图是pinpoint的调用栈示例:

链路追踪3.png

Pinpoint 本身就是比较重负载的系统(运行它必须先维护一套 HBase),服务追踪这方面国产开源的Skywalking更加轻量化

5.3基于边车代理的追踪

·基于边车代理的追踪是服务网格的专属方案,也是最理想的分布式追踪模型,对应用完全透明,无论是日志还是服务本身,都不会有任何变化;

边车代理本身对应用透明的工作原理,决定了它只能实现服务调用层面的追踪,像前面 Pinpoint 截图那样的本地方法调用级别的追踪诊断,边车代理是做不到的。

6.链路追踪协议

链路追踪协议的发展历史,2016 年 11 月,CNCF 技术委员会接受了 OpenTracing 作为基金会的第三个项目。OpenTracing 是一套与平台无关、与厂商无关、与语言无关的追踪协议规范。

但是,Google 却在这个时候出来并提出了与 OpenTracing 目标类似的 OpenCensus 规范,且得到了巨头 Microsoft 的支持,这样就形成了OpenTracing 和 OpenCensus两大可观测性的阵营。

2019 年,OpenTracing 和 OpenCensus 宣布握手言和,共同发布了可观测性的终极解决方案OpenTelemetry,并宣布会各自冻结 OpenTracing 和 OpenCensus 的发展。

6.1 OpenTracing

概述:OpenTracing是一个开放的API规范,旨在通过提供一套统一的接口,帮助开发人员能够在其应用中实现分布式追踪

和一般的规范标准不同,Opentracing 不是传输协议,消息格式层面上的规范标准,而是一种语言层面上的 API 标准。以 Go 语言为例,只要某链路追踪系统实现了 Opentracing 规定的接口(interface),符合Opentracing 定义的表现行为,那么就可以说该应用符合 Opentracing 标准。

官网:https://opentracing.io/

6.2 OpenCensus

OpenCensus为微服务和单体应用提供可观测性,通过追踪请求在服务之间传播并捕获关键的时间序列指标。其核心功能是从应用程序中收集追踪和指标,能够在本地显示并将其发送到任何分析工具(也称为“后端”)

官网:https://opencensus.io/

6.3 OpenTelemetry

官网:https://opentelemetry.io/

OpenTelemetry 可以用于从应用程序收集数据。它是一组工具、API 和 SDK 集合,我们可以使用它们来检测、生成、收集和导出遥测数据(指标、日志和追踪),以帮助分析应用的性能和行为。具体的解释为:

  • 一个可观测性框架和工具包,旨在创建和管理遥测数据,如追踪、指标和日志。
  • 与供应商和工具无关,这意味着它可以与各种可观测性后端一起使用,包括开源工具如Jaeger和Prometheus,以及商业产品。
  • 不是像Jaeger、Prometheus或其他商业供应商那样的可观测性后端。
  • 专注于遥测的生成、收集、管理和导出。OpenTelemetry的一个主要目标是能够轻松地在应用程序或系统中插桩,无论它们使用何种语言、基础设施或运行时环境。遥测的数据存储和可视化故意留给其他工具。

篇幅问题就不继续详细介绍这三个协议了,感兴趣的小伙伴们可以自行去官方了解。

总结:今天讲了链路追踪的理论知识,包括:追踪与跨度的概念,一个追踪系统的模块划分,数据收集的3种方式,以及链路追踪协议的发展。了解这些概念后再更容易去理解开源的链路追踪框架。

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
4月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
704 3
|
5月前
|
人工智能 Kubernetes 数据可视化
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
本文回顾了一次关键词监测任务在容器集群中失效的全过程,分析了中转IP复用、调度节奏和异常处理等隐性风险,并提出通过解耦架构、动态IP分发和行为模拟优化采集策略,最终实现稳定高效的数据抓取与分析。
Kubernetes下的分布式采集系统设计与实战:趋势监测失效引发的架构进化
|
2月前
|
缓存 Cloud Native 中间件
《聊聊分布式》从单体到分布式:电商系统架构演进之路
本文系统阐述了电商平台从单体到分布式架构的演进历程,剖析了单体架构的局限性与分布式架构的优势,结合淘宝、京东等真实案例,深入探讨了服务拆分、数据库分片、中间件体系等关键技术实践,并总结了渐进式迁移策略与核心经验,为大型应用架构升级提供了全面参考。
|
2月前
|
存储 NoSQL 前端开发
【赵渝强老师】MongoDB的分布式存储架构
MongoDB分片通过将数据分布到多台服务器,实现海量数据的高效存储与读写。其架构包含路由、配置服务器和分片服务器,支持水平扩展,结合复制集保障高可用性,适用于大规模生产环境。
276 1
|
8月前
|
人工智能 安全 Java
智慧工地源码,Java语言开发,微服务架构,支持分布式和集群部署,多端覆盖
智慧工地是“互联网+建筑工地”的创新模式,基于物联网、移动互联网、BIM、大数据、人工智能等技术,实现对施工现场人员、设备、材料、安全等环节的智能化管理。其解决方案涵盖数据大屏、移动APP和PC管理端,采用高性能Java微服务架构,支持分布式与集群部署,结合Redis、消息队列等技术确保系统稳定高效。通过大数据驱动决策、物联网实时监测预警及AI智能视频监控,消除数据孤岛,提升项目可控性与安全性。智慧工地提供专家级远程管理服务,助力施工质量和安全管理升级,同时依托可扩展平台、多端应用和丰富设备接口,满足多样化需求,推动建筑行业数字化转型。
278 5
|
3月前
|
消息中间件 缓存 监控
中间件架构设计与实践:构建高性能分布式系统的核心基石
摘要 本文系统探讨了中间件技术及其在分布式系统中的核心价值。作者首先定义了中间件作为连接系统组件的"神经网络",强调其在数据传输、系统稳定性和扩展性中的关键作用。随后详细分类了中间件体系,包括通信中间件(如RabbitMQ/Kafka)、数据中间件(如Redis/MyCAT)等类型。文章重点剖析了消息中间件的实现机制,通过Spring Boot代码示例展示了消息生产者的完整实现,涵盖消息ID生成、持久化、批量发送及重试机制等关键技术点。最后,作者指出中间件架构设计对系统性能的决定性影响,
|
6月前
|
监控 算法 关系型数据库
分布式事务难题终结:Seata+DRDS全局事务一致性架构设计
在分布式系统中,CAP定理限制了可用性、一致性与分区容错的三者兼得,尤其在网络分区时需做出取舍。为应对这一挑战,最终一致性方案成为常见选择。以电商订单系统为例,微服务化后,原本的本地事务演变为跨数据库的分布式事务,暴露出全局锁失效、事务边界模糊及协议差异等问题。本文深入探讨了基于 Seata 与 DRDS 的分布式事务解决方案,涵盖 AT 模式实践、分片策略优化、典型问题处理、性能调优及高级特性实现,结合实际业务场景提供可落地的技术路径与架构设计原则。通过压测验证,该方案在事务延迟、TPS 及失败率等方面均取得显著优化效果。
335 61
|
7月前
|
监控 Linux 应用服务中间件
Linux多节点多硬盘部署MinIO:分布式MinIO集群部署指南搭建高可用架构实践
通过以上步骤,已成功基于已有的 MinIO 服务,扩展为一个 MinIO 集群。该集群具有高可用性和容错性,适合生产环境使用。如果有任何问题,请检查日志或参考MinIO 官方文档。作者联系方式vx:2743642415。
2229 57
|
11月前
|
存储 缓存 NoSQL
分布式系统架构8:分布式缓存
本文介绍了分布式缓存的理论知识及Redis集群的应用,探讨了AP与CP的区别,Redis作为AP系统具备高性能和高可用性但不保证强一致性。文章还讲解了透明多级缓存(TMC)的概念及其优缺点,并详细分析了memcached和Redis的分布式实现方案。此外,针对缓存穿透、击穿、雪崩和污染等常见问题提供了应对策略,强调了Cache Aside模式在解决数据一致性方面的作用。最后指出,面试中关于缓存的问题多围绕Redis展开,建议深入学习相关知识点。
718 8
|
7月前
|
消息中间件 缓存 算法
分布式开发:数字时代的高性能架构革命-为什么要用分布式?优雅草卓伊凡
分布式开发:数字时代的高性能架构革命-为什么要用分布式?优雅草卓伊凡
337 0
分布式开发:数字时代的高性能架构革命-为什么要用分布式?优雅草卓伊凡

热门文章

最新文章