前言
分布式跟踪,也被称为端到端跟踪,虽然它不是一个新概念,但作为复杂分布式系统必备的可观测性工具,受到广泛关注。与大多数仅监控系统架构内单个组件(如进程或服务器)的工具不同,分布式跟踪通过观测跨进程和网络的各个请求或事务的端到端执行发挥着不可替代的作用。随着微服务和函数即服务(FaaS或Serverless)等架构模式的兴起,分布式跟踪正成为管理现代架构复杂性的唯一实用方法。
你将要阅读的这本书是基于我在Uber跟踪团队担任技术主管时的个人经历而写的。在那段时间里,我看到我们的工程师团队规模越来越大,工程师人数从几百名发展到数千名,当我们首次推出分布式跟踪平台Jaeger时,Uber基于微服务架构的复杂性也越来越高,从几百个微服务增加到了数千个微服务。大多数从事分布式跟踪的工作者都会告诉你,构建跟踪系统是最轻而易举的,在一个大型组织中广泛推广它才算是真正意义上的挑战。然而遗憾的是,构建跟踪系统没有捷径。本书对此问题进行了全面的概述,其中包括技术发展史和理论基础,如何埋点和应对组织推广时遇到的挑战,业界关于埋点和数据格式的标准,以及在实际场景中部署和维护跟踪基础设施的实用建议。
这本书不是任何特定技术的参考资料或教程。相反,我希望你能通过本书了解分布式跟踪及其相关应用的基本原则和设计思路。有了这些基础知识,你应该能够在这个相当复杂的技术领域中继续探索,并找到将其应用到自己的项目和系统中的有效方法。
本书的目标读者
我希望这本书能够为大部分读者提供帮助,从对分布式跟踪知之甚少的初学者,到希望扩展知识并从其跟踪平台中获取更多价值的积极实践者。本书中的内容可能会调动起以下这些读者的兴趣。
应用程序开发人员、SRE工程师和DevOps工程师,他们是对分布式跟踪感兴趣的主要人群。他们通常对跟踪基础设施和埋点的工作方式不太感兴趣,他们更感兴趣的是技术可以为日常工作带来些什么。本书提供了许多示例用来说明分布式跟踪的好处,从最简单的“让我们来研究一个跟踪场景,看看它能帮助我们发现什么性能问题”,到“如何处理收集到的大量数据并借此深入了解分布式系统的行为,这些行为无法从单个事务中推断出来”。
框架和基础设施开发人员,他们通常要为其他开发人员构建库和工具,并希望通过与分布式跟踪进行集成来使这些工具变得可被观测。他们会对埋点技术和模式有全面的理解,也会对新出现的跟踪标准进行讨论,并从中受益。
技术经理和管理人员,他们通常掌握着财权,需要理解并确信跟踪技术为组织带来的价值。
跟踪团队,即负责在组织中构建、部署和运维跟踪基础设施的工程师团队。如果这个团队想扩大他们在整个组织中的影响力,他们必须更加努力地提升自己的技能,以应对技术和组织带来的不同挑战。
本书覆盖的内容
第Ⅰ部分,引言,对分布式跟踪领域进行了概述。
第1章,为什么需要分布式跟踪,阐述了分布式跟踪解决的可观测性问题,并解释了在复杂的分布式系统中解决无法解释的问题时,其他监控工具为何表现不足。这一章简要介绍了我在跟踪领域的从业经历,并解释了为什么我觉得写这本书会对整个行业有所帮助。
第2章,跟踪一次HotROD之旅,用一个简单明了的实践案例来说明分布式跟踪的核心特性、优势和功能,我们会借助Jaeger(一个开源的跟踪平台)、OpenTracing埋点和演示应用程序HotROD(按需搭建)进行说明。
第3章,分布式跟踪基础,回顾端到端跟踪的基本工作原理,例如因果关系跟踪和元数据传播,以及历史上各种技术实现所基于的不同设计决策,这些决策会影响跟踪架构能够解决的问题类型。本章向读者介绍了两种不同的跟踪模型,即:更具表现力的事件模型和更流行的span模型。
第Ⅱ部分,数据收集问题,专门讨论如何通过手动埋点和自动(基于代理的)埋点,从RPC和异步(如使用消息队列)应用程序中获取跟踪数据。
第4章,OpenTracing的埋点基础,一般的程序都是基于一个简单的“Hello,World!”风格的应用程序发展起来的,比如从单体架构发展为微服务系统。我们可以根据一个循序渐进的指南对这个系统进行手动埋点,从而实现跟踪,同时提供三种流行语言——Go、Java和Python的实例。本章基于OpenTracing API介绍跟踪埋点的基本原理,其对于其他工具API也同样适用。在最后的练习中,本章介绍了自动(基于代理的)埋点模式,在该模式下几乎不需要修改应用程序中的代码(如果有修改的话也是非常少的)。
第5章,异步应用程序埋点,本章将继续第4章的主题,并将其应用于使用Apache Kafka的异步消息构建的“在线聊天”应用程序中。
第6章,跟踪标准与生态系统,探索在跟踪行业中经常混淆的系统,包括新兴的标准,如OpenTracing、W3C Trace Context和OpenCensus。本章提供了一个有用的分类法,用以考量不同的商业项目和开源项目,以及它们之间的相互关系。
第7章,使用服务网格进行跟踪,使用在Kubernetes上运行的服务网格工具Istio跟踪应用程序,并将结果与通过OpenTracking API埋点得到的跟踪结果进行比较,阐明每种方法的优缺点。
第8章,关于采样,解释了为什么跟踪平台经常需要对事务进行采样,并深入论述了不同的采样技术,从一致的基于头部的采样策略(概率、速率限制、自适应等),到新兴的最受欢迎的基于尾部的采样。
第Ⅲ部分,从跟踪中获取价值,讨论了工程师和组织从采用分布式跟踪解决方案中获益的不同方式。
第9章,跟踪的价值,通过示例给出跟踪的核心价值主张,涵盖了大多数跟踪解决方案中常见的功能,如服务图、关键路径分析、跟踪模式下的性能分析、延迟柱状图和示例,以及长期优化技术。
第10章,分布式上下文传播,讨论了上下文传播,这是一种支持大多数现有跟踪基础设施的技术。上下文传播涵盖了来自Brown University的跟踪平面,该平面为上下文传播实现了一个通用的、与工具无关的框架,并涵盖了许多在上下文传播和跟踪之上构建的用于可观测性和混沌工程的技术与工具。
第11章,集成指标与日志,展示了传统监控工具如何不丢失所有信息,以及如何将它们与跟踪基础设施结合起来,从而赋予其新的功能,并使其在微服务环境中更有用。
第12章,通过数据挖掘提炼洞见,首先从数据挖掘的基础知识和跟踪数据的特征提取开始讲解,然后介绍了一个涉及Jaeger后端、Apache Kafka、Elasticsearch、Kibana、Apache Flink数据挖掘作业和微服务模拟器microsim的实际例子,最后讨论了数据挖掘技术的进一步发展,如推断和观测趋势,以及历史数据和实时数据分析。
第Ⅳ部分,部署和维护跟踪基础设施,向跟踪团队提供关于在大型组织中实现和维护跟踪平台的各种实用建议。
第13章,在大型组织中实施跟踪,讨论了如何解决阻碍分布式跟踪在企业中广泛应用或价值最大化的技术问题和组织问题。
第14章,分布式跟踪系统的底层架构,首先简要讨论了在构建架构时需要考虑的因素,然后深入讨论了跟踪平台的体系架构和部署模式的技术细节,如多租户、安全性、多数据中心的操作、监控和弹性。本章基于Jaeger项目介绍了许多体系架构的构建决策,但总体而言,内容适用于大多数跟踪基础设施构建。
如何充分利用本书
本书适合有兴趣解决复杂分布式系统中的可观测性问题的广大读者。熟悉现有的监控工具(如度量指标)对阅读本书会有帮助,但不是必需的。大多数代码示例都是用Java编写的,因此需要读者能读懂基本的Java代码。
本书中的练习大量使用了Docker和docker-compose来解决各种第三方依赖关系,比如MySQL和Elasticsearch数据库、Kafka和ZooKeeper,以及各种可观测性工具,如Jaeger、Kibana、Grafana和Prometheus。要运行大多数示例,需要安装Docker。
强烈建议你不仅要尝试运行书中所提供的示例,还要尝试将它们应用到自己的应用程序中。我曾不止一次地看到,工程师仅仅通过从他们的应用程序中查看简单的样本跟踪就发现了愚蠢的错误。我常常惊讶于跟踪所提供的对系统行为的可见性。如果这是你第一次接触这项技术,那么你应该对自己的应用程序埋点,而不仅仅是运行本书中提供的示例代码,这才是学习和领会跟踪技术的最有效方法。