文章目录

  • 什么是全链路日志追踪
  • 为什么需要分布式调用链
  • 如何实现
    • 开源框架
    • 其他框架
    • 个人思考的实现思路
      • 基础框架代码部分实现思路
        • 唯一id生成策略
          • Snowflake算法
          • ObjectId
          • Redis
        • http请求及rpc请求拦截与日志实现
      • 日志收集组件考虑及选型
        • Elasticsearch与Click house的对比及选择

什么是全链路日志追踪

谷歌的一篇论文,论述了相关的概念。论文讲述了谷歌的大规模分布式系统全链路日志追踪基础设施Dapper。

论文下载地址

全链路日志追踪主要应用于大规模的、复杂的分布式系统之中。其中,有几个主要的概念:

  • trace_id:分布式全局唯一id标识,由系统第一个被调起的模块生成,并在各个span间传递;

  • span_id:区分模块用id,通过span_id和trace_id可以定位到具体的模块的一次请求;

  • parent_span_id:调用当前模块的父级模块span_id;

  • Cs CLIENT_SEND:客户端发起请求;

  • Cr CLIENT_RECIEVE:客户端收到响应;

  • Sr SERVER_RECIEVE:服务端收到请求;

  • Ss SERVER_SEND:服务端发送结果;

    另外,有些实现,会产生rpc_id去记录下一次完整rpc调用的链路;

    根据采集到的数据,可以还原一次调用链路的树状图,可以通过该树状图明确的看出各个服务间调用的情况,响应时间等数据,如下图所示:

通过论文的阅读可以知道,Dapper的实现思路是:

  1. 产生日志;
  2. 采集日志;
  3. 写表;

调用链的基本要求:

  1. 低开销;
  2. 应用层透明;
  3. 可扩展;
  4. 收集及时。

为什么需要分布式调用链

大规模的,复杂的分布式应用,大多会采用集群部署,一个服务会有多个服务器同时运行,而服务与服务间会相互调用。如论文中的这幅图,一个用户的请求,请求A,A通过调用B后,A又调用C,而C又需要调用D、E后返回。

一般一个请求,会请求不同的服务器,由不同的服务器完成各种的业务,而如果其中有一个服务产生问题,那么将会导致整个请求链路发生问题,对于工程师而言,需要及时定位并且解决线上问题,而线上哪台服务器出现故障、出现了什么故障是极难定位的,而且工程师无法熟悉每一个服务的情况。

所以需要一个监控,去监控线上各个服务的运行情况,记录下每一个请求从用户发起到最终响应的调用链路。报错的情况下,能够记录下对于报错的节点。

如何实现

开源框架

zipkin

开源地址

通过拦截器在请求前后分别埋点,但是曾经使用这个框架写过一个dome工程,引入该框架后,启动会变得很慢且卡,不过也可能只是个人使用不当的原因。

其他框架

  1. Google的Drapper

  2. 阿里-鹰眼

  3. 大众点评——CAT

  4. 京东-hydra

个人思考的实现思路

现在大多数的公司的实现思路基本上也与Dapper相类似,只不过各自实现不同。整体架构上,由基础架构实现各类id生成,日志记录等相关功能,由ELK/ELKB或者其他日志收集系统进行日志的采集,最终由日志分析系统分析对于的数据生成拓扑图,各种分析数据列表。

采用ELK/ELKB进行日志采集相对来说会比较简单,而且除了采集全链路日志外,而且网上有比较多的资料和实现方案,也是在实际工作中有遇到过的解决方案之一。然后,就像,其中ELK架构也不是一成不变的,其中各个部分都是可以采用其他组件进行对应的替代。例如Elasticsearch可以采用Hbase、HDFS、Click house等进行代替,Kafka采用redis、pulsar等进行替换,Logstash、Beats可以采用flume等进行替换,Kibana一般是需要根据实际需求去进行开发替代、二开或者一起用。

而该方案也不止可以用于采集全链路日志,Logstash可以对推送数据进行正则匹配后,将日志分发出去,如果要采样埋点数据,安全检查数据,sql执行数据等,都可以采用该方案进行实现。

