分布式追踪

Posted on 2018-10-10 22:25  blesslyy  阅读(427)  评论(0)    收藏  举报

what's 分布式追踪

关于这件事儿,说的最清楚的中文资料:
Dapper 祖师爷产品,有能力的话,还是看原文吧。。。
阿里云
opentracing前生今世,说的比较清楚
uber,uber的心路历程,开发Jaeger 的心路历程

我觉得都比我写的好。。。

简单说法

我理解分布式追踪主要解决一个问题:
一个用户请求是怎么样在一个分布式系统里运转起来的?

各家码农都会面临各家产品,客服,老板一个问题:为啥又挂了?
在微服务流行的今天,这个问题似乎更严重了一些:

  1. 码农A,我这儿没挂
  2. 码农B,我这儿也没挂
  3. 运维数据库正常
  4. 老板 你们???

好吧,大家都不甩锅:

  1. 码农A,B 帮我看看,你返回的是啥呗?
  2. 码农B,你啥时候请求,id是啥?
    1 码农A,babalala
  3. 码农B,没打日志。。。。我也不知道你请求了没,返回了啥
  4. 码农A,你。。。,老板,我不知道咋挂了。
  5. 老板: 你。。。

那么经历的种种痛苦之后,结论很显然:我们记下来好不好
一图胜千言(原图来自网络)
7e335c65e37611e0b11270314cf683e0.png

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

展示之,如下面的网络图:
3.png

想象中的难题

说起来简单,但实际上有无数的坑

  1. 搞的来这么复杂系统的公司都是大公司,每秒1w qps起步,考虑到各种rpc之类的,每秒几万起步,需要个强悍的存储。首先需要比较高的写入量,其次,需要可以指定id查询,简单的key-value估计还不行,需要搞定到key-list。考虑数据量(每秒几万)和性能(正常人可以坚持等到结果,也就是从查询到web渲染成功在秒级别)。
  2. 需要一个准实时的聚集逻辑,才能及时查询出结果。
  3. 需要一个离线统计系统,完成对服务质量的监控。
  4. 需要定义一种协议,尽可能的兼容更多的语言和系统。
  5. 需要搞定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("...");
}

典型实现

supported

这里面有几家是商业公司,有几个是开源实现。

  • 要么需要买,费钱也就算了,关健是基本都是外国公司。考虑到网络的现状,不大好用。
  • 要么自己搭,然而一个个的笨重无比。比如Jaeger 需要搞个cassandra/es之类的,且不说自己的服务。

博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3