为什么需要分布式链路追踪
随着互联网架构的扩张,分布式系统变得日趋复杂,越来越多的组件开始走向分布式化,如微服务、消息收发、分布式数据库、分布式缓存、分布式对象存储、跨域调用,这些组件共同构成了繁杂的分布式网络,那现在的问题是一个请求经过了这些服务后其中出现了一个调用失败的问题,只知道有异常,但具体的异常在哪个服务引起的就需要进入每一个服务里面看日志,这样的处理效率是非常低的
什么是分布式调用链
分布式调用链其实就是将一次分布式请求还原成调用链路。显式的在后端查看一次分布式请求的调用情况,比如各个节点上的耗时、请求具体打到了哪台机器上、每个服务节点的请求状态等等
链路追踪系统应该具备的功能
根据前面的分析,我们已经知道追踪分布式调用链是解决上述场景的一个可行方案,那分布式链路追踪应该具备哪些功能才能达到我们的要求呢?
1.快速定位
通过调用链跟踪,一次请求的逻辑轨迹可以用完整清晰的展示出来。开发中可以在业务日志中添加调用链ID,可以通过调用链结合业务日志快速定位错误信息
2.各个调用环节的性能分析
在调用链的各个环节分别添加调用时延,可以分析系统的性能瓶颈,进行针对性的优化。通过分析各个环节的平均时延,QPS等信息,可以找到系统的薄弱环节,对一些模块做调整,如数据冗余等
3.数据分析
调用链绑定业务后查看具体每条业务数据对应的链路问题,可以得到用户的行为路径,经过了哪些服务器上的哪个服务,汇总分析应用在很多业务场景
4.生成服务调用拓扑图
通过可视化分布式系统的模块和他们之间的相互联系来理解系统拓扑。点击某个节点会展示这个模块的详情,比如它当前的状态和请求数量
分布式系统调用过程
Opentracing协议
OpenTracing是一套分布式追踪协议,与平台,语言无关,统一接口,方便开发接入不同的分布式追踪系统。OpenTracing正在为全球的分布式追踪,提供统一的概念和数据标准
一个完整的opentracing调用链包含 Trace + span + 无限极分类
Trace:追踪对象,一个Trace代表了一个服务或者流程在系统中的执行过程,如:test.com,redis,mysql等执行过程。一个Trace由多个span组成
span:记录Trace在执行过程中的信息,如:查询的sql,请求的HTTP地址,RPC调用,开始、结束、间隔时间等
无限极分类:服务与服务之间使用无限极分类的方式,通过HTTP头部或者请求地址传输到最低层,从而把整个调用链串起来
分布式追踪系统Jaeger
Jaeger是Uber开发的一套分布式追踪系统,已在Uber大规模使用。并在2017-9-13 加入CNCF 开源组织。使用Jaeger可以非常直观的展示整个分布式系统的调用链,由此可以很好发现和解决问题
分布式追踪系统种类繁多,但是核心步骤有三个:代码埋点,数据存储和查询展示。
APM的三大模块分别是集中式日志系统,集中式度量系统和分布式全链接追踪系统。
而Jaeger属于的就是追踪系统,度量系统我们则会使用prometheus,日志系统一般则是elk。
作用
分布式环境下信息传播
分布式交易监控
展示跨进程调用链
性能优化
定位问题
Jaeger组件
Agent
Agent是一个网络守护进程,监听通过UDP发送过来的Span,它会将其批量发送给collector。按照设计,Agent要被部署到所有主机上,作为基础设施。Agent将collector和客户端之间的路由与发现机制抽象了出来。
Collector
Collector从Jaeger Agent接收Trace,并通过一个处理管道对其进行处理。目前的管道会校验Trace、建立索引、执行转换并最终进行存储。存储是一个可插入的组件,现在支持Cassandra和elasticsearch。
Query
Query服务会从存储中检索Trace并通过UI界面进行展现,该UI界面通过React技术实现,其页面UI如下图所示,展现了一条Trace的详细信息。
存储
jaeger采集到的数据必须存储到某个存储引擎,目前支持Cassandra和elasticsearch
go-micro + opentracing + jaeger
jaeger 部署
快速部署 ------ All in one Docker image
all-in-one 是Uber官方打包好的镜像,可以直接部署使用,但是只能用于测试环境,不能用于线上,因为它把数据放入了内存
docker run -d -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p5775:5775/udp -p6831:6831/udp -p6832:6832/udp -p5778:5778 -p16686:16686 -p14268:14268 -p9411:9411 jaegertracing/all-in-one:latest
打开浏览器访问: http://localhost:16686
GO 代码
go-micro client:https://gitee.com/mashuai666/micro-jaeger-client
go-micro server: https://gitee.com/mashuai666/micro-jaeger-server
jaeger使用
go-micro 自带的opentracing插件
打开浏览器访问: http://localhost:16686