基础框架代码部分实现思路

唯一id生成策略

Snowflake算法

Twitter开源的分布式ID生成算法,结果为一个long型id,其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID,12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。

该算法简单高效,生成速度快;时间戳在高位,自增序列在低位,整个ID是趋势递增的,按照时间有序递增;灵活度高,可以根据业务需求,调整bit位的划分,满足不同的需求。

ObjectId

MongoDB的ObjectID生成策略 MongoDB官方文档 ObjectID

Redis

采用Redis的原子操作来生成唯一id。

http请求及rpc请求拦截与日志实现

这两个相对简单,http采用Filter过滤器进行拦截,rpc如果采用的是dubbo框架进行实现(后面默认采用dubbo),则可以采用对应的Filter过滤器进行拦截,但是这两个过滤器是不同的,分属于不同的包。

而trace_id的传递,http可以通过InheritableThreadLocal进行传递,而rpc则需要通过上下文进行传递。

日志收集组件考虑及选型

Elasticsearch与Click house的对比及选择

Elasticsearch和Click house都是分布式设计的,Elasticsearch是底层是基于Lucenc,ClickHouse是基于MPP架构的分布式ROLAP(关系OLAP)分析引擎。

Click house在开发上,上手速度更快,因为其语法与SQL基本一致;在性能上,不管是写入还是查询的性能都及其优秀。

但Click house在2016年进行开源,相关资料比较少,而且版本间的区别有时候比较混乱,有部分问题需要使用指定版本进行解决,例如曾经遇到的写入内存溢出问题,Click house提供了对应的解决方案,而相关配置项配置后,却无法生效,最后升级到某个指定版本后,才解决了该问题。而且采用http协议与tcp协议进行连接查询时候SQL会有一定的区别。

ClickHouse 是一个真正的列式数据库管理系统(DBMS)。在 ClickHouse 中,数据始终是按列存储的,包括矢量(向量或列块)执行的过程。只要有可能,操作都是基于矢量进行分派的,而不是单个的值,这被称为«矢量化查询执行»,它有利于降低实际的数据处理开销。Clickhouse同时使用了日志合并树,稀疏索引和CPU功能(如SIMD单指令多数据)充分发挥了硬件优势,可实现高效的计算。Clickhouse 使用Zookeeper进行分布式节点之间的协调。

其优秀的性能也使得有些公司开始考虑将一些应用从ES切换到Clickhouse上。

相关参考:

Elasticsearch和Clickhouse基本查询对比 - 知乎 (zhihu.com)

分布式调用链路与Dapper论文阅读笔记 - 知乎 (zhihu.com)

36356.pdf (googleusercontent.com)

Welcome to Apache Flume — Apache Flume

ClickHouse 架构概述 | ClickHouse文档

