新書推薦:
《
乾隆制造
》
售價:NT$
398.0
《
资治通鉴臣光曰辑存 资治通鉴目录(司马光全集)(全二册)
》
售價:NT$
1316.0
《
明代社会变迁时期生活质量研究
》
售價:NT$
1367.0
《
律令国家与隋唐文明
》
售價:NT$
332.0
《
紫云村(史杰鹏笔下大唐小吏的生死逃亡,新历史主义小说见微之作,附赠5张与小说内容高度契合的宣纸彩插)
》
售價:NT$
449.0
《
现代吴语的研究(中华现代学术名著3)
》
售價:NT$
296.0
《
天下的当代性:世界秩序的实践与想象(新版)
》
售價:NT$
352.0
《
德国天才4:断裂与承续
》
售價:NT$
500.0
|
編輯推薦: |
谷歌(Google)和亚马逊(Amazon)等互联网巨头的崛起,开启了分布式系统在多个数据中心的数千个节点上运行的新时代。微服务则常常以指数级的规模增加了这种复杂性。调试这些系统、跟踪故障、检测瓶颈,甚至仅仅了解正在发生的事情都会变得更加困难。分布式跟踪专注于解决复杂分布式系统的这些问题。如今,分布式跟踪标准已经建立起来,我们有了更快的系统,使埋点变得不那么具有侵入性,数据变得更有价值。
Jaeger是一个流行的开源分布式跟踪系统,其创始人Yuri Shkuro在《掌握分布式跟踪:微服务和复杂系统性能分析》这本书中对其进行了全方位的讲述,包括回顾分布式跟踪的历史和理论基础;通过使用OpenTracing、W3C Trace Context和OpenCensus等开放标准提供的代码埋点技术,解决数据收集问题,并讨论了分布式跟踪基础设施的应用及其对理解和分析复杂系统带来的好处。
你将学到的东西:
■ 如何开始使用分布式跟踪系统
■ 如何从端到端跟踪中获得价值
■ 了解该领域的开放标准
■ 了解代码埋点和操作跟踪基础设施
■ 了解分布式跟踪在何处适合作为微服务的核心功能
|
內容簡介: |
本书是作者基于其在Uber跟踪团队担任技术主管时的个人经历而写的。本书分4部分共14章,内容包括:为什么需要分布式跟踪、跟踪一次HotROD之旅、分布式跟踪基础、OpenTracing的埋点基础、异步应用程序埋点、跟踪标准与生态系统、使用服务网格进行跟踪、关于采样、跟踪的价值、分布式上下文传播、集成指标与日志、通过数据挖掘提炼洞见、在大型组织中实施跟踪、分布式跟踪系统的底层架构。希望读者能通过本书了解分布式跟踪及其相关应用的基本原则和设计思路,从而找到将其应用到自己的项目和系统中的有效方法。本书的目标读者包括应用程序开发人员、SRE工程师、DevOps工程师、框架和基础设施开发人员、技术经理和管理人员、跟踪团队等。
|
關於作者: |
Yuri Shkuro是Uber的软件工程师,专注于分布式跟踪、可观察性、可靠性和性能领域的研究。他是Uber 跟踪团队的技术负责人。在加入Uber之前,Yuri曾在华尔街工作了15年,为投资银行、高盛、摩根大通和摩根士丹利的衍生业务构建了交易和风险管理系统。Yuri在开源社区中的贡献包括,成为OpenTracing项目的联合创始人,以及Jaeger(Uber开发的分布式跟踪平台)的创建者和技术领导者。以上两个项目都基于云原生技术基金会(CNCF,Cloud Native Computing Foundation)。Yuri也是W3C分布式跟踪工作组的特邀专家。
冯文辉,现任ThoughtWorks中国区资深架构咨询师,具有十四年的软件行业经验,曾服务于多个世界500强企业,覆盖银行、保险、通信、汽车、物流等行业。为客户提供敏捷开发、DevOps、架构设计与数字化转型等咨询服务。热衷于探索更好的架构设计方法,助力企业的数字化转型。译有《SRE生存指南:系统中断响应与正常运行时间优化》。
|
目錄:
|
I 引言 1
1 为什么需要分布式跟踪 2
微服务与云原生应用程序 3
什么是可观测性 5
微服务的可观测性挑战 7
传统的监控工具 9
指标 10
日志 11
分布式跟踪 12
我在跟踪领域的经历 14
为何编写本书 17
总结 18
参考资料 19
2 跟踪一次HotROD之旅 20
先决条件 21
从预打包的二进制文件运行 21
从Docker镜像运行 22
从源代码运行 22
启动Jaeger 24
初识HotROD 26
架构 29
数据流 30
上下文日志 32
span标记与日志 35
确定延迟的来源 37
资源使用属性 50
总结 53
参考资料 54
3 分布式跟踪基础 55
想法 56
请求相关性 56
黑盒推理 57
特定于域的模式 57
元数据传播 57
剖析分布式跟踪 59
采样 60
保留因果关系 60
请求间因果关系 62
跟踪模型 63
事件模型 63
span模型 65
时钟偏差调整 67
跟踪分析 69
总结 70
参考资料 70
Ⅱ 数据收集问题 73
4 OpenTracing的埋点基础 74
先决条件 76
项目源代码 76
Go开发环境 77
Java开发环境 78
Python开发环境 78
MySQL数据库 78
查询工具(curl或wget) 79
跟踪后端(Jaeger) 79
OpenTracing 80
练习1:Hello应用程序 83
用Go语言实现Hello应用程序 84
用Java语言实现Hello应用程序 88
用Python语言实现Hello应用程序 92
练结 94
练习2:个跟踪 94
步骤1:创建跟踪器实例 94
步骤2:启动span 99
步骤3:注释span 102
练结 107
练习3:跟踪函数和传递上下文 108
步骤1:跟踪单个函数 109
步骤2:将多个span合并为一个跟踪 111
步骤3:传播进程内上下文 115
练结 123
练习4:跟踪RPC请求 124
步骤1:拆解单体 124
步骤2:在进程之间传递上下文 127
步骤3:应用OpenTracing推荐的标记 136
练结 141
练习5:使用baggage 141
在Go中使用baggage 142
在Java中使用baggage 142
在Python中使用baggage 143
练结 143
练习6:自动埋点 143
Go中的开源埋点 144
Java中的自动埋点 146
Python中的自动埋点 148
练习7:额外练习 151
总结 151
参考资料 152
5 异步应用程序埋点 153
先决条件 154
项目源代码 154
Java 开发环境 155
Kafka、ZooKeeper、Redis与Jaeger 155
Tracing Talk聊天应用程序 156
实现 158
运行应用程序 162
观察跟踪 163
使用OpenTracing埋点 166
Spring埋点 167
tracer resolver 167
Redis埋点 168
Kafka埋点 170
埋点异步代码 178
总结 183
参考资料 183
6 跟踪标准与生态系统 184
埋点形式 185
分析跟踪部署和互操作性 188
跟踪的五种含义 190
了解受众 192
生态系统 193
跟踪系统 193
X-Ray、Stackdriver等 194
标准项目 194
总结 200
参考资料 201
7 使用服务网格进行跟踪 202
服务网格 203
服务网格的可观测性 206
先决条件 207
项目源代码 207
Java开发环境 208
Kubernetes 208
Istio 208
Hello应用程序 210
使用Istio进行分布式跟踪 213
使用Istio生成服务图 223
分布式上下文和路由 225
总结 228
参考资料 228
8 关于采样 230
基于头部的一致性采样 231
概率采样 231
速率限制采样 232
保证吞吐量的概率采样 234
自适应采样 235
上下文敏感的采样 244
实时采样或调试采样 244
如何处理过采样 247
基于尾部的一致性采样 249
部分采样 253
总结 253
参考资料 253
Ⅲ 从跟踪中获取价值 255
9 跟踪的价值 256
作为知识库的跟踪 257
服务图 257
深度,路径感知服务图 259
检测架构问题 262
性能分析 263
关键路径分析 263
识别跟踪模式 265
范例 269
延迟直方图 271
长期性能分析 273
总结 273
参考资料 274
10 分布式上下文传播 275
布朗跟踪平面 276
Pivot Tracing 280
混沌工程 283
流量标记 285
生产环境测试 286
生产环境调试 287
在生产环境中进行开发 288
总结 289
参考资料 289
11 集成指标与日志 291
可观测性的三大支柱 292
先决条件 294
项目源代码 294
Java开发环境 295
在Docker中运行服务器 295
在Kibana中声明索引模式 296
运行客户端 297
Hello应用程序 298
与指标集成 299
通过跟踪埋点实现标准指标 299
向标准指标中添加上下文 303
上下文感知的指标API 308
与日志集成 309
结构化日志记录 309
将日志与跟踪上下文关联起来 311
上下文感知的日志API 316
在跟踪系统中捕获日志 316
是否需要单独的日志记录和跟踪后端 318
总结 319
参考资料 320
12 通过数据挖掘提炼洞见 321
特征提取 322
数据挖掘管道的组件 323
跟踪后端 324
跟踪完成触发器 324
特征提取器 325
聚合器 326
特征提取练习 326
先决条件 328
项目源代码 328
在Docker中运行服务器 329
在Elasticsearch中定义索引映射 330
Java开发环境 331
微服务模拟器 331
在Kibana中定义索引模式 334
span计数作业 336
跟踪完成触发器 338
特征提取器 340
观测趋势 341
谨防推断 349
历史分析 350
实时分析 350
总结 353
参考资料 353
Ⅳ 部署和维护跟踪基础设施 355
13 在大型组织中实施跟踪 356
为什么很难部署跟踪埋点 357
减少采用障碍 358
标准框架 359
内部适配器库 360
默认启用跟踪 361
monorepo 361
与现有的基础设施集成 362
从哪里开始 362
构建文化 364
解释价值 364
与开发人员工作流集成 365
跟踪质量指标 366
故障排除指南 369
跳出关键路径 369
总结 369
参考资料 370
14 分布式跟踪系统的底层架构 371
为什么需要自己“造轮子” 372
定制和集成 372
带宽成本 372
把控数据 373
押注新兴标准 373
架构和部署模式 374
基本架构:代理 收集器 查询服务 374
流式架构 377
多租户 378
安全 381
在多个数据中心运行 382
监控和故障诊断 384
弹性 386
过采样 386
调试跟踪 387
数据中心故障转移导致的流量峰值 387
无休止的跟踪 387
长跟踪 388
总结 388
参考资料 388
后记 390
参考资料 393
|
內容試閱:
|
前言
分布式跟踪,也被称为端到端跟踪,虽然它不是一个新概念,但作为复杂分布式系统的可观测性工具,受到广泛关注。与大多数仅监控系统架构内单个组件(如进程或服务器)的工具不同,分布式跟踪通过观测跨进程和网络的各个请求或事务的端到端执行发挥着不可替代的作用。随着微服务和函数即服务(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。
强烈建议你不仅要尝试运行书中所提供的示例,还要尝试将它们应用到自己的应用程序中。我曾不止一次地看到,工程师仅仅通过从他们的应用程序中查看简单的样本跟踪就发现了愚蠢的错误。我常常惊讶于跟踪所提供的对系统行为的可见性。如果这是你次接触这项技术,那么你应该对自己的应用程序埋点,而不仅仅是运行本书中提供的示例代码,这才是学习和领会跟踪技术的有效方法。
|
|