分布式追踪系统zipkin介绍

简介: 分布式追踪系统zipkin介绍

在前一期我们简单的介绍了作为分布式追踪系统的zipkin,并以一个demo简单演示了zipkin的使用,本文我们来从整体介绍一下zipkin的技术架构,以期能够更好的理解和使用zipkin。

一、理论基础

zipkin的理论基础是Google在2010年发表的论文《Dapper,a Large-Scale Distributed Systems Tracing Infrastructure》,这篇论文的原型是Google开源的Dapper链路追踪组件,这篇文章在业内链路追踪领域可谓是最经典的理论指导了,具有非常大的学习参考意义,建议有时间的朋友可以好好读一读。

基于链路追踪的一些理论基础,市场上出现了很多优秀的链路追踪组件,除了Google Dapper,如本文的主角Twitter Zipkin,阿里的EagleEye,华为(apache)的SkyWalking等。

这些链路追踪组件的出现有一个共同的原因:现代微服务框架的盛行,导致服务件调用问题排查的困难。

二、架构组成

回到本文的主角zipkin,一起来剖析一下zipkin的架构。如下图所示,zipkin包含4个组件,分别负责不同的功能:

网络异常,图片无法展示
|

1、collector

zipkin collector是zipkin的一个常驻进程组件,负责提供对外部的接口用以收集、校验和存储、索引追踪数据。

2、storage

存储模块,真正服务zipkin收集到的追踪数据的存储,zipkin默认存储在内存中,目前主要支持Cassandra、Elasticsearch和MySQL,对于这些存储源的支持都是可插拔的。

3、search

search组件提供的是查询服务,追踪数据被存储和索引以后就需要提供对外的查询服务,zipkin提供的JSON API用于数据检索。

4、web UI

zipkin提供了简洁而又直观的web UI用于进行数据的检索和调用链路展示,可以通过trace ID以及其他的条件来过滤查询,在页面上展示调用链路上各个节点所消耗的时间,方便用于判断性能瓶颈。

以上可以看到,其实zipkin的架构组成是比较简单的,部署亦并不复杂。架构简单、部署方便、存储插拔可选、UI简洁高效,这也是会被广泛应用的原因。

二、数据收集流程

在zipkin中每一次请求链路的追踪都是一个Trace,通过一个trace ID来标志。每个Trace可以拆分为有若干个存在依赖关系的Span,在微服务的架构下,一般请求会涉及到多个服务之间的调用或者是服务与中间件之间的交互,这里的每次请求调用就可以理解为一个Span,因此Span是一个树形的结构,每个Span都记录了相关的信息,使用一个64位的ID对一个Span进行标志。

Span通常包含其他的信息,如时间戳、parent id、annotation等信息。

  • Trace
    Span的集合,表示一次调用链路,使用traceId唯一标志。
  • Annotation
    记录请求特定事件信息,例如记录链路上各节点的时间,一般有以下几个分类:
    1、cs(Client Start):客户端发起了请求
    2、sr(Server Receive):服务端收到了请求
    3、ss(Server Send):服务端返回处理结果给客户端
    4、cr(Client Received):客户端收到服务端的响应

数据来源通常称为reporter,一般来说reporter由应用程序集成zipkin提供的客户端包来实现,数据的发送是轻量和异步的,不会阻塞应用程序的运行,对应用程序的负载很小。

在普通的请求传递时zipkin不会发送独立的请求收集详细的数据,而是在请求头中添加一些参数,例如,下图所示,添加trace请求头:

X-B3-TraceId: aa

X-B3-SpanId: 6b

在最终收到响应之后,异步的发送span详情到zipkin collector,由于是异步的,不会导致原业务代码的延迟。

三、流行的客户端组件

zipkin支持多语言和多场景,官方有很多流行的语言支持,例如:java语言中的brave,JavaScript语言中的zipkin-js。

社区也提供了很多的支持,例如Go语言的go-zipkin,Python语言的py_zipkin,Scala语言的kamon-zipkin等等,zipkin有非常好的社区支持生态。

四、使用brave向zipkin上报数据

业界针对常见的java应用程序框架提供了开源的分布式追踪组件brave,brave提供了面向Standard Servlet、Spring MVC、Http Client、JAX RS、Jersey、MySQL等接口集成能力,通过简单的配置就可以完成向zipkin上报数据的功能,无需对代码有过多的侵入。

同时zipkin提供了扩展的能力,当标准的功能无法满足需要时,可以通过接口进行扩展。

默认情况下,Brave将收集到的数据打印在日志中,当需要向zipkin报告数据时,需要引入zipkin 的Reporter,Reporter会将数据异步发送到zipkin Collector。

五、增加Log4j支持

appender.console.layout.pattern=%d{ABSOLUTE}[%X{traceId}/%X{spanId}] %-5p[%t]%C{2}{%F:%L}-%m%n
LocalSpanAPI.start("localA")'...LocalSpanAPI.finish();


