分布式调用跟踪系统的设计和应用

简介:

一、为什么需要分布式调用跟踪系统

随着分布式服务架构的流行,特别是微服务等设计理念在系统中的应用,业务的调用链越来越复杂,

可以看到,随着服务的拆分,系统的模块变得越来越多,不同的模块可能由不同的团队维护,

一个请求可能会涉及到几十个服务的协同处理, 牵扯到多个团队的业务系统,那么如何快速准确的定位到线上故障?
同时,缺乏一个自上而下全局的调用id,如何有效的进行相关的数据分析工作?

对于大型网站系统,如淘宝、京东等电商网站,这些问题尤其突出。

一个典型的分布式系统请求调用过程:

比较成熟的解决方案是通过调用链的方式,把一次请求调用过程完整的串联起来,这样就实现了对请求调用路径的监控。

二、调用跟踪系统的业务场景

(1)故障快速定位

通过调用链跟踪,一次请求的逻辑轨迹可以用完整清晰的展示出来。
开发中可以在业务日志中添加调用链ID,可以通过调用链结合业务日志快速定位错误信息。

(2)各个调用环节的性能分析

在调用链的各个环节分别添加调用时延,可以分析系统的性能瓶颈,进行针对性的优化。

(3)各个调用环节的可用性,持久层依赖等

通过分析各个环节的平均时延,QPS等信息,可以找到系统的薄弱环节,对一些模块做调整,如数据冗余等。

(4)数据分析等

调用链是一条完整的业务日志,可以得到用户的行为路径,汇总分析应用在很多业务场景。

 

三、分布式调用跟踪系统的设计

(1)分布式调用跟踪系统的设计目标

低侵入性,应用透明:

作为非业务组件,应当尽可能少侵入或者无侵入其他业务系统,对于使用方透明,减少开发人员的负担

低损耗:

服务调用埋点本身会带来性能损耗,这就需要调用跟踪的低损耗,
实际中还会通过配置采样率的方式,选择一部分请求去分析请求路径

大范围部署,扩展性:

作为分布式系统的组件之一,一个优秀的调用跟踪系统必须支持分布式部署,具备良好的可扩展性

(2)埋点和生成日志

埋点即系统在当前节点的上下文信息,可以分为客户端埋点、服务端埋点,以及客户端和服务端双向型埋点。

埋点日志通常要包含以下内容:

TraceId、RPCId、调用的开始时间,调用类型,协议类型,调用方ip和端口,请求的服务名等信息;
调用耗时,调用结果,异常信息,消息报文等;
预留可扩展字段,为下一步扩展做准备;

(3)抓取和存储日志

日志的采集和存储有许多开源的工具可以选择,
一般来说,会使用离线+实时的方式去存储日志,主要是分布式日志采集的方式。
典型的解决方案如Flume结合Kafka等MQ。

(4)分析和统计调用链数据

一条调用链的日志散落在调用经过的各个服务器上,
首先需要按 TraceId 汇总日志,然后按照RpcId 对调用链进行顺序整理。
调用链数据不要求百分之百准确,可以允许中间的部分日志丢失。

(5)计算和展示

汇总得到各个应用节点的调用链日志后,可以针对性的对各个业务线进行分析。
需要对具体日志进行整理,进一步储存在HBase或者关系型数据库中,可以进行可视化的查询。

四、调用跟踪系统的选型

大的互联网公司都有自己的分布式跟踪系统,
比如Google的Dapper,Twitter的zipkin,淘宝的鹰眼,新浪的Watchman,京东的Hydra等。

(1)Google的Drapper

Dapper是Google生产环境下的分布式跟踪系统,Dapper有三个设计目标:

低消耗:跟踪系统对在线服务的影响应该做到足够小。

应用级的透明:对于应用的程序员来说,是不需要知道有跟踪系统这回事的。如果一个跟踪系统想生效,就必须需要依赖应用的开发者主动配合,那么这个跟踪系统显然是侵入性太强的。

延展性:Google至少在未来几年的服务和集群的规模,监控系统都应该能完全把控住。

Drapper的日志格式:

