分布式系统调研

1.分布式调用系统现状

当前,随着互联网架构的扩张,分布式系统变得日趋复杂,越来越多的组件开始走向分布式化,如微服务、消息收发、分布式数据库、分布式缓存、分布式对象存储、跨域调用,这些组件共同构成了繁杂的分布式网络。

image.png
图1:微服务关系链图


分布式追踪系统发展很快,种类繁多,给我们带来很大的方便。但在数据采集过程中,有时需要侵入用户代码,并且不同系统的 API 并不兼容,这就导致了如果您希望切换追踪系统,往往会带来较大改动。OpenTracing为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范。OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。详细介绍见
opentracing文档中文版


QS_01.gif
图2:openTracing 调用示意图

2.APM 简述

APM (Application Performance Management)是对企业的应用系统进行实时监控,它是用于实现对应用程序性能管理和故障管理的系统化的解决方案。

3.APM 主要解决的问题:

  1. 集中式度量系统
  2. 分布式全链接追踪系统(trace system)
  3. 集中式日志系统(elk)

……

4.理论依据

Google Dapper 论文基本思想的启发,先后出现了许多优秀的 APM 系统。Google 针对自己的分布式跟踪系统 Dapper 在生产环境下运行两年多时间积累的经验,在论文中重点提到到了分布式跟踪系统对业务系统的零侵入这个先天优势,并总结了大量的应用场景,还提及它的不足之处。