相关实践学习
分布式链路追踪Skywalking
Skywalking是一个基于分布式跟踪的应用程序性能监控系统,用于从服务和云原生等基础设施中收集、分析、聚合以及可视化数据,提供了一种简便的方式来清晰地观测分布式系统,具有分布式追踪、性能指标分析、应用和服务依赖分析等功能。 分布式追踪系统发展很快,种类繁多,给我们带来很大的方便。但在数据采集过程中,有时需要侵入用户代码,并且不同系统的 API 并不兼容,这就导致了如果希望切换追踪系统,往往会带来较大改动。OpenTracing为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范。OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。Skywalking基于OpenTracing规范开发,具有性能好,支持多语言探针,无侵入性等优势,可以帮助我们准确快速的定位到线上故障和性能瓶颈。 在本套课程中,我们将全面的讲解Skywalking相关的知识。从APM系统、分布式调用链等基础概念的学习加深对Skywalking的理解,从0开始搭建一套完整的Skywalking环境,学会对各类应用进行监控,学习Skywalking常用插件。Skywalking原理章节中,将会对Skywalking使用的agent探针技术进行深度剖析,除此之外还会对OpenTracing规范作整体上的介绍。通过对本套课程的学习,不止能学会如何使用Skywalking,还将对其底层原理和分布式架构有更深的理解。本课程由黑马程序员提供。
相关文章
|
9月前
|
Kubernetes 大数据 调度
Airflow vs Argo Workflows:分布式任务调度系统的“华山论剑”
本文对比了Apache Airflow与Argo Workflows两大分布式任务调度系统。两者均支持复杂的DAG任务编排、社区支持及任务调度功能,且具备优秀的用户界面。Airflow以Python为核心语言,适合数据科学家使用,拥有丰富的Operator库和云服务集成能力;而Argo Workflows基于Kubernetes设计,支持YAML和Python双语定义工作流,具备轻量化、高性能并发调度的优势,并通过Kubernetes的RBAC机制实现多用户隔离。在大数据和AI场景中,Airflow擅长结合云厂商服务,Argo则更适配Kubernetes生态下的深度集成。
1128 34
|
5月前
|
存储 算法 安全
“卧槽,系统又崩了!”——别慌,这也许是你看过最通俗易懂的分布式入门
本文深入解析分布式系统核心机制:数据分片与冗余副本实现扩展与高可用,租约、多数派及Gossip协议保障一致性与容错。探讨节点故障、网络延迟等挑战,揭示CFT/BFT容错原理,剖析规模与性能关系,为构建可靠分布式系统提供理论支撑。
301 2
|
5月前
|
机器学习/深度学习 算法 安全
新型电力系统下多分布式电源接入配电网承载力评估方法研究(Matlab代码实现)
新型电力系统下多分布式电源接入配电网承载力评估方法研究(Matlab代码实现)
199 3
|
7月前
|
数据采集 缓存 NoSQL
分布式新闻数据采集系统的同步效率优化实战
本文介绍了一个针对高频新闻站点的分布式爬虫系统优化方案。通过引入异步任务机制、本地缓存池、Redis pipeline 批量写入及身份池策略,系统采集效率提升近两倍,数据同步延迟显著降低,实现了分钟级热点追踪能力,为实时舆情监控与分析提供了高效、稳定的数据支持。
326 1
分布式新闻数据采集系统的同步效率优化实战
|
存储 运维 安全
盘古分布式存储系统的稳定性实践
本文介绍了阿里云飞天盘古分布式存储系统的稳定性实践。盘古作为阿里云的核心组件,支撑了阿里巴巴集团的众多业务,确保数据高可靠性、系统高可用性和安全生产运维是其关键目标。文章详细探讨了数据不丢不错、系统高可用性的实现方法,以及通过故障演练、自动化发布和健康检查等手段保障生产安全。总结指出,稳定性是一项系统工程,需要持续迭代演进,盘古经过十年以上的线上锤炼,积累了丰富的实践经验。
1080 7
|
存储 分布式计算 Hadoop
基于Java的Hadoop文件处理系统:高效分布式数据解析与存储
本文介绍了如何借鉴Hadoop的设计思想,使用Java实现其核心功能MapReduce,解决海量数据处理问题。通过类比图书馆管理系统,详细解释了Hadoop的两大组件:HDFS(分布式文件系统)和MapReduce(分布式计算模型)。具体实现了单词统计任务,并扩展支持CSV和JSON格式的数据解析。为了提升性能,引入了Combiner减少中间数据传输,以及自定义Partitioner解决数据倾斜问题。最后总结了Hadoop在大数据处理中的重要性,鼓励Java开发者学习Hadoop以拓展技术边界。
455 7
|
机器学习/深度学习 存储 运维
分布式机器学习系统:设计原理、优化策略与实践经验
本文详细探讨了分布式机器学习系统的发展现状与挑战,重点分析了数据并行、模型并行等核心训练范式,以及参数服务器、优化器等关键组件的设计与实现。文章还深入讨论了混合精度训练、梯度累积、ZeRO优化器等高级特性,旨在提供一套全面的技术解决方案,以应对超大规模模型训练中的计算、存储及通信挑战。
782 4
|
6月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
470 2
|
6月前
|
存储 缓存 NoSQL
【📕分布式锁通关指南 12】源码剖析redisson如何利用Redis数据结构实现Semaphore和CountDownLatch
本文解析 Redisson 如何通过 Redis 实现分布式信号量(RSemaphore)与倒数闩(RCountDownLatch),利用 Lua 脚本与原子操作保障分布式环境下的同步控制,帮助开发者更好地理解其原理与应用。
421 6
|
7月前
|
存储 缓存 NoSQL
Redis核心数据结构与分布式锁实现详解
Redis 是高性能键值数据库,支持多种数据结构,如字符串、列表、集合、哈希、有序集合等,广泛用于缓存、消息队列和实时数据处理。本文详解其核心数据结构及分布式锁实现,帮助开发者提升系统性能与并发控制能力。

热门文章

最新文章