分布式调用跟踪系统的设计和应用学习
一、为什么需要分布式调用跟踪系统
随着分布式服务架构的流行,特别是微服务等设计理念在系统中的应用,业务的调用链越来越复杂,
可以看到,随着服务的拆分,系统的模块变得越来越多,不同的模块可能由不同的团队维护,
一个请求可能会涉及到几十个服务的协同处理, 牵扯到多个团队的业务系统,那么如何快速准确的定位到线上故障?
同时,缺乏一个自上而下全局的调用id,如何有效的进行相关的数据分析工作?
对于大型网站系统,如淘宝、京东等电商网站,这些问题尤其突出。
一个典型的分布式系统请求调用过程:
比较成熟的解决方案是通过调用链的方式,把一次请求调用过程完整的串联起来,这样就实现了对请求调用路径的监控。
二、调用跟踪系统的业务场景 1、故障快速定位通过调用链跟踪,一次请求的逻辑轨迹可以用完整清晰的展示出来。
开发中可以在业务日志中添加调用链ID,可以通过调用链结合业务日志快速定位错误信息。
在调用链的各个环节分别添加调用时延,可以分析系统的性能瓶颈,进行针对性的优化。
3、各个调用环节的可用性,持久层依赖等通过分析各个环节的平均时延,QPS等信息,可以找到系统的薄弱环节,对一些模块做调整,如数据冗余等。
4、数据分析等调用链是一条完整的业务日志,可以得到用户的行为路径,汇总分析应用在很多业务场景。
二、分布式调用跟踪系统的设计 (1)分布式调用跟踪系统的设计目标
低侵入性,应用透明:
作为非业务组件,应当尽可能少侵入或者无侵入其他业务系统,对于使用方透明,减少开发人员的负担
低损耗:
服务调用埋点本身会带来性能损耗,这就需要调用跟踪的低损耗,
实际中还会通过配置采样率的方式,选择一部分请求去分析请求路径
大范围部署,扩展性:
作为分布式系统的组件之一,一个优秀的调用跟踪系统必须支持分布式部署,具备良好的可扩展性
(2)埋点和生成日志埋点即系统在当前节点的上下文信息,可以分为客户端埋点、服务端埋点,以及客户端和服务端双向型埋点。
埋点日志通常要包含以下内容:
TraceId、RPCId、调用的开始时间,调用类型,协议类型,调用方ip和端口,请求的服务名等信息;
调用耗时,调用结果,异常信息,消息报文等;
预留可扩展字段,为下一步扩展做准备;
日志的采集和存储有许多开源的工具可以选择,
一般来说,会使用离线+实时的方式去存储日志,主要是分布式日志采集的方式。
典型的解决方案如Flume结合Kafka等MQ。
一条调用链的日志散落在调用经过的各个服务器上,
首先需要按 TraceId 汇总日志,然后按照RpcId 对调用链进行顺序整理。
调用链数据不要求百分之百准确,可以允许中间的部分日志丢失。
汇总得到各个应用节点的调用链日志后,可以针对性的对各个业务线进行分析。
需要对具体日志进行整理,进一步储存在HBase或者关系型数据库中,可以进行可视化的查询。
大的互联网公司都有自己的分布式跟踪系统,
比如Google的Dapper,Twitter的zipkin,淘宝的鹰眼,新浪的Watchman,京东的Hydra等。
Dapper是Google生产环境下的分布式跟踪系统,Dapper有三个设计目标:
低消耗:跟踪系统对在线服务的影响应该做到足够小。
应用级的透明:对于应用的程序员来说,是不需要知道有跟踪系统这回事的。如果一个跟踪系统想生效,就必须需要依赖应用的开发者主动配合,那么这个跟踪系统显然是侵入性太强的。
延展性:Google至少在未来几年的服务和集群的规模,监控系统都应该能完全把控住。
2、Drapper的日志格式:
(1)dapper用span来表示一个服务调用开始和结束的时间,也就是时间区间。
dapper记录了span的名称以及每个span的ID和父ID,如果一个span没有父ID被称之为root span。所有的span都挂在一个特定的trace上,共用一个traceID,这些ID用全局64位整数标示。
Drapper如何进行跟踪收集:
分为3个阶段:
①各个服务将span数据写到本机日志上;
②dapper守护进程进行拉取,将数据读到dapper收集器里;
③dapper收集器将结果写到bigtable中,一次跟踪被记录为一行。
(2)淘宝的鹰眼
关于淘宝的鹰眼系统,主要资料来自于内部分享,
鹰眼埋点和生成日志:
如何抓取和存储日志:
鹰眼的实现小结:
详情见:淘宝-分布式调用跟踪系统介绍
参考资料:
分布式追踪系统dapper
DLRover:蚂蚁开源大规模智能分布式训练系统 本文整体介绍了 DLRover 的项目动机与核心能力,未来我们会发布一系列文章,来从同步/异步弹性训练,优化策略服务,多种集群和训练框架对接,策略定制开发等多个角度来介绍 DLRover 的更多细节,敬请期待。
NetCore开发的分布式文件上传系统 一个基于.Net Core构建的简单、跨平台分布式文件上传系统,支持分块上传、多个项目同时上传、接口权限控制采用JWT机制。
推荐一个基于.NET Core 3.1开发开源的分布式任务调度系统 基于.Net Core构建的简单、跨平台、模块化的分布式任务调度系统。界面清爽大气、功能完备、高可用、数据安全,代码结构清晰,开发效率高,整体来说一个非常不错的系统。
相关文章
- 【超实用】3 分钟,教你用 Docker 部署一个 Python 应用!
- IM通讯协议专题学习(八):金蝶随手记团队的Protobuf应用实践(原理篇)
- Android系统服务DropBoxManagerService详解与实践应用
- 数字化 IT 从业者知识体系 | 应用部署与管理 —— kubernetes架构
- 用哪种语言写的应用漏洞最严重?六大主流语言代码漏洞分析报告出炉
- 【Android 逆向】Android 系统文件分析 ( /system/ 系统命令和系统应用数据目录 | /system/app/ 系统应用目录 | sys Linux 系统内核文件目录 )
- Tanzu Application Platform 的应用模型
- GPS北斗卫星授时服务器在高速机电系统中的应用阐述
- ANDON无线安灯系统拉绳盒应用场景
- 谷雨时节,突破传统农业的物联网网关技术应用
- python+mysql+flask创建一个微博应用(持续更新)详解大数据
- MySQL在CAS系统中的应用(casmysql)
- Oracle触发器:分类及应用(oracle触发器类型)
- DB2数据库在Linux系统上的应用(db2数据库linux)
- 将你的应用迁移到 Python 3 的三个步骤
- 探索Linux qws:轻量级窗口系统的优势与应用(linux-qws)
- Linux 系统中 ANSI 编码的解释及应用简介(linuxansi)
- JNA在Linux上的应用(jnalinux)
- 提升经营效率:Oracle ERP系统的应用(oracleerp系统)
- Linux应用轻松驾驭:25个最受欢迎的linux系统应用推荐(linux系统的应用)
- 构建不用MSSQL数据库如何构建应用系统(无mssql数据库)
- 探秘Apache在Linux系统中的应用与优势(apachelinux)
- 探析嵌入式系统中的Linux应用技巧(linux嵌入式)
- 开启Linux系统新时代:赋能应用发展之路(linux系统及应用)
- MySQL中的OVER函数窗口函数的高级应用(mysql中over函数)
- 循环语句的应用详解MySQL中for(mysql中for)
- MSSM应用Oracle促进决策力(mssm oracle)
- 的应用Web开发中Redis的助力极大提升项目效率(web项目中redis)
- Oracle中集合函数的应用(oracle中的集合函数)
- REDIS锁技术提升NET应用性能(redis 锁 .net)