分布式链路追踪系统的存储优化

本文介绍了针对分布式链路追踪系统存储的优化过程,包括从磁盘存储到重回HBase的解决方案。通过Span聚合、DirectByteBuffer、PreAllocate等优化,实现了查询延迟从小时级降至毫秒级,并构建了内存、磁盘、HBase的三级缓存结构,有效平衡性能与成本。
摘要由CSDN通过智能技术生成

背景

链路追踪是微服务中排查的利器,用一个 TraceId 就可以串起整个调用链路的所有环节,对排查一些生产问题帮助很大。但是目前公司自研的链路追踪系统因为资源限制,数据处理延迟很严重。本篇文章分享实习期间对链路追踪进行优化的过程。

实现原理

我们先简单的认识下一个典型的链路追踪系统:

如下图所示,如果想知道一个请求在哪个环节出现了问题,就要知道这个请求调用了哪些服务,调用的顺序和层级关系。这些调用信息像链条一样环环相扣,我们称之为调用链。

p1.png

p1.png

而在这条链中,每个调用点,比如服务A对服务B的调用,服务B访问数据库,我们称之为 Span。将一次请求看作一个 Trace,使用唯一的 TraceId 标识,通过 SpanId 和 ParentId 记录调用顺序和层级关系,使用 Timestamp 记录调用的各项时间指标。

把 TraceId 相同的 Span 都整合起来,就可以绘制出这个 Trace 的调用情况图,帮助分析问题。如下图所示:

p2.png

p2.png

存储系统架构

Trace 的数据有以下特点:

  1. Trace 的 Span 数量各不相同:有的 Trace 只有一个 Span,有的 Trace 有上百个 Span。

  2. 数据量大:我们每天需要收集 8千万+ Span,这些 Span 组成 1千万+ Trace。

借鉴 Google 的 Dapper,我们选择 HBase 来存储 Trace 数据,它支持超大规模数据存储和稀疏存储动态列的特性可以满足存储 Trace 的需求,存储格式如下:

p3.png

p3.png

p4.png

p4.png

为了避免海量的 Trace 数据对 HBase 的冲击,我们使用 Kafka 在中间缓冲。Consumer 节点从 Kafka 拉取到 Span 后,以 TraceId 作为 RowKey,SpanId 作为 ColumnKey 存到 HBase 中。

问题

这种方式受限于 HBase 的写入速度(公司的的 HBase Trace 集

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值