what's 分布式追踪
关于这件事儿,说的最清楚的中文资料:
Dapper 祖师爷产品,有能力的话,还是看原文吧。。。
阿里云
opentracing前生今世,说的比较清楚
uber,uber的心路历程,开发Jaeger 的心路历程
我觉得都比我写的好。。。
简单说法
我理解分布式追踪主要解决一个问题:
一个用户请求是怎么样在一个分布式系统里运转起来的?
各家码农都会面临各家产品,客服,老板一个问题:为啥又挂了?
在微服务流行的今天,这个问题似乎更严重了一些:
- 码农A,我这儿没挂
- 码农B,我这儿也没挂
- 运维数据库正常
- 老板 你们???
好吧,大家都不甩锅:
- 码农A,B 帮我看看,你返回的是啥呗?
- 码农B,你啥时候请求,id是啥?
1 码农A,babalala - 码农B,没打日志。。。。我也不知道你请求了没,返回了啥
- 码农A,你。。。,老板,我不知道咋挂了。
- 老板: 你。。。
那么经历的种种痛苦之后,结论很显然:我们记下来好不好
一图胜千言(原图来自网络)

google打了一个响指,分布式追踪诞生了。
至于顺带的,我们可以对各个服务的质量监控之类,应该都是副产品。
各种流派
那么问题来了,怎么在现实生活中搞出这个图来?
引用自阿里的文档
Tracing 的诞生
Tracing 是在90年代就已出现的技术。但真正让该领域流行起来的还是源于 Google 的一篇论文"Dapper, a Large-Scale Distributed Systems Tracing Infrastructure",而另一篇论文"Uncertainty in Aggregate Estimates from Sampled Distributed Traces"中则包含关于采样的更详细分析。论文发表后一批优秀的 Tracing 软件孕育而生,比较流行的有:
Dapper(Google) : 各 tracer 的基础
StackDriver Trace (Google)
Zipkin(twitter)
Appdash(golang)
鹰眼(taobao)
谛听(盘古,阿里云云产品使用的Trace系统)
云图(蚂蚁Trace系统)
sTrace(神马)
X-ray(aws)
其实,至少还漏了,
skywalking apache的版本
CAT 点评的版本,国内好像用的还不少
这类系统的基本原理
- client 提供给业务以及中间层埋点的底层SDK。
- collector 收集底层数据做简单的聚集(可选)。
- consumer 用于实时分析从客户端提供的数据。
- web 作为用户给用户提供展示的控制端。
client
无论哪个系统,是让你引入java-agent,还是加个什么sdk,还是手动调接口,本质上都得生产数据,并传输到分布式追踪系统。
collector
基于性能考虑,有的时候需要聚集数据,做简单处理,在传输到分布式追踪系统
consumer
计算并合并
web
展示之,如下面的网络图:

想象中的难题
说起来简单,但实际上有无数的坑
- 搞的来这么复杂系统的公司都是大公司,每秒1w qps起步,考虑到各种rpc之类的,每秒几万起步,需要个强悍的存储。首先需要比较高的写入量,其次,需要可以指定id查询,简单的key-value估计还不行,需要搞定到key-list。考虑数据量(每秒几万)和性能(正常人可以坚持等到结果,也就是从查询到web渲染成功在秒级别)。
- 需要一个准实时的聚集逻辑,才能及时查询出结果。
- 需要一个离线统计系统,完成对服务质量的监控。
- 需要定义一种协议,尽可能的兼容更多的语言和系统。
- 需要搞定n多系统和人员。复杂性比这个系统的复杂性高多了。
opentracing
在协议层面,还是有个初步的协议的,opentracing
DataModel
Traces in OpenTracing are defined implicitly by their Spans. In particular, a Trace can be thought of as a directed acyclic graph (DAG) of Spans, where the edges between Spans are called References.
不严谨的说,一个tracer是一次用户请求,每个span是一次rpc调用,或者自定义的一次操作。
API
目前了提供的多种语言的api:python,java,php,c++, lua,go等等,几乎所以的有名气的语言都有。
比如java的
io.opentracing.Tracer tracer = ...;
...
Scope scope = tracer.scopeManager().active();
if (scope != null) {
scope.span().log("...");
}
典型实现
这里面有几家是商业公司,有几个是开源实现。
- 要么需要买,费钱也就算了,关健是基本都是外国公司。考虑到网络的现状,不大好用。
- 要么自己搭,然而一个个的笨重无比。比如Jaeger 需要搞个cassandra/es之类的,且不说自己的服务。
浙公网安备 33010602011771号