`
m635674608
  • 浏览: 4930521 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

分布式服务的Trace——Google Dapper & Twitter Zipkin

 
阅读更多

对于分布式在线服务,一个请求需要经过系统中多个模块,上百台机器的协作完成单次请求,典型场景就是Search Engine的一次用户检索,单靠人力无法掌握整个请求中各个阶段的性能开销,更无法快速的定位系统中性能瓶颈。Google Dapper文章描述了广泛用于Google内部服务的Trace Infrastruce—Dapper(原文地址见 这里, 译文地址见 这里 ),文章本身的很易懂,没有复杂、精巧的实现机制(好像也是g公司publish出来的文章的特点),有一些分布式在线服务经验的程序员都可以很好的理解 (英文版),这里就只抽一些点出来记录。而Zipkin是Twitter开源出来的一个Trace系统组件,实现中就参考了Google Dapper,项目主页见 http://twitter.github.io/zipkin/

Google Dapper

目标: 无所不在的持续跟踪(ubiquitous deployment,and continuous monitoring),只有无所不在和持续,才能保证所有的问题都能被跟踪到,因为服务也是7*24的。为了做到这两点,Dapper对于这个 Tracing组件,拆分出如下几个目标。

  • 低消耗(Low overhead): 分布式在线系统对于性能、资源要求都很严格,Trace组件必须对服务影响足够小,否则一定不会被启用。
  • 应用层透明(Application-Level Transparency): 应用层开发者不需要对Trace组件关心,Trace嵌入到基础通用库中,提供高稳定性,而如果Trace需要应用开发者配合,那可能会引入额外的bug导致Trace系统更加脆弱。
  • 扩展性(Scalability): Google的服务在线集群数量可想而知,一次检索就可能跨越上百台甚至成千台机器,因此这个Trace Infrastructure的扩展性也很重要。
  • 快速的数据分析(Analysis Quickly): 数据快速导出和分析,能够快速的定位系统的异常,及时应对,提升系统的稳定性。

典型检索场景: 单次user检索贯串前后端多个模块,模块之间使用rpc进行通信,如下图,request需要系统中由不同团队、不同语言构成的多个模块通信协作完成, 典型的一个自上而下的调用序列。Dapper的采集方式基于这种调用序列构成的树,拆分为不同的span(一次rpc远程调用),通过全局唯一的 Trace Id串起来,span指向自己的parent span。

image

Trace组件的实践经验:

  • 低采样率: 在保证数据误差的情况下,Dapper尽可能采用低的采样率来保证Trace的low overhead,一方面会给应用层自己的Annotation标记留出更多的性能空间,也可以在硬盘上保存更长时间的数据。
  • 带外数据收集(out-of-band): Trace组件将span信息落地到本机,使用守护进程进行带外收集,可以避免Trace数据占用检索带宽。同时,并不是所有的调用过程都是完美的嵌套 (prefect nested),有些组件会在下游返回结果前先向上游汇报一些结果,不适合将Trace结果与检索数据绑定。
  • 数据隐私: Trace系统仅面向的是系统的性能开销诊断,考虑到隐私,Dapper只记录RPC的名称和性能开销,对于一些策略和业务数据,可以考虑使用类似Online Debug的系统实现,引入权限控制。
  • 精简的基础lib: Dapper基础代码库很精简,便于植入各个通用库,保证稳定性和性能开销,在大部分控制流的基础库上进行了默认植入,来记录各个span的开销,其中C++的代码实现不到1000行。
  • 控制Dapper数据采集守护进程的资源消耗: 机器上的一些例行任务,例如数据统计脚本运行、外部数据的自动更新等,也会对部署在机器上的进程产生性能影响。因此,Dapper守护进程的性能数据采集,对使用的网络、CPU都非常谨慎,Dapper守护进程为内核scheduler最低的优先级。
  • 开放API和易用的UI: 方便的DAPI来访问导入到Bigtable中的采集数据,其他使用方可以使用API来构建web应用、可执行的command等(根据经验,RESTFul是一个不错的选择),并且默认提供一个良好的UI,便于查询。

Twitter Zipkin

Zipkin的项目主页上说到——Zipkin is a distributed tracing system that helps us gather timing data for all the disparate services at Twitter. It manages both the collection and lookup of this data through a Collector and a Query service. We closely modelled Zipkin after the Google Dapper paper 。看Zipkin的Architecture文档,描述上也都实现了一些Dapper文章中核心的描述。

Zipkin Infrastructure

image

image

  • Trace数据的收集系统,使用了Facebook开源的Scribe作为日志传输通路,将不同service上的Trace数据传输到Zipkin/Hadoop。
  • Zipkin的Storage系统最先使用的是Cassandra,后来加入了Redis, HBase, MySQL, PostgreSQL, SQLite, and H2等存储系统的支持,猜测这个也是Twitter当时放弃Cassandra转回MySQL有关。
  • Twitter中广泛使用了一个叫做Finagle的Java Async RPC服务,将trace library嵌入到这个Finagle中就成为支持系统跟踪的一个自然而然的选项。这个Library也是基于Dapper文章中的几个概念 (Annotation—包含host、时间戳的key/value;Span—一次特定的rpc调用,包含多个Annotation;Trace—由一 组span组成,共享一个root span)。
  • Client和Server在通信时,会在tracing header信息中加上TraceId(标识整个trace)、SpanId(独立的RPC request)、可选的Parent SpanId(一个服务会调用多个下游RPC服务)以及Sample boolean变量(标识本次是否采集)。
  • 通过Thrift Api来提供数据的访问查询功能,并搭建自己的UI(基于Rails,使用了d3js)。

按照主页上描述,Server接收到Client请求后,解析Trace头的处理逻辑流程图,自己画的简易流程图(字很丑- -)。

image

不论是Dapper的文章,还是Zipkin的主页,对于分布式系统中Trace Infrastructure的描述都比较简单,只提到了一些必须的基础组件,以及每个组件需要关注的问题。但结合实际工作中经验,这样完备的Trace 系统对分布式在线服务的异常诊断、性能优化有非常大的帮助,而这样的Trace组件又对各个基础组件的要求非常高。健壮、完备的基础组件对于这样系统的搭 建是非常有益的。

 

http://www.tuicool.com/articles/F3YNrm

分享到:
评论

相关推荐

    Dapper,大规模分布式系统的跟踪系统-CN.pdf

    对于分布式在线服务,一个请求需要经过系统中多个模块,上百台机器的协作完成单次请求,典型场景就是Search Engine的一次用户检索,单靠...而Zipkin是Twitter开源出来的一个Trace系统组件,实现中就参考了Google Dapper

    司徒放:鹰眼下的淘宝

    该文档来自JavaOne 2013 大会。鹰眼是淘宝的分布式日志跟踪系统,通过收集和分析在不同的网络调用中间件上的日志埋点,可以得到同一次请求上的各个系统...目前互联网公司类似的产品有:Google Dapper、Twitter Zipkin。

    Dapper分布式跟踪系统_Zh.pdf

    最近在研究分布式链路跟踪系统,Google Dapper 当然是必读的论文了,目前网上能搜到一些中文翻译版,然而读下来个人感觉略生硬;这里试着在前人的肩膀上重新翻译一遍这个论文,权当是个人的学习笔记,如果同时能给...

    Dapper大规模分布式系统的跟踪系统-论文

    Dapper大规模分布式系统的跟踪系统-论文

    Dapper,大规模分布式系统的跟踪系统

    Dapper,大规模分布式系统的跟踪系统

    Zipkin是一个分布式跟踪系统

    Zipkin是一个分布式跟踪系统。 它有助于收集在微服务架构中排除延迟问题所需的定时数据。 它管理这些数据的收集和查找。 Zipkin是基于Google Dapper的论文设计。

    zipkin Jar文件

    Zipkin的设计是基于谷歌的Google Dapper论文。 每个应用程序向Zipkin报告定时数据,Zipkin UI呈现了一个依赖图表来展示多少跟踪请求经过了每个应用程序;如果想解决延迟问题,可以过滤或者排序所有的跟踪请求,并且...

    zipkin.zip

    分布式链路追溯:指在以数百几计的分布式服务系统中,能做到可以...Zipkin:是由 Twitter 公司基于 Google Dapper 论文开发的开源的链路跟踪框架。同类型的框架还有:cat(大众点评)\pinpoint(naver)\skywalking(吴晟)

    dapper分布式跟踪系统原文

    dapper分布式跟踪系统原文 高清版。

    Google Dapper翻译.docx

    Dapper--Google生产环境下的分布式跟踪系统,应运而生。那么我们就来介绍一个大规模集群的跟踪系统,它是如何满足一个低损耗、应用透明的、大范围部署这三个需求的

    zipkin.war

    Zipkin的设计基于 Google Dapper论文。 应用程序用于向Zipkin报告时序数据。Zipkin UI还提供了一个依赖关系图,显示了每个应用程序通过的跟踪请求数。如果要解决延迟问题或错误,可以根据应用程序,跟踪长度,注释...

    美团的Mtrace分布式会话跟踪系统架构设计与实践

    分布式会话跟踪系统架构设计与实践 张志桐@美团点评基础架构中心 20160625 链路追踪(调用链路监控)最出名的是谷歌公开的...在复杂的微服务架构系统中,几乎每一个前端请求都会形成一个复杂的分布式服务调用链路。

    dapper分布式跟踪系统原文_en.pdf

    Here we introduce the design of Dapper, Google’s production distributed systems tracing infrastructure, and describe how our design goals of low overhead, application-level transparency, and ...

    毕业设计基于SpringCloud微服务分布式链路追踪项目源码.zip

    基于Google Dapper 论文,进行自定义实现。 原理: traceId :记录整个服务链路的 ID,由首次请求方创建(这里使用zst-service-demo01创建),整个服务链路中唯一 spanId :记录当前服务块的 ID,由当前服务方创建。...

    zipkin监控

    Zipkin的设计是基于谷歌的Google Dapper论文。 每个应用程序向Zipkin报告定时数据,Zipkin UI呈现了一个依赖图表来展示多少跟踪请求经过了每个应用程序;如果想解决延迟问题,可以过滤或者排序所有的跟踪请求,并且...

    zipkin-server-2.20.1-exec.jar

    Zipkin 是 Twitter 公司开发贡献的一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper 的论文设计而来,其主要功能是聚集各个异构系统的实时监控数据。

    目前分布式链路追踪系统基本都是根据谷歌的《Dapper 大规模分布式系统的跟踪系统》这篇论文发展而来

    目前分布式链路追踪系统基本都是根据谷歌的《Dapper 大规模分布式系统的跟踪系统》这篇论文发展而来

    CNCF Jaeger,一个分布式跟踪平台-Golang开发

    Jaeger-分布式跟踪系统Jaeger受Dapper和OpenZipkin的启发,是Uber Technologies作为开源发布的分布式跟踪系统。 它可以用于监视基于微服务的体系结构Jaeger-分布式跟踪系统Jaeger受Dapper和OpenZipkin的启发,是由...

    phosphor, 在Go中,分布式系统跟踪.zip

    phosphor, 在Go中,分布式系统跟踪 荧光粉是一个分布式跟踪系统,类似于谷歌 Dapper,Twitter,以及hailo服务的追踪。 它由几个简单组件组成:esx客户端插件,用于从应用程序发送跟踪在主服务器上收集跟踪和转发的...

    google的dapper-2010-1论文

    2010年google因为探索微服务链路追踪而推出的一篇论文,用于查看微服务之间互相调用的链路追踪情况展示。

Global site tag (gtag.js) - Google Analytics