一小时玩转分布式链路追踪系统Skywalking

212 阅读13分钟

一小时玩转分布式链路追踪系统Skywalking

视频地址:www.bilibili.com/video/BV16r…

image.png

一小时玩转分布式链路追踪系统Skywalking****

大家下午好,欢迎来到马哥教育直播间。今天下午将为大家分享微服务中常见的组件——链路追踪系统Skywalking。若企业中微服务应用较为普及,相信大家对它并不陌生。接下来的一小时,我们将较为系统地讲解该软件,涵盖工作原理、构建方式、部署方法以及具体使用。

(一)一、讲师介绍****

我是马哥教育的老师王小春。我拥有一些相关证书,阿里云大学上有我之前的基础课程视频,虽有些陈旧,但用于入门学习还是足够的。我有20多年IT工作经验,早期便从事Linux方面的工作,获得过国内Linux相关认证,还为众多企事业单位提供过技术支持与培训。这是我早年参加国内第一批红帽授权讲师培训时的合影,当时国内仅有十来个人参加,时光飞逝,08年至今已过去十多年。

(二)二、课程内容介绍****

1. (一)分布式链路追踪系统概述****

1. 监控领域的“三架马车” :在运维领域,监控至关重要,常见的有基于指标(Metric)的监控、基于日志的监控以及基于调用链的监控。基于指标的监控,典型产品如Zabbix、Prometheus等;基于日志的监控,ERK(Elasticsearch + Logstash + Kibana)或EFK(Elasticsearch + Fluentd + Kibana)是大家熟知的代表;而今天重点学习的基于调用链的监控,与微服务发展紧密相关。

image.png

2. 分布式链路追踪系统的产生:早期服务多为单体架构,随着功能增多,软件变得庞大,出现维护困难、扩容不便、可用性低以及单点失败等问题。为解决这些问题,微服务理念应运而生,即将单一系统切分成多个小组件,部署在不同服务器上,实现负载均衡与高可用。然而,微服务架构也带来了管理难题,服务间相互访问复杂,当出现故障时,定位问题变得困难。2010年,谷歌发布相关论文,标志着分布式链路追踪系统诞生。随后,众多厂商基于此研发各自产品,但因兼容性问题,后来出现了Open Trace标准规范,使各链路追踪系统能相互协作兼容。 3. 

image.png 3. 链路追踪的核心概念 这张图片展示了关于分布式链路追踪原理的内容。以下是图中文字的提取:

标题

  • 1.1.4 分布式链路追踪原理

  • 分布式链路追踪(Distributed Tracing) 是一种用于监视和调试分布式系统中请求的传播路径的技术。

  • 在分布式系统中,一个请求通常会跨越多个服务和组件,而分布式链路追踪可以帮助我们跟踪请求在系统中的传递过程,从而更好地理解系统的性能和行为。

  • 分布式链路追踪的基本原理 就是在分布式应用的接口方法上设置一些观察点(类似快递中转站记录点),然后在入口节点给每个请求分配一个全局唯一的标识TraceId(类似快递单号),当请求流经这些观察点时就会记录一行对应的链路日志(包含链路唯一标识、接口名称、时间戳、主机信息等)。最后通过TraceId将一次请求的所有链路日志进行组装,就可以还原出该次请求的链路轨迹。

  • 分布式链路追踪的核心原理是追踪和关联

    • 追踪:指的是跟踪一个请求在分布式系统中的完整路径。
    • 关联:指的是将同一个请求的不同部分关联起来。

图示说明

  • 图中展示了一个包含Span A、Span B和Span E的链路追踪示例。每个Span都有一个Trace ID(均为123),Span A的Parent为null,Span B和Span E的Parent均为Span A。

其他信息

  • 分布式链路追踪系统使用一些关键的概念和规范

这张图片详细介绍了分布式链路追踪的基本原理、核心概念以及相关的示例,有助于理解分布式系统中请求的跟踪和管理。

image.png image.png

image.png

image.png

Trace部分:

  • 定义:追踪Trace是一系列相关的跟踪数据的集合,代表了一个请求在分布式系统中的完整路径。
  • TraceId:全局唯一的链路标识TraceId,是最具代表的一个属性。通过TraceId才能将同一个请求分散在不同节点的链路数据准确的关联起来,实现请求粒度的“确定性关联”价值。
  • 组成:Trace追踪通常由一系列的多个跟踪段Span组成的有向无环图DAG。