5.分布式调用追踪(APM)一览

  1. Google 的 Drapper: 暂未开源,可以算是出现最早的 APM
  2. 阿里-鹰眼:暂未开源
  3. 大众点评-CAT: 跨服务的跟踪功能与点评内部的 RPC 框架集成,这部分未开源且项目在 2014.1 已经停止维护。服务粒度的监控,通过代码埋点的方式来实现监控,比如: 拦截器,注解,过滤器等,对代码的侵入性较大,集成成本较高
  4. 京东-Hydra: 与 Dubbo 框架集成,对于服务级别的跟踪统计,现有业务可以无缝接入。对于细粒度的兴趣点,需要业务人员手动添加,开源项目已于 2013.6 停止维护
  5. PinPoint-naver: 字节码探针技术,代码无侵入,体系完善不易修改,支持 Java,技术栈支持 Dubbo,其他语言社区陆续支持中
  6. twitter-zipkin: 方便集成于 Springcloud,社区支持的插件也包括 Dubbo, RabbitMQ, Mysql, Httpclient 等(https://github.com/openzipkin/brave/tree/master/instrumentation),同时支持 PHP, GO, JS 等语言客户端,界面功能较为简单,本身无告警功能,可能需要二次开发,代码入侵度小
  7. uber-jaeger: jaeger支持java/c++/go/node/php,在界面上较为完善(对比zipkin),但是也无告警功能。代码入侵度小。Dubbo 目前无插件支持,可二次开发。
  8. 华为-skywalking: 由华为个人开发者吴斌开发并开源,类似于 PinPoint,目前还在 Apache 孵化中,网上吞吐量对比中强于 Pinpoint,实际未验证,本身支持 Dubbo

6.Zipkin

  • Architecture Overview

Tracers 存在于您的应用程序中,并记录有关发生的操作的时间和元数据。他们经常使用库的方式接入,因此它们的使用对用户是透明的。例如,已检测的Web服务器会在收到请求时以及何时发送响应时进行记录。收集的跟踪数据称为 Span
编写实现库是为了安全生产并且开销很小。出于这个原因,它们只通过ID来传输,以及告诉接收器正在进行跟踪。Zipkin 报告已完成的 Span(跨度),类似于应用程序异步报告度量标准的方式。
例如,在跟踪操作并且需要发出传出的http请求时,会添加一些 Headers 来传输 IDHeaders 不用于发送操作名称等详细信息。
将数据发送到 Zipkin 的检测应用程序中的组件称为 ReporterReporter 通过几种传输之一将跟踪数据发送到Zipkin 收集器,这些收集器将跟踪数据保存到存储中。稍后,API会查询存储以向UI提供数据。
image.png
图3:zipkin 架构图

  • Example Flow
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
┌─────────────┐ ┌───────────────────────┐  ┌─────────────┐  ┌──────────────────┐
│ User Code │ │ Trace Instrumentation │ │ Http Client │ │ Zipkin Collector │
└─────────────┘ └───────────────────────┘ └─────────────┘ └──────────────────┘
│ │ │ │
┌─────────┐
│ ──┤GET /foo ├─▶ │ ────┐ │ │
└─────────┘ │ record tags
│ │ ◀───┘ │ │
────┐
│ │ │ add trace headers │ │
◀───┘
│ │ ────┐ │ │
│ record timestamp
│ │ ◀───┘ │ │
┌─────────────────┐
│ │ ──┤GET /foo ├─▶ │ │
│X-B3-TraceId: aa │ ────┐
│ │ │X-B3-SpanId: 6b │ │ │ │
└─────────────────┘ │ invoke
│ │ │ │ request │

│ │ │ │ │
┌────────┐ ◀───┘
│ │ ◀─────┤200 OK ├─────── │ │
────┐ └────────┘
│ │ │ record duration │ │
┌────────┐ ◀───┘
│ ◀──┤200 OK ├── │ │ │
└────────┘ ┌────────────────────────────────┐
│ │ ──┤ asynchronously report span ├────▶ │
│ │
│{ │
│ "traceId": "aa", │
│ "id": "6b", │
│ "name": "get", │
│ "timestamp": 1483945573944000,│
│ "duration": 386000, │
│ "annotations": [ │
│--snip-- │
└────────────────────────────────┘

图4:zipkin 调用流程图

7.Jaeger

  • Architecture Overview

JAEGER 客户端是对于 OpenTracing API 语言的特定实现,它们可以用于现有各种框架的集成(例如 Flask, gRpc 等),这些框架都实现了 OpenTracing 协议。
接入实现产生的开销非常小,并且始终作用于生产环境。
请注意,虽然我们可以此机制收集所有的 Traces 记录,但是只有少数 Traces 会被采样,当然客户端可以自己定义采样率,默认情况客户端会采样 0.1%,并且能够从代理检索采样策略。


image.png

图5:jarger 架构图

  • Example Flow

image.png


图6:jaeger 调用示意图

8.Skywalking

  • Architecture Overview

image.png
图7:skywalking 架构图
主要分为四部分:

  1. Agent:使用 Java Agent 做字节码植入,无侵入式的收集,并通过 HTTP 或者 gRPC 方式发送数据至 Collector
  2. Collector: 链路数据收集器,对 Agent 传输过来的数据进行整合分析处理并落在相关的数据存储中
  3. Storage: 6.x 版本支持 ElasticSearch、Mysql、TiDB、H2 作为存储介质
  4. UI:可视化平台,展示落地数据

9.方案对比

pinpoint zipkin jaeger skywalking
OpenTracing兼容
客户端支持语言 java、php java,c#,go,php,node.js,ruby,scala,c++,c,elixir,lua,python java,c#,go,php,python,node.js,c++ Java, .NET Core, NodeJS and PHP
存储 hbase ES,mysql,Cassandra,内存 ES,kafka,Cassandra,内存 ES,H2,mysql,TIDB,sharding sphere
传输协议支持 thrift http,MQ udp/http gRPC
ui丰富程度
实现方式-代码侵入性 字节码注入,无侵入 拦截请求,侵入 拦截请求,侵入 字节码注入,无侵入
扩展性
trace查询 不支持 支持 支持 支持
告警支持 支持 不支持 不支持 支持
jvm监控 支持 不支持 不支持 支持
性能损失

10.各方案参考链接

pinpoint-naver

github: [https://github.com/naver/pinpoint](https://github.com/naver/pinpoint)<br />    docker快速体验:[https://github.com/naver/pinpoint-docker](https://github.com/naver/pinpoint-docker)<br /> 

twitter-zipkin

github: [https://github.com/openzipkin/zipkin](https://github.com/openzipkin/zipkin)<br />    页面详解:[https://blog.csdn.net/u012394095/article/details/82585863](https://blog.csdn.net/u012394095/article/details/82585863)<br />    zipkin于php对接:[https://www.colabug.com/1872361.html](https://www.colabug.com/1872361.html)<br /> 

jaeger-uber

部分参考资料:<br />    jaeger简介,部署,入门实践 [https://my.oschina.net/u/2548090/blog/1821359](https://my.oschina.net/u/2548090/blog/1821359)<br />    jaeger——java实现 [https://my.oschina.net/u/1789379/blog/1551421](https://my.oschina.net/u/1789379/blog/1551421)<br />    Uber分布式追踪系统Jaeger使用介绍和案例(PHP Hprose Go 跨语言调用)<br />[    https://segmentfault.com/a/1190000011636957](https://segmentfault.com/a/1190000011636957)<br />    全链路监控Jaeger搭建实战 [https://www.jianshu.com/p/ffc597bb4ce8](https://www.jianshu.com/p/ffc597bb4ce8)<br />    jaeger官网快速开始 [https://www.jaegertracing.io/docs/1.8/getting-started/](https://www.jaegertracing.io/docs/1.8/getting-started/)<br /> 

skywalking

github: [https://github.com/apache/incubator-skywalking](https://github.com/apache/incubator-skywalking)<br />    SkyWalking 分布式追踪系统 [https://www.jianshu.com/p/2fd56627a3cf](https://www.jianshu.com/p/2fd56627a3cf)<br />    Apache SkyWalking 5.0中文版图文详解使用手册<br />[    http://skywalking.apache.org/zh/blog/2018-12-18-Apache-SkyWalking-5-0-UserGuide.html](http://skywalking.apache.org/zh/blog/2018-12-18-Apache-SkyWalking-5-0-UserGuide.html)<br />    skywalking学习笔记 [https://juejin.im/post/5ab5b0e26fb9a028e25d7fcb](https://juejin.im/post/5ab5b0e26fb9a028e25d7fcb)<br /> <br /> 

11.参考资料

分布式链路追踪技术对比 [https://blog.csdn.net/moonpure/article/details/79992855](https://blog.csdn.net/moonpure/article/details/79992855)<br />    回到网易后开源 APM 技术选型与实战 [https://www.infoq.cn/article/apm-Pinpoint-practice](https://www.infoq.cn/article/apm-Pinpoint-practice)<br />    zipkin vs jaeger [https://segmentfault.com/a/1190000015308746](https://segmentfault.com/a/1190000015308746)<br />    调用链选型之 Zipkin,Pinpoint,SkyWalking,CAT [https://www.jianshu.com/p/0fbbf99a236e](https://www.jianshu.com/p/0fbbf99a236e)<br />