dapper用span来表示一个服务调用开始和结束的时间,也就是时间区间。

dapper记录了span的名称以及每个span的ID和父ID,如果一个span没有父ID被称之为root span。所有的span都挂在一个特定的trace上,共用一个traceID,这些ID用全局64位整数标示。

Drapper如何进行跟踪收集:

分为3个阶段:

①各个服务将span数据写到本机日志上;

②dapper守护进程进行拉取,将数据读到dapper收集器里;

③dapper收集器将结果写到bigtable中,一次跟踪被记录为一行。 

 

(2)淘宝的鹰眼

关于淘宝的鹰眼系统,主要资料来自于内部分享,

鹰眼埋点和生成日志:

如何抓取和存储日志:

鹰眼的实现小结:




本文转自邴越博客园博客,原文链接:http://www.cnblogs.com/binyue/p/5703812.html,如需转载请自行联系原作者

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
安全 大数据 Go
Go语言在分布式系统中的应用
【2月更文挑战第20天】Go语言,以其独特的语言特性和出色的性能,逐渐成为分布式系统开发领域的热门选择。本文将深入探讨Go语言在分布式系统中的应用,分析其优势及实际应用案例,旨在为开发人员提供有价值的参考与启示。
|
5天前
|
分布式计算 Ubuntu 调度
如何本地搭建开源分布式任务调度系统DolphinScheduler并远程访问
如何本地搭建开源分布式任务调度系统DolphinScheduler并远程访问
|
1月前
|
存储 分布式计算 大数据
现代化数据库技术——面向大数据的分布式存储系统
传统的关系型数据库在面对大规模数据处理时遇到了诸多挑战,而面向大数据的分布式存储系统应运而生。本文将深入探讨现代化数据库技术中的分布式存储系统,包括其优势、工作原理以及在大数据领域的应用。
|
1月前
|
消息中间件 存储 NoSQL
【Redis项目实战】使用Springcloud整合Redis分布式锁+RabbitMQ技术实现高并发预约管理处理系统
【Redis项目实战】使用Springcloud整合Redis分布式锁+RabbitMQ技术实现高并发预约管理处理系统
|
1月前
|
存储 Web App开发 运维
原来10张图就可以搞懂分布式链路追踪系统原理
原来10张图就可以搞懂分布式链路追踪系统原理
|
1月前
|
算法 Java 数据中心
分布式ID生成系统之雪花算法详解
在当今的云计算和微服务架构盛行的时代,分布式系统已成为软件开发的重要组成部分。随着系统规模的扩大和业务的复杂化,对数据一致性和唯一性的要求也越来越高,尤其是在全局唯一标识符(ID)的生成上。因此,分布式ID生成系统应运而生,成为保证数据唯一性和提高系统可扩展性的关键技术之一。雪花算法(Snowflake)是Twitter开源的一种算法,用于生成64位的全局唯一ID,非常适用于分布式系统中生成唯一标识符。下面我们将深入探讨雪花算法的原理、结构和实现方式。
98 2
 分布式ID生成系统之雪花算法详解
|
3月前
|
存储 供应链 安全
新一代数据库技术——基于区块链的分布式存储系统
传统数据库系统通常采用集中式存储结构,容易受到单点故障和数据篡改的影响。本文将介绍基于区块链技术的分布式存储系统,探讨其在数据库领域的应用和优势,以及面临的挑战和未来发展趋势。
175 1
|
3月前
|
消息中间件 存储 NoSQL
面试题解析:如何解决分布式秒杀系统中的库存超卖问题?
面试题解析:如何解决分布式秒杀系统中的库存超卖问题?
113 0
|
3月前
|
NoSQL 安全 Redis
解决秒杀系统库存超卖问题:乐观锁与Redis分布式锁的应用
解决秒杀系统库存超卖问题:乐观锁与Redis分布式锁的应用
446 0
|
3月前
|
存储 监控 网络协议
百度基于金融场景构建高实时、高可用的分布式数据传输系统的技术实践
本文将通过一个百度搜索旗下的金融场景案例来分享构建高实时、高可用的分布式数据传输系统的技术实践。
51 0

热门文章

最新文章