取消
搜索历史
热搜词
原创
活动
创新2.0
I T
产业
当前位置:首页 >互联网•IT > 服务器 > 微服务 > 正文
微服务架构下,如何实现分布式跟踪?
来源:互联网  :佚名 2016-08-09 18:04:50
随着互联网技术的高速发展,各种创新技术、前沿概念如雨后春笋般层出不穷,云服务、云计算、大数据处理、大数据分析……,以往单应用的服务架构已经很难处理如山洪般增长的信息数据,随着分布式的普及、服务的快速增长与云计算技术的进步,微服务架构逐渐进入人们的实现,它也因其特有的优势而备受关注。

随着互联网技术的高速发展,各种创新技术、前沿概念如雨后春笋般层出不穷,云服务、云计算大数据处理、大数据分析……,以往单应用的服务架构已经 很难处理如山洪般增长的信息数据,随着分布式的普及、服务的快速增长与云计算技术的进步,微服务架构逐渐进入人们的实现,它也因其特有的优势而备受关注。

微服务架构的本质,是把整体的业务拆分成很多有特定明确功能的服务,通过很多分散的小服务之间的配合,去解决更大,更复杂的问题。对被拆分后的服务进行分类和管理,彼此之间使用统一的接口来进行交互。

微服务的特点决定了功能模块的部署是分布式的,以往在单应用环境下,所有的业务都在同一个服务器上,如果服务器出现错误和异常,我们只要盯住一个 点,就可以快速定位和处理问题,但是在微服务的架构下,大部分功能模块都是单独部署运行的,彼此通过总线交互,都是无状态的服务,这种架构下,前后台的业 务流会经过很多个微服务的处理和传递,我们难免会遇到这样的问题:

分散在各个服务器上的日志怎么处理?

如果业务流出现了错误和异常,如何定位是哪个点出的问题?

如何快速定位问题?

如何跟踪业务流的处理顺序和结果?

我们发现,以前在单应用下的日志监控很简单,在微服务架构下却成为了一个大问题,如果无法跟踪业务流,无法定位问题,我们将耗费大量的时间来查找和定位问题,在复杂的微服务交互关系中,我们就会非常被动。

对于这个问题,业内已经有了一些实践和解决方案,让我们来看看行业内的领先设计思想。

Google Dapper

Google公司广泛使用了分布式集群,为了应对自身大规模的复杂集群环境,Google公司研发了Dapper分布式跟踪系统,并发表了论文 《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》,给行业内分布式跟踪的实现提供了非常有价值的参考,该论文也成为了当前分布式跟踪系统的理论基础。

我们先来看个例子:

\

图1 这个路径由用户的X请求发起,穿过一个简单的服务系统。用字母标识的节点代表分布式系统中的不同处理过程。

分布式服务的跟踪系统需要记录在一次特定的请求中系统中完成的所有工作的信息。举个例子,上图展现的是一个与5台服务器相关的一个服务,包括:前端 (A),两个中间层(B和C),以及两个后端(D和E)。当一个用户(这个用例的发起人)发起一个请求时,首先到达前端,然后发送两个RPC调用到服务器 B和C。B会马上做出反应,但是C需要和后端的D和E交互之后再返还给A,由A来响应最初的请求。对于这样一个请求,简单实用的分布式跟踪的实现,就是为 服务器上每一次发送和接收动作来收集跟踪标识符(message identifiers)和时间戳(timestamped events)。

基于这个模型,Google在此论文中提出了几个重要的概念:

1、基于标注(annotation-based),又叫植入点或埋点

在应用程序或中间件中明确定义一个全局的标注(annotation),它可以是一个特殊的ID,通过这个ID连接每一条记录和发起者的请求,当 然,这需要代码植入,在生产环境中,因为所有的应用程序都使用相同的线程模型,控制流和RPC系统,可以把代码植入限制在一个很小的通用组件库中,从而达 到监测系统应用对开发人员的透明。Dapper能够以对应用开发者近乎零侵入的成本对分布式控制路径进行跟踪,几乎完全依赖于少量通用组件库的改造。

当一个线程在处理跟踪控制路径的过程中,Dapper把这次跟踪的上下文在ThreadLocal中进行存储。追踪上下文是一个小而且容易复制的容器,其中承载了Scan的属性比如跟踪ID和span ID。

当计算过程是延迟调用的或是异步的,大多数Google开发者通过线程池或其他执行器,使用一个通用的控制流库来回调。Dapper确保所有这样 的回调可以存储这次跟踪的上下文,而当回调函数被触发时,这次跟踪的上下文会与适当的线程关联。在这种方式下,Dapper可以使用trace ID和span ID来辅助构建异步调用的路径。

Google几乎所有的进程间通信都是建立在一个用C++和Java开发的RPC框架上。我们通过跟踪植入该框架来定义RPC中所有的span。span的ID和跟踪的ID会从客户端发送到服务端。基于RPC的系统被广泛使用在Google中,这是一个重要的植入点。

2、跟踪树和span

\

图2:5个span在Dapper跟踪树中的关联关系

在Dapper跟踪树结构中,树节点是整个架构的基本单元,而每一个节点又是对span的引用。节点之间的连线表示的span和它的父span的直接关系。通过简单的parentId和spanId就可以有序地把所有的关系串联起来,达到记录业务流的作用。

Twitter公司的Zipkin

Twitter公司的Zipkin是Google Dapper系统的开源实现,Zipkin严格按照Dapper论文实现,采用Scala编写,并且紧密集成到Twitter公司自己的分布式服务Finagle中,使得跟踪做到对应用透明。

\

图3:Zipkin应用架构图

Zipkin的整体架构如上图所示,涵盖了信息的收集、处理和展现。

淘宝鹰眼系统(EagleEye)

淘宝鹰眼是基于网络调用日志的分布式跟踪系统,它可以分析网络请求在各个分布式系统之间的调用情况,从而得到处理请求的调用链上的入口URL、应用 服务的调用关系,从而找到请求处理瓶颈,定位错误异常的根源位置。同时,业务方也可以在调用链上添加自己的业务埋点日志,使各个系统的网络调用与实际业务 内容得到关联。

\

图4:鹰眼系统的总体架构图

编辑:张路麒
关键字:     分布式架构  服务器  微服务 
活动 直播间  | CIO智行社

分享到微信 ×

打开微信,点击底部的“发现”,
使用“扫一扫”即可将网页分享至朋友圈。