Span部分:

  • 定义:仅有TraceId还不够,还需要了解每一个请求在每一跳的接口方法上执行了什么动作,耗时多久,执行状态是成功还是失败?承载这些信息的基础对象就是Span,跟踪段(跨度)Span是追踪中的具有开始时间和执行时长的基本的逻辑运行单元,代表了请求在系统中的一个特定操作或组件上的执行。每个跟踪段表示一个操作的时间段,记录了操作的开始和结束时间、操作名称、标签等信息。

  • 关系:Span之间通过顺序排列或者嵌套建立逻辑前后调用关系。例如,一个HTTP请求、数据库查询等都可以是一个跟踪段。这些跟踪段在分布式系统中串联起来,形成完整的调用链路。

  • 属性

    • Operation Name:描述了当前接口的行为语义,比如/api/createOrder代表执行了一次创建订单的动作。
    • SpanId/ParentSpanId:接口调用的层级标识,用于还原Trace内部的层次调用关系。
    • Start/FinishTime:接口调用的开始和结束时间,二者相减就是该次调用的耗时。
    • StatusCode:响应状态,标识当次调用是成功或失败。
    • Tags & Events:调用附加信息。

Context Propagation:

分布式系统中的请求通常会经过多个不同的服务和组件。为了能够在整个调用链中追踪请求,需要共享上下文信息。
上下文传递确保在请求跨越不同服务时,相关信息如请求ID、时间戳等能够被正确传递,以便在后续的调用中能够识别并追踪这个请求且保持一致性。

Tag(标签):

Tag是用于在Span中添加元数据的机制,表现为多个key/value形式。
Tag主要用于对Span进行注释和补充,一般可以用来记录操作的相关信息,如请求参数、响应状态等。
Tag是没有时间戳信息的

分布式链路追踪的实现流程:

  1. 客户端发起请求,并生成一个唯一的Trace ID。
  2. Trace ID会在整个请求过程中传递,并在每个服务中记录下来。
  3. 每个服务会记录请求的开始时间、结束时间、调用参数、返回值等信息,并将其与Trace ID关联起来。
  4. 所有的Span信息会被收集到一个集中存储系统中。
  5. 用户可以通过查询系统,查看完整的请求链路,并分析系统的性能和排查故障。

– Trace:代表用户的一次完整访问。以电商购物下订单为例,涉及订单、物流、库存等多个服务的协作,构成一个完整调用链,系统会为每次访问分配唯一的Trace ID ,用于区分不同用户的访问链路。

– Span:表示用户访问经过的某一个服务步骤。在一次完整访问中,Trace ID 关联多个Span,每个Span记录着操作名称、层级标识(体现服务间调用关系)、启动和结束时间(用于观测服务性能)、响应码、附加信息以及上下文传递等信息。

2.(二)Skywalking介绍****

1. 背景与优势:Skywalking由华为公司研发,后捐献给阿帕奇基金会,成为其顶级项目。它是典型的分布式可观测分析系统(OAP),也是应用程序性能管理系统(APM),适用于微服务环境,支持云原生架构,且遵守Open Trace规范,不存在兼容问题。其优势众多,提供多种监控功能,支持常见开发语言,模块化且插件丰富,具备告警与图形界面功能。尤其对Java微服务生态支持良好,同时也支持Go、Python等语言。它采用无侵入式探针,无需修改原有代码,性能出色,社区活跃,更新频繁。

2. 组成部分

image.png

image.png

image.png

– OAP服务:作为Skywalking的核心,用于收集应用程序产生的链路信息,可基于HDDP或GRPC协议抓取数据。

– UI:即图形界面,用于展示收集到的信息,方便运维人员观测和查询。

– 存储:默认使用HR(纯内存单机版数据库)存储,但不利于持久化,生产中常用ES(Elasticsearch)等其他数据库进行数据持久保存。

– Agent:需在每个要追踪的服务应用上部署,与开发语言相关,如Java agent、Go agent、Python agent等,通过HDDB或GRBC协议将应用指标数据汇总到Skywalking服务器。

image.png

