分布式监控系统

痴心易碎 提交于 2019-11-28 04:23:56

在一个大型分布式系统中(一个完备的云计算系统也是一个巨无霸的分布式系统) 任何一个client的请求调用,会在分布式系统中产生上百次的调用(各种缓存、中间件、数据库、微服务),一旦一个请求异常;那具体到哪个系统服务异常就变得很重要的;【在分布式监控系统比较低级时,比如只能监控某一个微服务的运行情况:这时就需要一些人力来保证整个链路的问题的及时发现,一个人维护100个系统的稳定性,知道哪个系统是否异常,通过这种方式来第一时间知晓哪个系统出现问题】。如果开发一个完善的分布式系统,可以清晰、直观的看到任何一个请求在分布式系统里面任何一个调用的详细情况,就可以在第一时间进行发现问题,这样效率很高!

那怎么样设计和开发一个分布式跟踪监控系统呢?下面我们就慢慢说来:


1 分布式调用跟踪和调用链的介绍

文章基于Goolge 的分布式调用系统Dapper 的理解来讲的,如果有不正确的请指正:

  • 分布式调用跟踪:就是前端的一次请求产生的分布式调用汇总起来分析;同一次前端请求产生的网络调用就组成了调用链
  • 调用链:调用链一般用树壮结构来展示的,一个调用链的入口开始,根据调用的时间顺序,依次用展示出来,并显示每次调用的状态和耗费的时间latency
  • 调用链的一个重要的信息就是:访问各个节点的先后顺序、节点的状态是否正常、节点的latency


2. 调用链实现原理简介

因为同一时间中间件的调用有很多,所以首先需要区分这次调用是哪个调用链的;我们在前端请求到达前端的业务处理服务器时【web 服务器】会执行Dapper 的埋点逻辑,
所谓的埋点逻辑包括2个步骤:
  • 给请求分配一个全局唯一的id:为了保证唯一2的64次方,后面的网络调用会统一用这个id 来标识、查询
  • 把这个id存放context(上下文调用中),这个context 存储在线程的ThreadLocal 里面(ThreadLocal 线程本地变量是每个线程自己维护的变量,对其他的线程是透明的);这样每个id都可以在自己的线程中进行记录,这样每次调用精确到线程级别都是可以调用的。

3. 调用链的调用顺序和嵌套关系

因为网络调用是复杂的,所以网络调用的顺序和嵌套关系是分布式跟踪系统非常重要的一环,所以我们需要通过另外一个id编号建立网络调用的层次关系


  • 上面的应用A 作为此次服务链调用的入口(并不一定是此次服务链的入口)
  • 应用A 并发访问的有3个:应用B、应用C、中间件;分别是0.1 0.2 0.3 这3个是一个层级的
  • 应用B 并发访问2个应用:0.1.1 0.1.2 ;其中0.1 是应用A访问应用B的,这样就能很好的设计和描述


4. 分布式数据的透传

Dapper 建立了一套分布式数据透传的机制,比如上面说的2种id都是在每个请求中把这2个数据都透传到下一个网络调用中;这套透传的机制可以用在业务或者监控系统中;

比如如果想要把一个数据透传下来,需要整条链路的改动,现在如果借助这个透传机制,就可以把数据写在上下文中,在整个链路中都能获取到这个数据。


5. 数据的持久化

  • 持久化的磁盘
我们在每个节点都获取了跟踪数据,这时我们需要把这些数据都持久化到磁盘中,以便后面的动作需要这些数据。所以我们需要把所有的信息都记录到磁盘上;再通过一些列的机制收集到大数据的计算平台,进行计算、查询、处理,最后呈现给用户进行使用

  • agent 汇报给 server 并展示
也可以每个节点启动一个agent,分布式跟踪系统获取到数据后通过agent 发送给server 端,并通过server 进行展示和一些列的保存;


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!