第 2 章 分布式追踪架构
2.1. 分布式追踪架构
每次用户在某个应用程序中执行一项操作时,一个请求都会在所在的系统上执行,而这个系统可能需要几十个不同服务的共同参与才可以做出相应的响应。Red Hat OpenShift distributed tracing 平台可让您执行分布式追踪,在组成一个应用程序的多个微服务间记录请求的路径。
分布式追踪是用来将不同工作单元的信息关联起来的技术,通常是在不同进程或主机中执行的,以便理解分布式事务中的整个事件链。开发人员可以视觉化在大型微服务架构中调用的流程。它对理解序列化、并行性和延迟来源有价值。
Red Hat OpenShift distributed tracing 平台记录了在微服务的整个堆栈间执行单个请求,并将其显示为 trace。trace是系统的数据/执行路径。一个端到端的 trace 由一个或者多个 span 组成。
span 代表 Red Hat OpenShift distributed tracing 平台中的逻辑工作单元,它包含操作名称、操作的开始时间和持续时间,以及可能的标签和日志。span 可能会被嵌套并排序以模拟因果关系。
2.1.1. 分布式追踪概述
作为服务所有者,您可以使用分布式追踪来检测您的服务,以收集与服务架构相关的信息。您可以使用 Red Hat OpenShift distributed tracing 平台来监控、网络性能分析,并对现代、云原生的微服务应用程序中组件间的交互进行故障排除。
使用分布式追踪平台,您可以执行以下功能:
- 监控分布式事务
- 优化性能和延迟时间
- 执行根原因分析
2.1.2. Red Hat OpenShift distributed tracing Platform 功能
Red Hat OpenShift distributed tracing 平台提供以下功能:
- 与 Kiali 集成 - 当正确配置时,您可以从 Kiali 控制台查看分布式追踪平台数据。
- 高可伸缩性 - 分布式追踪平台后端设计具有单一故障点,而且能够按照业务需求进行扩展。
- 分布式上下文发布 – 允许您通过不同的组件连接数据以创建完整的端到端的 trace。
- 与 Zipkin 的后向兼容性 - Red Hat OpenShift distributed tracing platform 有 API,它能将其用作 Zipkin 的简易替代品,但红帽在此发行版本中不支持 Zipkin 的兼容性。
2.1.3. Red Hat OpenShift distributed tracing Platform 架构
Red Hat OpenShift distributed tracing 平台由多个组件组成,它们一起收集、存储和显示追踪数据。
Red Hat OpenShift distributed tracing Platform (Tempo) - 此组件基于开源 Grafana Tempo 项目。
- 网关 - 网关处理身份验证、授权和将请求转发到分布式或查询前端服务。
-
Distributor - Distributor 接受多种格式(包括 Jaeger、OpenTelemetry 和 Zipkin)的 span。它通过哈希
traceID
并将分布式一致的哈希环路由到 Ingester。 - Ingester - Ingester 将 trace 批处理到块中,创建 bloom 过滤器和索引,然后将其全部刷新到后端。
- Query Frontend - Query Frontend 负责为传入的查询对搜索空间进行分片。然后,搜索查询会发送到 Queriers。Query Frontend 部署通过 Tempo Query sidecar 公开 Jaeger UI。
- Querier - Querier 负责在 Ingester 或后端存储中查找请求的 trace ID。根据参数,它可以查询 Ingesters,并从后端拉取 Bloom 索引,以便在对象存储中搜索块。
- compactor - Compactors 流块到后端存储中,以减少块总数。
红帽构建的 OpenTelemetry - 此组件基于开源 OpenTelemetry 项目。
- OpenTelemetry Collector - OpenTelemetry Collector 是一个与厂商无关的方式来接收、处理和导出遥测数据。OpenTelemetry Collector 支持开源可观察数据格式,如 Jaeger 和 Prometheus,发送到一个或多个开源或商业后端。Collector 是默认位置检测库来导出其遥测数据。
Red Hat OpenShift distributed tracing Platform (Jaeger) - 此组件基于开源 Jaeger 项目。
- 客户端 (Jaeger 客户端、跟踪器、报告程序、客户端库)- 分布式追踪平台 (Jaeger) 客户端是 OpenTracing API 的特定语言实施。它们可以用来为各种现有开源框架(如 Camel (Fuse) 、Spring Boot (RHOAR) 、MicroProfile (RHOAR/Thorntail) 、Wilfly (EAP) 等提供分布式追踪工具。
- 代理 (Jaeger 代理,Server Queue, Processor Workers)- 分布式追踪平台 (Jaeger) 代理是一个网络守护进程,侦听通过用户数据报协议(UDP)发送并发送到 Collector。这个代理应被放置在要管理的应用程序的同一主机上。这通常是通过容器环境(如 Kubernetes)中的 sidecar 来实现。
- Jaeger Collector (Collector, Queue, Workers)- 与 Jaeger 代理类似,Jaeger Collector 接收 span,并将它们放置在内部队列中进行处理。这允许 Jaeger Collector 立即返回到客户端/代理,而不是等待 span 变为存储。
- Storage (Data Store) - 收集器需要一个持久的存储后端。Red Hat OpenShift distributed tracing Platform (Jaeger) 提供了用于 span 存储的可插拔机制。Red Hat OpenShift distributed tracing Platform (Jaeger)支持 Elasticsearch 存储。
- Query (Query Service) - Query 是一个从存储中检索 trace 的服务。
- Ingester (Ingester Service)- Red Hat OpenShift distributed tracing 平台可以使用 Apache Kafka 作为 Collector 和实际的 Elasticsearch 后端存储之间的缓冲。Ingester 是一个从 Kafka 读取数据并写入 Elasticsearch 存储后端的服务。
- Jaeger 控制台 - 使用 Red Hat OpenShift distributed tracing 平台 (Jaeger) 用户界面,您可以视觉化您的分布式追踪数据。在搜索页面中,您可以查找 trace,并查看组成一个独立 trace 的 span 详情。