一小时玩转分布式链路追踪系统Skywalking
视频地址:www.bilibili.com/video/BV16r…
一小时玩转分布式链路追踪系统Skywalking****
大家下午好,欢迎来到马哥教育直播间。今天下午将为大家分享微服务中常见的组件——链路追踪系统Skywalking。若企业中微服务应用较为普及,相信大家对它并不陌生。接下来的一小时,我们将较为系统地讲解该软件,涵盖工作原理、构建方式、部署方法以及具体使用。
(一)一、讲师介绍****
我是马哥教育的老师王小春。我拥有一些相关证书,阿里云大学上有我之前的基础课程视频,虽有些陈旧,但用于入门学习还是足够的。我有20多年IT工作经验,早期便从事Linux方面的工作,获得过国内Linux相关认证,还为众多企事业单位提供过技术支持与培训。这是我早年参加国内第一批红帽授权讲师培训时的合影,当时国内仅有十来个人参加,时光飞逝,08年至今已过去十多年。
(二)二、课程内容介绍****
1. (一)分布式链路追踪系统概述****
1. 监控领域的“三架马车” :在运维领域,监控至关重要,常见的有基于指标(Metric)的监控、基于日志的监控以及基于调用链的监控。基于指标的监控,典型产品如Zabbix、Prometheus等;基于日志的监控,ERK(Elasticsearch + Logstash + Kibana)或EFK(Elasticsearch + Fluentd + Kibana)是大家熟知的代表;而今天重点学习的基于调用链的监控,与微服务发展紧密相关。
2. 分布式链路追踪系统的产生:早期服务多为单体架构,随着功能增多,软件变得庞大,出现维护困难、扩容不便、可用性低以及单点失败等问题。为解决这些问题,微服务理念应运而生,即将单一系统切分成多个小组件,部署在不同服务器上,实现负载均衡与高可用。然而,微服务架构也带来了管理难题,服务间相互访问复杂,当出现故障时,定位问题变得困难。2010年,谷歌发布相关论文,标志着分布式链路追踪系统诞生。随后,众多厂商基于此研发各自产品,但因兼容性问题,后来出现了Open Trace标准规范,使各链路追踪系统能相互协作兼容。 3.
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。
其他信息
- 分布式链路追踪系统使用一些关键的概念和规范
这张图片详细介绍了分布式链路追踪的基本原理、核心概念以及相关的示例,有助于理解分布式系统中请求的跟踪和管理。
、
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是没有时间戳信息的
分布式链路追踪的实现流程:
- 客户端发起请求,并生成一个唯一的Trace ID。
- Trace ID会在整个请求过程中传递,并在每个服务中记录下来。
- 每个服务会记录请求的开始时间、结束时间、调用参数、返回值等信息,并将其与Trace ID关联起来。
- 所有的Span信息会被收集到一个集中存储系统中。
- 用户可以通过查询系统,查看完整的请求链路,并分析系统的性能和排查故障。
– Trace:代表用户的一次完整访问。以电商购物下订单为例,涉及订单、物流、库存等多个服务的协作,构成一个完整调用链,系统会为每次访问分配唯一的Trace ID ,用于区分不同用户的访问链路。
– Span:表示用户访问经过的某一个服务步骤。在一次完整访问中,Trace ID 关联多个Span,每个Span记录着操作名称、层级标识(体现服务间调用关系)、启动和结束时间(用于观测服务性能)、响应码、附加信息以及上下文传递等信息。
2.(二)Skywalking介绍****
1. 背景与优势:Skywalking由华为公司研发,后捐献给阿帕奇基金会,成为其顶级项目。它是典型的分布式可观测分析系统(OAP),也是应用程序性能管理系统(APM),适用于微服务环境,支持云原生架构,且遵守Open Trace规范,不存在兼容问题。其优势众多,提供多种监控功能,支持常见开发语言,模块化且插件丰富,具备告警与图形界面功能。尤其对Java微服务生态支持良好,同时也支持Go、Python等语言。它采用无侵入式探针,无需修改原有代码,性能出色,社区活跃,更新频繁。
2. 组成部分
– OAP服务:作为Skywalking的核心,用于收集应用程序产生的链路信息,可基于HDDP或GRPC协议抓取数据。
– UI:即图形界面,用于展示收集到的信息,方便运维人员观测和查询。
– 存储:默认使用HR(纯内存单机版数据库)存储,但不利于持久化,生产中常用ES(Elasticsearch)等其他数据库进行数据持久保存。
– Agent:需在每个要追踪的服务应用上部署,与开发语言相关,如Java agent、Go agent、Python agent等,通过HDDB或GRBC协议将应用指标数据汇总到Skywalking服务器。
:
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已有一定熟悉度,后续可自行探索菜单中的各种功能。