Page 79 - 《软件学报》2021年第5期
P. 79
尤勇 等:一种监控系统的链路跟踪型日志数据的存储设计 1303
improves the storage efficiency by memory block which is designed for batch writing logs, and query efficiency by the structure of the
two-level index. Through analyzing the real on-line running data, the proposed scheme has sound performance in both write performance
and query performance.
Key words: monitoring system; log storage; two-level indexing
当前,软件系统和服务所处理的业务越来越复杂;相应的,软件系统的规模和复杂度也在逐渐扩大.与此同
时,为了支持高可用、高并发以及软件系统演进的同时持续提供系统服务,很多软件系统选择分布式部署的微
服务架构,并引入 APM(application performance management)系统来对系统的各个服务进行监控.相关监控数据
的采集和分析是服务监控的基础,开发人员通过对监控数据的分析,可以实时地了解到软件系统或者服务的运
行状态,并且在软件系统或者服务发生异常后,通过诸如指标数据或者日志数据分析出导致异常的原因,进而及
时处理故障,恢复服务.显然,分析并处理问题的实时性非常关键,这对监控数据的采集与存储提出了极高的要
求.在监控数据中,有一类日志数据,用以记录一个软件系统或者服务运行时的动态行为.此前,大部分日志采集
系统采用的都是集中的存储方式,但是随着业务扩大和用户数量的快速增长,日志数据量日渐庞大,再加上为了
及时性,还需要支持较高的读写性能,这种集中的数据存储架构越来越难以满足目前很多软件服务监控对日志
的存储和读写的要求.所以日志存储系统同样需要分布式架构才能满足整体的性能要求,通过存储集群的方式
对外提供日志的存储与查询操作.如果使用现有的 HDFS 技术来实现日志文件的分布式存储,虽然让存储集群
[1]
的整体性能提高很多,但是它需要对日志文件进行分块,并在集群的各个节点上存储副本 ,这样同时也增大了
磁盘存储压力.所以,设计一个更轻量的分布式存储架构也同样很有必要.该轻量的分布式架构能够满足日志在
存储集群中较为均匀地分布,使得存储集群整体的性能很高.
[2]
CAT 是美团开源的用于系统监控的项目,目前被广泛应用于国内多个行业的多个在线系统/服务中.截至
2020 年 6 月 30 日,CAT 在著名的开源软件平台 GitHub 上,同类型项目中的 Watch 数量(1.2K)、Fork 数量(4.4K)、
Star 数量(13.6K)等均居首位,这充分说明了该监控框架受欢迎的程度.CAT 支持多语言客户端,内部定义了多种
监控数据类型,Transaction 用于记录耗时较长的调用过程、Event 用于记录离散简单的事件、Problem 用于记录
异常、Heartbeat 用于记录 CPU/JVM 等心跳数据.Transaction 数据通过嵌套的形式表示调用关系.此外,logs 数
据同样会在项目的运行中生成.针对被监控服务采用 CAT 所产生的 Transaction 类型日志,本文对该类型数据设
计了一种存储方案,使用数据文件、索引文件分别存储对应数据,并在此基础上设计了两级索引结构,文中将对
该方案的系统架构与索引设计等进行详细的介绍.需要说明的是:本文将要讨论的日志数据为 CAT 中
Transaction 类型的监控数据,它同样是一种链路跟踪型(tracing)日志数据,在第 1 节中会对此类型数据进行介绍.
本文第 1 节首先针对单条日志的数据格式以及监控数据类型进行说明,提出设计方案面临的难点与挑战.
第 2 节针对日志数据的特点分析多个现有的存储方式,证明它们并不适合于存储日志;此外,分析两种索引结构
的优缺点,并提出本文存储方案的设计要求.第 3 节对日志存储的设计方案进行详细分析,并指出不足之处.第 4
节介绍存储方案的性能效果.第 5 节讨论本文索引结构的优缺点以及对可优化的问题进行说明,并提出适合的
解决方案.最后指出未来的工作,并对全文进行总结.
1 介 绍
1.1 链路跟踪型日志数据
通常情况下,监控系统会跟踪一次请求中所有的 RPC 调用和功能模块调用,并记录分布式中的调用节点关
系、节点内容的调用路径、部分参数值的等信息,并形成完整的调用链数据,此类型数据即为链路跟踪型数据
(tracing 数据).Tracing 数据是通常意义下的链路跟踪型日志数据,在微服务架构的广泛应用下,各个后端服务节
点之间存在大量的相互调用,所以记录一次调用中经过的所有节点、对应的某些参数以及节点内部的功能模块
调用,对于系统的运维有着至关重要的作用.在系统或者服务出现异常时,一条完整的 tracing 数据可以给开发人
员提供很好的问题排查依据.相关人员能够根据全链路数据梳理在一次调用中所有节点的依赖关系,从而定位