diff --git a/Observability/tracing.md b/Observability/tracing.md index 6ed470b0..e74ad4ee 100644 --- a/Observability/tracing.md +++ b/Observability/tracing.md @@ -9,6 +9,8 @@ 分布式链路追踪诞生的标志性事件就是 Google Dapper 论文的发表。2010年4月,Benjamin H. Sigelman 等人在 Google Technical Report 上发表了《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》[^2]论文,文中详细阐述了 Google 内部分布式链路追踪系统 Dapper 的设计理念,还提出了成为后续链路追踪系统设计共识的两个基础术语 Trace(追踪)和 Span(跨度)。 +受 Dapper 思想和协议的影响,市场上开始出现大量的链路追踪项目。 + ## Trace 和 Span 一条 Trace 代表一次入口请求在 IT 系统内的完整调用轨迹及其关联数据集合。其中,全局唯一的链路标识 TraceId 是代表性的一个属性,通过 TraceId 我们才能将同一个请求分散在不同节点的链路数据准确的关联起来,实现请求粒度的“确定性关联”。 @@ -28,7 +30,7 @@ Span 代表系统中一个逻辑运行单元,Span 之间通过嵌套或者顺
Trace 和 Spans
-总结分布式链路追踪的原理就是在分布式应用的接口方法中设置一些观察点,在入口节点给每个请求分配一个全局唯一的标识 TraceId,当请求流经这些观察点时就会记录一条对应的链路日志(Span)。最后通过 TraceId 将一次请求的所有链路日志进行组装,就能还原出该次请求的链路轨迹。 +总结分布式链路追踪的原理就是在分布式应用的接口方法中设置一些观察点,在入口节点给每个请求分配一个全局唯一的标识 TraceId,当请求流经这些观察点时就会记录一条对应的链路日志(Span),最后通过 TraceId 将一次请求的所有链路日志进行组装,就能还原出该次请求的链路轨迹。 如图所示,根据拓扑图中 Span 记录的时间信息和响应结果,我们就可以定位到出错或者缓慢的服务。 @@ -39,32 +41,34 @@ Span 代表系统中一个逻辑运行单元,Span 之间通过嵌套或者顺 ## 追踪技术的核心 -实现追踪的核心技术是方法增强(通常也称为埋点,指的是在代码中插入额外的逻辑来捕获和记录执行信息)。Dapper 的论文中提出的设计原则要求方法增强必须满足应用级透明性和低开销着两个关键条件。 +与日志不同,日志的采集和业务完全隔离。链路追踪需要获取更内部的信息,链路追踪的代码就要与业务代码耦合在一起。微服务的架构已经糅杂了一堆治理 SDK,再加上链路追踪逻辑,技术复杂度对开发人员的影响可想而知。 + +链路追踪技术使用方法增强(通常也称为埋点)解决业务隔离的问题。指的是在代码中插入额外的逻辑来捕获和记录执行信息,这是实现追踪的核心技术。Dapper 的论文中提出的设计原则要求方法增强必须满足应用级透明性和低开销着两个关键条件。 - 应用级透明:开发者不需要修改业务代码或者仅需要极少的修改即可实现埋点,这意味着追踪逻辑对应用层不可见或者几乎不可见。 -- 低开销: +- 低开销:埋点操作对系统的性能影响应当尽可能小,以避免追踪逻辑本身成为系统性能的瓶颈。 +保证应用级透明有两种方式,基于服务的追踪是目前最为常见的追踪实现方式,被 Zipkin、SkyWalking、Pinpoint 等主流追踪系统广泛采用。基于服务追踪的实现思路是通过某些手段给目标应用注入追踪探针(Probe),譬如针对 Java 应用,一般就通过 Java Agent 注入。 -**2.基于服务的追踪**,基于服务的追踪是目前最为常见的追踪实现方式,被 Zipkin、SkyWalking、Pinpoint 等主流追踪系统广泛采用。基于服务追踪的实现思路是通过某些手段给目标应用注入追踪探针(Probe),譬如针对 Java 应用,一般就通过 Java Agent 注入。 +:::tip 探针 探针可以看做是一个寄生在目标服务身上的一个小型微服务系统,它一般会有自己的专用服务注册、心跳检测等功能,有专门的数据收集协议,可以把从目标系统监控得到的服务调用信息,通过另一次独立的 HTTP 或者 RPC 请求发送给追踪系统。 +::: 因此,基于服务方式的追踪系统会比基于日志的追踪消耗更多的资源,也具有更强的侵入性,而换来的收益就是追踪的精确性和稳定性都有保证,不必再依靠日志归集来传输跟踪数据。 - -**3.基于边车代理的追踪**,服务网格的专属方案,也是最理想的分布式追踪模型,边车代理对应用完全透明,有自己独立数据通道,追踪数据通过控制平面上报,无论对日志服务本身还是,都不会有依赖和干扰;它与程序语言无法,无论应用采用什么编程语言,只要它通过网络(HTTP或 gRPC)访问服务,就可以被追踪到。如果非要总结种方式的实现有什么缺点,就是边车代理本身对应用透明的原理,决定了它只能实现服务调用层面的追踪。 +**基于边车代理的追踪**,服务网格的专属方案,也是最理想的分布式追踪模型,边车代理对应用完全透明,有自己独立数据通道,追踪数据通过控制平面上报,无论对日志服务本身还是,都不会有依赖和干扰;它与程序语言无法,无论应用采用什么编程语言,只要它通过网络(HTTP或 gRPC)访问服务,就可以被追踪到。如果非要总结种方式的实现有什么缺点,就是边车代理本身对应用透明的原理,决定了它只能实现服务调用层面的追踪。 现在,市场占有率最高的 Envoy 就提供了完善的追踪功能,但没有提供自己的界面端和存储端,需要配合专门的 UI 与存储系统来使用,不过 SkyWalking、Zipkin、Jaeger 等系统都可以接受来自 Envoy 的追踪数据。 - - ## 代表性项目 在没有形成大一统标准的早期,Dapper 的思想和协议影响了大量的开源项目。受到 Dapper 的启发,Twitter 开发了自己的分布式追踪系统 Zipkin,Zipkin 是第一个被广泛采用的开源的分布式链路追踪系统,提供了数据收集、存储和查询的功能以及友好的 UI 界面来展示追踪信息。 2017年 Uber 在基于 Zipkin 思想和经验的基础上开源了 Jaeger,增加了自适应采样、提供了更加强大和灵活的查询能力等,后来 Jaeger 成为 CNCF 的托管项目,并在 2019年 成为 graduated 级别。即使在今天,Zipkin 和 Jaeger 仍然是最流行的分布式追踪工具之一。 -Zipkin 和 Jaeger 或多或少都对业务代码有侵入性,国内的工程师应该熟悉一款基于字节码注入具有无侵入性特点的 Skywalking ,这是一款本土开源的的调用链分析以及应用监控分析工具,特点是支持多种插件,UI 功能较强,接入端无代码侵入(Java Agent 技术)。 +国内的工程师应该非常熟悉 Skywalking,这是一款本土开源的的调用链分析以及应用监控分析工具,特点是支持多种插件,UI 功能较强,接入端无代码侵入(Java Agent 技术)。Skywalking 提供了自动插桩的能力,通过 Java Agent 技术在运行时不侵入地修改字节码,插入追踪代码。这种方式对业务代码完全透明,开发者无需修改任何业务逻辑即可实现埋点。 + ## Opentracing diff --git a/ServiceMesh/overview.md b/ServiceMesh/overview.md index cfb9bb7c..088843e6 100644 --- a/ServiceMesh/overview.md +++ b/ServiceMesh/overview.md @@ -1,15 +1,22 @@ # 8.2 服务网格的产品与生态 -2016年1月,Buoyant 公司发布了第一代 ServiceMesh 产品 Linkerd。初次发布的 Linkerd 以 Scala 编写,绝大部分关注点都是如何做好 proxy(代理) 并完成一些通用控制面的功能。同期专注于 proxy 领域的还有一个重量级选手 Envoy,Envoy 是 CNCF 内继 Kubernetes、Prometheus 第三个孵化成熟的项目,由 Lyft 公司基于 C++ 开发,特点为性能出色、功能丰富、生态成熟。初代的 ServiceMesh 虽然理念美好,但以 sidecar 为核心存在不少缺陷:特别是 Linkerd,其明显的资源消耗、性能影响广受诟病;其二仅限于数据层面的代理功能时,当大量部署 sidecar 以后,并没有充分考虑如何管理和控制这些 sidecar。 +2016年1月,Buoyant 公司发布了第一代 ServiceMesh 产品 Linkerd。初次发布的 Linkerd 以 Scala 编写,绝大部分关注点都是如何做好 proxy(代理) 并完成一些通用控制面的功能。同期专注于 proxy 领域的还有一个重量级选手 Envoy,Envoy 由 Lyft 公司基于 C++ 开发,特点为性能出色、功能丰富、生态成熟,是 CNCF 内继 Kubernetes、Prometheus 第三个孵化成熟的项目。初代的 ServiceMesh 虽然理念美好,但以 Sidecar 为核心存在不少缺陷,特别是 Linkerd,其明显的资源消耗、性能影响广受诟病,其二仅限于数据层面的代理功能时,当大量部署 Sidecar 以后,并没有充分考虑如何管理和控制这些 Sidecar。 于是,第二代 Service Mesh 应运而生。2017年5月,Google、IBM、Lyft 宣布新一代的服务网格 Istio 开源,有巨头背书以及**新增控制平面的设计理念**让 Istio 得到极大关注和发展,并迅速成为 ServiceMesh 的代表产品。 +Istio 最大的创新在于它为 ServiceMesh 带来前所未有的控制力:以Sidercar 方式部署的 ServiceMesh 控制服务间所有的流量,Istio 增加控制面板来控制系统中所有的 Sidecar。以此,Istio 便控制系统中所有请求的发送,也即控制了所有的流量。 +Linkerd 架构
Linkerd 架构
+