1.6 Skywalking相关概念

  • Service服务:即一个应用,6.0后改名为服务Service。
  • Endpoint端点:即一个API接口,表示传入请求的服务中的路径,例如HTTP URI路径或gRPC服务类+方法签名。比如:/Order/queryAll。
  • Instance实例:即一个进程或者一个Pod容器,通常表现为一个应用对应的IP:Port。
  • Segment:是SkyWalking中提出的概念,表示一次请求在某个服务内的执行链路片段的集合,一个请求在多个服务中先后产生的Segment串起来构成一个完整的Trace,如下图所示:

示意图展示了不同Segment(包含不同数量的span)之间的关系,有EntrySpan(入口跨度)、ExitSpan(出口跨度)以及parent(父跨度)、local Span(本地跨度)等标识,不同Segment之间通过parent和ref等关系连接,形成完整的调用链路。

3.(三)Skywalking部署****

1. OAP与UI部署

– 部署方式:官方提供多种部署方法,如二进制部署、容器化部署(包括K8S部署),本次因时间关系重点介绍二进制部署。

– 二进制部署步骤

• 下载:从阿帕奇基金会官网下载Skywalking,可选择二进制或源码下载方式,生产中二进制下载更便捷,无需编译。也可从清华大学镜像站下载,速度更快。

• 安装Java:Skywalking基于Java开发,需安装Java环境,官方支持11和17版本,本次选用Openjdk。

• 解压与配置:下载后解压,解压文件包含OAP和UI组件及各自配置文件。若对默认配置无特殊要求,可直接使用。如需修改,可调整UI配置文件中的监听端口等信息。

• 启动:通过运行解压目录下bin文件夹中的启动脚本启动服务。但当前版本脚本存在问题,需添加两个“&”符号将服务置于后台执行,否则UI界面可能无法打开。启动后,Skywalking会监听多个端口,可通过8080端口访问UI界面。

2. Skywalking Agent部署

– Java服务案例

• 诺一系统部署:在新机器上克隆诺一系统代码,准备Java环境并安装数据库,创建数据库及用户账号并授权。执行诺一系统源码中创建表环境的脚本,修改数据库连接配置文件,编译代码。

• Java agent安装:Java agent本质是Java的一个参数,可在Java程序启动时加载Skywalking第三方包,实现对Java程序性能指标的采集。从官方或清华大学镜像站下载Java agent包并解压,启动Java程序时,通过在命令中指定解压后的包路径、服务名及Skywalking服务器地址,即可完成集成。也可通过设置环境变量简化启动命令。启动诺一系统后,可在Skywalking界面看到该服务及服务与数据库的调用关系。

• ABC服务部署:在另一台机器上部署三个相互调用的Java服务(A、B、C),通过Nacos实现服务发现。安装Nacos并配置域名解析,在每个服务所在机器上安装Java agent ,按顺序启动服务(先启动C,再启动B,最后启动A)。启动后,可在Skywalking界面看到三个服务及它们之间的调用关系。

– Go服务案例

• 安装Go agent:从官方网站下载Go agent并解压,可使用脚本安装。

• 服务部署:在新机器上准备两个Go服务代码(A和B),因服务通过名称相互访问,需配置域名解析。对代码进行编译,编译时将Go agent注入代码中,生成二进制文件。通过设置环境变量指定服务名和Skywalking服务器地址,启动服务。启动后,可在Skywalking界面看到服务及调用关系。

– Python服务案例

• 非侵入式部署:准备新机器,上传Python编写的两个微服务代码(A和B),配置名称解析,安装Python环境及相关模块。通过设置环境变量指定服务名和Skywalking服务器地址,使用特定命令(STW的Python)启动服务。启动后,可在Skywalking界面看到服务及调用关系。

4.(四)Skywalking存储优化****

生产中,Skywalking默认的HR存储不利于数据持久化,通常使用ES存储。在Skywalking的配置文件(application.yml)中,找到“storage”部分,将默认的“HR”改为“elasticsearch”,并设置ES的地址。修改完成后,重启Skywalking即可。

(三)三、课程总结****

今天我们学习了分布式链路追踪系统的概念,了解到市面上有多种相关软件,重点介绍了Skywalking。它由OAP服务、UI、存储和Agent四部分组成,我们详细演示了其在Java、Go、Python服务中的部署方法。通过今天的课程,相信大家对Skywalking已有一定熟悉度,后续可自行探索菜单中的各种功能。