华人澳洲中文论坛

热图推荐

    货拉拉全链路监控体系的落地与理论

    [复制链接]

    2023-3-5 06:41:05 22 0

    导读跟着业务开展和买卖繁杂度的不停晋升,出产问题的延迟发现和疾速排障成为一个首要的话题,明天将与大家分享货拉拉是如何落地全链路观测。
    明天的引见会环抱上面五点展开:
    1. 监控演进史
    2. 货拉拉监控体系架构
    3. 监控埋点“弯道超车”
    4. 全链路 Trace 建立
    5. 可视化建立 – “所见即得”
    分享佳宾|曹伟 货拉拉 架构师
    编纂整顿|KS icbc sdc
    出品社区|DataFun
    01
    监控演进史
    首先和大家分享下互联网行业监控的演进史。


    首先咱们看一下全部监控行业的演进历史。
    较早的是 2002 年 eBay 的 CAL 这么一个全链路监控产品,在 eBay 外部也被大面积的应用,是他的前资深架构师吴其敏主导研发的。
    而后是 2010 年谷歌的 Dapper,这是外部做的一个监控产品并无开源,不外颁发了一篇 Dapper 论文,是前面得多监控产品的始祖,大部份都是基于 Dapper 论文的完成和演进;同年泛起一个商用产品 Datadog,功用对比片面,是行业一流的标杆产品。
    20十一 年吴其敏从 eBay 到职来到美团,开发了 CAT,至关于 CAL 的 Java 版完成,同时做了得多的优化、迭代,将 CAT 在开源畛域发挥光大,在全部开源监控畛域遭到的欢送水平对比高,总体的掩盖率也至关的高。
    20十二 年 Twitter 开收回了 Zipkin,至关于 Dapper 的开源完成。同年阿里也在搞他的 Eagleye(鹰眼)监控,韩国的一个 Pinpoint 也泛起了,值得说的是他是基于字码加强技术来完成监控数据埋点,有个亮点是他的埋点十分的粗疏,细究竟层办法维度,同时这也是个缺陷,由于埋点多多少少会有点机能消耗,其次他会致使单个 Trace 数据的收缩。
    2014 年,饿了么开始搞 EMonitor,他对用户的一个排障思绪的疏导,以及用户体验都做的十分好,是我用过一切监控外面最佳的一个产品。货拉拉的全链路监控体系的得多思想都是鉴戒于他的,好比说咱们的“所见即所得”的思想是如何应用到监控可视化建立中的。
    2015 年,华为的吴晟开发了 skywalking 而且将他开源,近年开展还挺好的,参加了 Apache 基金会,在以后的监控畛域仍是对比受欢送,特别是他在微办事体系这块反对的对比好,所以遭到得多中小型公司的追捧,乃至一些大公司也在用。像咱们货拉拉的全链路 Trace 办事早期也是基于他结合货拉拉场景进行深度定制开发的,期间也通过几回大的架构降级,这个在前面会具体的说。
    比来的是 2016 年 Uber 的 Jaeger 是基于 Go 言语来完成,滴滴外部也在使用,目前也开源了。


    接上去看一下货拉拉演进史,共分为三大阶段:
    (1)监控 1.0 时代
    各个业务团队独立保护一套 Prometheus 监控体系,也没有全链路 Trace 监控,不足一致规范,更别说治理才能了,夸大一点说,得多时分是客服接到投诉后把问题反馈给业务,业务才知道零碎泛起问题,而后再去排障,所以效力极为的低
    (2)监控 2.0 时代
    咱们开始制订规范并逐渐一致监控,进行监控治理,推动业务根底监控全掩盖,得益于字节码加强技术帮忙咱们完成业务“零代码”革新疾速接入根底监控,完成监控“弯道超车”,Java 中心办事监控 100% 掩盖。同时咱们也自研一些根底监控页面,结合着 Grafana 大盘来知足日常的监控场景。咱们在中期也开始从 0 搭建全链路 Trace 办事,自研智能告警体系。
    (3)监控 3.0 时代
    这个阶段咱们次要针对各个监控畛域专项做深度迭代和打磨,好比 Trace,咱们完成错、慢、中心办事残缺全采样,在不影响业务排障体感的条件下,将总体存储本钱升高 60%。另外一方面,因为历史缘故 Metric、Trace 和 Log 都是各个团队独立保护的,不足较强的关联性,总体监控体系的价值得不到最大化,所以咱们在这个阶段将他们和业务之间的目标做一个闭环的买通,来进步业务总体的排障流利度。同时咱们从新自研根底监控和业务大盘页面,给业务提供更智能便捷的大盘自助配置才能。
    (4)监控 3.x 时代
    目前实现了目标瘦身,自研 Prometheus 集群 manager,将 Trace 存储从 HBase 切换到 KV 存储,存储本钱升高 90%。也落地了一部份根因剖析、办事的调用拓扑的功用。
    02
    货拉拉监控体系架构


    这是货拉拉 3.x 的架构图。从下往上,最底下方是 Prometheus,它担任从多个维度收集数据,并上报数据到两头的 VictoriaMetrics 集群,这是一个时序数据库,次要做一些计算剖析,供下层展现和智能告警。右侧的 ES、HBase、Kafka 是为下层 Trace 办事提供存储和计算才能。
    总体的架构就是Metric 体系由 Prometheus 加之 VictoriaMetrics 搭建而成,Trace 部份间接使用 Skywalking 的 Trace 模块,再结合货拉拉的场景做了深度定制,造成了全链路 Trace 办事的架构。
    货拉拉的监控埋点体系残缺掩盖了客户端、办事端、根底设施、DB 等各种组件的不同版本,能知足货拉拉一切业务的埋点诉求,这是经过字节码加强埋点完成的。
    传统的埋点需求做侵入式革新,好比说需求对 SDK 做二次封装或者修正源码,同一个产品的不同版本都需求区分处置,保护本钱很高,限度较多。而字节码加强经过对代码的阻拦进行埋点,保护本钱很低,业务零代码革新,一键接入,十分便捷。
    03
    监控埋点“弯道超车”
    1. 字节码加强技术引见
    上面引见下字节码加强技术。


    字节码加强技术能够分两块来谈,第一块是如何修正,这是字节码加强的框架要做的事。第二块是修正完的字节码如何失效?这是经过 Java Agent 完成的。


    2. 字节码加强框架选型
    框架方面,主流框架有 ASM、Javassist 和 Bytebuddy。
    ASM是字节码加强的始祖,不少工具都是基于它二次开发完成的,然而它的学习槛较高,需求相熟偏底层的汇编指令和 Class 文件的数据构造,经过硬编码伎俩编写加强逻辑,Debug 也不太不敌对。
    第二个是Javassist,是日本一个传授的开源产品,比 ASM 要简略一些,然而仍然需求硬编码,Debug 不敌对。
    第三个框架是Bytebuddy,十分容易上手,彻底遵守 Java 编码习气,能够 Debug。
    货拉拉对这三种框架进行了对比,终究选定了Bytebuddy


    3. 字节码加强失效机制阐明
    修正后的字节码是如何失效?次要是经过 Java Agent 技术完成的。咱们知道 Class 文件终究会被加载到 JVM 内存待使用,字节码有 2 个契机被修正:
    一是加载的过程当中触发阻拦,触发字节码修正举措,最初将修正后的字节码数据加载 JVM 得以失效;
    二是曾经实现加载的 Class 数据也是能够从 JVM 中被获得、修正后掩盖原数据达到加强成果。
    下图是 Java Agnet 的民间原理图,它有两个类,Agent.class 和 Mytransform.class,Agent.class 中有一个 premain 办法,望文生义就是在 main 办法履行以前履行,他做的事很简略,就是往 JVM 外面注册一个 transform,大家留意看 transform 办法的入参,有一个字节数据,这就是原生的 class 文件,经过外部字节码加强工具的修正,能够减少一些自定义的逻辑,之后以前往值的方式交还给 JVM 被加载到内存里完成修正成果。


    举个简略的例子,一个 Base 类和一个 process 办法,想要达到的成果是:在 process 履行先后各加一行 staRT 和 end 的输入。硬编码个别就是在办法外面写死,下图展现的就是字节码加强,拿到这个 base 类,而后找到它的 process 办法,而后 insert before,insert after 加两行输入就 OK 了。


    04
    全链路 Trace 建立
    1. Trace1.0 架构


    1.0 的时分,间接使用原生 Skywalking 的架构,抽出其 Trace 模块,数据寄放在 ES 里。然而跟着业务接入,发现无奈撑持全量货拉拉的业务数据,而 ES 的程度扩展的本钱较高,其存储架构不合适放 Trace 这类大数据量的数据,因此咱们进行架构 2.0 的降级。
    2. Trace2.0 架构


    架构 2.0 做了两个大的改变:一是把数据的收集和消费做了拆分,收集到的数据发送给 Kafka,由 Kafka 消费做数据剖析和存储;二是数据寄放在 HBase 中,将 ES 作为索引使用。这个架构能够撑持百万 TPS 的 Trace,也能够经过程度扩容撑持更大体量的业务接入,然而 Trace 体量过大存储本钱太高的问题也急需解决。
    3. Trace3.0 架构


    Trace 存储的困难经过更精密化的 Trace 采样解决。


    Trace 的采样形式有得多种,这里咱们先引见下 Skywalking 原生的惯例采样形式,实际上是一种惯例、无差异的采样伎俩。那末他是怎么做的呢?咱们先简略理解下 TraceID 的构造,他次要由 3 段组成,最后面是 PROCESS_ID,简略了解为 UUID,两头是个线程 ID,第三段是咱们对比关怀的毫秒级时间戳加之一个自增序列,原生 Skywalking 取这个时间戳的毫秒级的千位数据段来制订采样规定,好比说 Trace 知足毫秒数据段小于 100 就保存,从而来达到 10% 的采样率成果。这类惯例采样简略易完成但仅凭 TraceID 无奈筛选出有价值的数据。
    所以咱们提出此外一种计划,就是更深化一点,从 Trace 详情数据动手。咱们能够看到这个 Trace 的构造是由多个 Span 组成,Trace 维度包孕 APPID、Latency 信息 Span 维度又包孕耗时、类型等更细粒度的信息,按照不同的 Span 类型设置不同的阈值,好比近程调用 SOA 耗时大于 500ms 能够以为是慢申请,而假如是 Redis 申请,阈值就需求设置小一些,好比 20ms,经过这类形式能够将慢申请规定更精密化,一样能够经过判别 APPID 是不是为中心办事来过滤保存中心办事的 Trace 数据。
    4. Trace3.x 架构
    3.x 架构中,做了两个大的晋升。


    一是使用自研了 KV 存储取代了 HBase,大幅升高了存储和计算本钱。HBase 会做一些额定排序合并的举措,十分耗 CPU,货拉拉自研的一个 KV 存储计划,针对 Trace 场景优化了它的 LSM Tree 的合并规定和频率,切换后吞吐率失掉了晋升,而且存储大幅升高,计算本钱升高到 90%。
    二是保障了 Trace 链路的残缺性。


    下面解决了差别化、精密化采样,但还有个辣手的问题,就是在采样时如何包管链路的残缺性?解答这个问题前,让咱们先理解下甚么是链路残缺性?
    这里举个例子,如图当初有一条近程调用,通过 ABC 和分支 AD。这里有个条件就是 ABCD 它是 4 个不同的办事,独立异步上报 Trace 数据没有严格的时间程序。在 B 调用 C 泛起异样时,咱们能轻松辨认到并将 B 和 C 的 Trace 数据段采样到,只保存 B 和 C 的这类状况,称为部份采样。然而在实际的一个排障过程当中,咱们还需求 A 和 D 这条链路数据作为辅佐信息来反对排障,所以最佳的形式是把 ABCD 都采样到,作为一个残缺的异样链路保留起来,这称为残缺采样


    接上去看下咱们是怎么解决的?简略说咱们基于 Kafka 提早消费 + Bloom Filter 来完成残缺采样。
    好比说咱们 Kafka 有两个消费组,一个是实时消费,一个是提早消费,实时消费每条 Trace 数据时会判别下是不是知足咱们的采取规定,假如知足就将 TraceID 放在 Bloom Filter 里,此外一方面延时消费组在半小时(可配置)开始消费,从第一条 Trace 数据开始消费,针对每条 Trace 数据判别 TraceID 是不是在 Bloom Filter 中,假如命中了,就以为这条 Trace 应该被保存的,从而能做到全部 Trace 链路的残缺采样保留。
    此处有一个细节需求阐明,图上的 Bloom 使用的是 3 主 3 从 1C4G 的 Redis 小集群,经过一个取巧的计划完成了百万 QPS,用 Redis Bloom 构建出一个当地 Bloom,第一次从近程查问并构建了一个当地 Bloom,后续都是走当地,这样就极大升高了对 Redis 集群的查问压力,这也是这么低配的 Redis 集群能撑持这么高 QPS 的缘故。
    基于以上架构,完成了错、慢、中心链路的残缺采样。
    05
    可视化建立 - “所见即得”


    接上去,这一章节次要带大家看看咱们在监控可视化建立中如何应用“所见即所得”思想的。首先看下咱们的根底监控大盘页面,左侧次要有一些 Exception、Http、SOA 以及中心根底办事的一些目标数据。咱们的一大亮点就是一切的曲线均可以经过点击展现出详细的 Trace 页面。针对 QPS、RT 标高曲线能够点击查看 Trace 详情,进一步排查异样点。


    要完成所见即所得的顺滑的排障体验,就必需买通独立保护的 Metric、Trace、Log 和业务数据造成闭环。那末咱们是如何买通的?其实重点就是建立对应数据构造的映照瓜葛。咱们能够从左往右看映照瓜葛图。
    首先是 Metric 数据,包孕 APPID、Name、Tags 和时间戳等症结信息,这些信息均可以作为 Trace 列表查问入参,到 ES 里查到对应的 Trace 根底信息列表,再经过 TraceID 从 HBase 中查问 Trace 详情,包孕总体调用链的 Span 列表,终究构建出Trace调用链展现到前端。
    同时Trace 和 Log 之间经过 TraceID 建设很强的关联瓜葛,业务在接入监控后每条 log 都会自动添加 TraceID 数据以此来建设强关联。
    再看右侧的业务数据,咱们反对业务代码中自在埋点,以 Trace Tag 的方式将业务数据(OrderID、UserID、DriverID 等)埋到 Trace 数据中,这样就将业务数据和详细的 Trace 关联上了,同时咱们反对按照 OrderID、UserID 等业务参数查问对应的 Trace 列表,这样就把各方面数据串连起来了。


    在这个这套体系出来以前,业务大部份都是经过日志外面查症结字来进行第一步的异样发现和排障,效力十分的低。当初首先是从 Metric 目标页面去看哪些 QPS、RT 飙高,而后点击曲线看 Trace 链路,查看异样调用栈,假如还看不到有用的信息再点击跳转到 TraceID 对应的日志外面查看。全部排障思绪和伎俩更高效、标准,至关于从新定义了业务的排查思绪。
    06
    总结


    首先从价值层面,无论是自研仍是基于开源解决计划深度革新或是外购商用的全量监控体系,都会很大幅度晋升全局不乱性,一方面能够帮忙疾速定位问题,另外一方面,对微办事治理也有很大的帮忙,ROI 很高。
    其次,从开展的角度,后续会做一些自研的存储,好比说曾经实现从 HBase 到自研 KV 存储的切换,前面也会自研一个时序数据库存储 Metric 数据。此外正在钻研、落地根因剖析方面的任务,来进步排障效力,还有目标和告警的联动等等。
    最初,货拉拉的全部平台都是基于开源产品搭建起来的,因此也但愿无机会能够回馈开源社区,此次分享也是回馈社区的一种形式。
    明天的分享就到这里,谢谢大家。
    |分享佳宾|


    |《数据智能常识地图》下载|
    上下滑动????,查看《数据智能常识地图》数据湖模块,残缺版请关注大众号“大话数智”下载


    |DataFun新媒体矩阵|


    |对于DataFun|
    专一于大数据、人工智能技术运用的分享与交流。发动于2017年,在北京、上海、深圳、杭州等城市举行超过100+线下和100+线上沙龙、论坛及峰会,已约请超过2000位专家和学者参预分享。其大众号 DataFunTalk 累计出产原创文章900+,百万+浏览,16万+精准粉丝。

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    返回列表 本版积分规则

    :
    中级会员
    :
    论坛短信
    :
    未填写
    :
    未填写
    :
    未填写

    主题37

    帖子49

    积分221

    图文推荐