全链路日志追踪系统介绍与思考相关推荐

  1. python轨迹追踪、全链路日志追踪trace_id实现

    python轨迹追踪.全链路日志追踪trace_id实现 非链路日志(普通日志) 我收到一个请求,参数是 我收到一个请求,参数是 我收到一个请求,参数是 我收到一个请求,参数是 我收到一个请求,参数是 ...

  2. 可视化全链路日志追踪

    可观测性作为系统高可用的重要保障,已经成为系统建设中不可或缺的一环.然而随着业务逻辑的日益复杂,传统的ELK方案在日志搜集.筛选和分析等方面愈加耗时耗力,而分布式会话跟踪方案虽然基于追踪能力完善了日志 ...

  3. 【Spring Cloud】Sleuth+Zipkin全链路日志追踪接入实战

    文章目录 一.背景 链路追踪介绍 为什么需要链路追踪? 那该如何解决呢? 二.常见的链路追踪技术有下面这些: 三.Sleuth 3.1.Sleuth(读作/sluːθ/)介绍 3.2.相关术语 3.3 ...

  4. 基于Spring Boot + Dubbo的全链路日志追踪(一)

    一. 概要 当前公司后端整体架构为:Spring Boot + Dubbo.由于早期项目进度等原因,对日志这块没有统一的规范,基本上是每个项目自己管自己的日志.这也对后面的问题排查带来了很大的困难,特 ...

  5. skywalking 9.x入门(二) skywalking全链路tid追踪

    这里是weihubeats,觉得文章不错可以关注公众号小奏技术,文章首发.拒绝营销号,拒绝标题党 背景 继上次我们对skywalking整体架构作了一些了解,然后就是学习了spring boot项目如 ...

  6. 卫星系统——酒店后端全链路日志收集工具介绍

    背景 随着酒店业务的高速发展,我们为用户.商家提供的服务越来越精细,系统服务化程度.复杂度也逐渐上升.微服务化虽然能够很好地解决问题,但也有副作用,比如,问题定位. 每次问题定位都需要从源头开始找同事 ...

  7. 腾讯SNG全链路日志监控平台之构建挑战

    作者丨吴树生:腾讯高级工程师,负责SNG大数据监控平台建设.近十年监控系统开发经验,具有构建基于大数据平台的海量高可用分布式监控系统研发经验. 导语:当前SNG全链路日志监控平台每日数据存储量10TB ...

  8. 腾讯 SNG 全链路日志监控平台之构建挑战

    原文地址:https://www.v2ex.com/t/406689 作者丨吴树生:腾讯高级工程师,负责 SNG 大数据监控平台建设.近十年监控系统开发经验,具有构建基于大数据平台的海量高可用分布式监 ...

  9. 调用链路_全链路日志分析解决方案介绍

    为何需要链路分析? 您是否了解运维环境的网络架构和业务系统架构?当业务升级或变更时,是否对已有的架构图及时作出更新?当发生故障时,是否能够快速判断哪个业务系统模块或接口出现了问题,是否能够快速判断故障 ...

  10. cat全链路监控_谛听全链路监控平台实践与思考

    一.项目背景 近几年,信也科技的研发技术伴随着业务的快速增长逐步演化为微服务化的分布式体系架构,但随之带来的系统间的上下游依赖关系的复杂度也呈指数级上升,已有的烟囱式的监控产品(CAT.ELK等)存在 ...

最新文章

  1. 刚刚,CVPR 2021论文接收结果「开奖了」
  2. mybatis 中#与$的区别
  3. linux awk(good)
  4. iview template模式_使用Iview Menu 导航菜单(非 template/render 模式)
  5. C++预处理程序指令
  6. 用dotnet自带的mail类发邮件出现的问题
  7. 简易拨号器iCall
  8. 程序员因拒绝带电脑回家工作被开除!获赔19.4万元
  9. 大话西游之仙侣履奇缘——[超经典台词]
  10. python之HTML文件转PDF文件,python之把HTML文件转换成PDF格式文档
  11. Matlab矩阵的运算
  12. colmak键盘_人小鬼大,ikbc 新款 Poker 2 机械键盘体验分享
  13. JavaScript 教程+代码(下)
  14. C++ 条件运算符 (?:)
  15. POJ 1436 Horizontally Visible Segments(线段树建图+枚举)
  16. requests模块
  17. uniapp 上传图片 + 预览图片 + 删除图片
  18. 【学习OpenCV】warpAffine函数实现图像旋转
  19. 第39课 程序中的三国天下
  20. (母婴商城)可行性分析报告

热门文章

  1. steam host修改
  2. 华为交换机基本配置命令明细
  3. 福特dms系统服务器,dms系统云服务器
  4. SSM中拦截器和过滤器
  5. 用K-Means聚类分析做客户分群
  6. matlab 汽车后视镜成像,相机成像原理及matlab仿真程序
  7. lisp pl线线段数_样条曲线转多段线lisp
  8. 非华为电脑安装华为电脑管家步骤
  9. brctl 设置ip_linux下brctl配置网桥
  10. 取消idm下载器和google浏览器的关联(让谷歌浏览器禁止使用idm插件)