导读: 携程每天处理数以亿级日志,如何做到实时低延迟、不丢失、查询高效,具有一定的技术挑战。本次分享抛砖引玉,将从下面四点切入希望能解开携程内部落地实践的面纱:Overview(携程监控体系整体架构)、Clog(携程日志系统)、CAT和TSDB。
此图为携程甚至是业界较为通用的广义日志监控系统整体架构。数据采集主要使用Agent和SDK(支持多种语言和协议)两种模式,而SDK支持厂商颇为丰富:CAT、Clog、Promethues、Opentelemetry等。客户端将采集到的日志传输至Collector中聚合与简单预处理。随后,Collector根据元信息与数据特征分发至Kafka的不同topic queue中,从而起到数据隔离与系统解耦的效果。
广义日志从数据模型上可被分为Log、Metric和Trace三类,这也是业界监控的三大基石。Log通常是一条一条的,用于提供系统/进程最精细化的信息。例如某个事件、访问记录等;Metric通常是可聚合的指标,例如某个站点每分钟访问次数;Trace则主要是跨进程、跨线程的调用链信息,用于全链路追踪。不同数据类型进入不同的通道(ETL、Analyzer等)进行处理,最终持久化在HIVE等离线数仓工具用于大数据分析,或TSDB进行时序聚合,或ES+HDFS构建检索系统。携程可视化UI主要使用Grafana(开源)和BAT(自研)。
Clog是一个应用日志不落本地磁盘,实时传输的日志系统,每天处理约2PB的日志数据,机器规模约40台物理机(32C128G)。下图(右)为日志检索的UI,用户可以使用任意分词搜索,也可以指定Tag或者标题等进行检索。
日志系统通常需要处理的数据量大,系统设计时应在保证数据不丢失的条件下尽可能保证吞吐量。因此,Clog系统具有以下特性:
①写多查少
决定了系统应该具有高吞吐,以及支持多条件组合的丰富查询功能。
②高性能写
为了提升写入性能,减少延迟,我们主要从内存缓存和磁盘IO两个方向入手。考虑到成本,我们采用HDD而非SSD。HDD性能依赖磁盘转速和机械臂的寻址速度,而随机写将引发多次寻址从而吞吐上不来。因此,我们在内存中维护Mem Block,当一个Block满或定时超时后,顺序写入磁盘。
索引上,对每一条日志建立一个索引(稠密索引)是可行的,缺点是索引空间开销大,优点是O(1)查询速度;Kafka是稀疏索引的代表,优点在于节省索引空间,缺点是O(logn)查询速度。考虑到日志系统写多查少的使用特点,且查询多为用户UI界面操作,对延迟敏感度不高,因此,稀疏索引的优势更为明显。
③条件组合查
结合具体的使用场景, 此系统最终的架构如上图(右)所示。数据进入Log Indexer时,首先会进入Mem Block中,Block含有几个元信息字段:appid(用于确定此Block属于哪一个应用)、time(时间偏移量)、size(该Block大小)。当Block装满或者到了固定的刷新时间,顺序写入磁盘。磁盘数据由后台线程定时进行Upload,包括日志数据和索引数据。日志数据存储于HDFS中;索引数据存储于ES中。一个Block对应一条到HDFS文件位置的索引,而为了支持条件检索,我们将日志中抽取的条件(例如应用、机器、时间、日志的title,tag等)构建到ES的倒排索引中。
查询时,Engine会根据查询条件到ES中匹配(可能会匹配到多条索引)。根据这些索引可以追踪到它们是由哪个Indexer标记,然后询问对应的Indexer机器是否可以提供数据。由于Indexer异步Upload到HDFS,因此Engine不直接访问HDFS,而是通过Indexer代理的方式获取日志数据。
Tracing,携程使用CAT。由140台物理机(32C128G)每天处理近2PB的数据。
①写多查少
CAT系统的特点与日志系统相似,都具有写多查少的特性。
②Traceid点
Traceid用于精准的单点查询某个trace瀑布流数据(上图左)。它的来源方式很多,比如通过日志tag得到,从报错信息中采集,或者根据CAT系统提供的样本中采样得来。
①HDFS
CAT系统使用HDFS文件系统来存储trace数据。
②文件数限制
使用HDFS系统时,有出现存储文件数量过多导致性能急速下降的问题。
③索引
CAT系统的索引也涉及到稠密与稀疏的选择。
V5存储方案由数据和索引两部分组成。若干条数据打包成一个Block写入Data文件中。V5采用稠密索引,即每条数据计算一条索引,占6字节,由Block在Data文件的Position(4字节)和数据写入Block的位置(2字节)组成,索引ID和CAT的message index一一对应。
V6旨在解决由V5存储方案引入HDFS文件膨胀后性能急速下降的问题。
携程应用总量和CAT服务端IP集合基本稳定,因此,我们去掉了V5文件名编码中的Ip维度,便能起到控制HDFS中文件数目的效果。
由于客户端ip从文件名编码中移除,意味着同一个应用的多个ip的索引数据将使用同一个Index文件,亦意味着V5中CAT message index与索引ID一一对应的条件不再成立,因此需要一个二级索引机制。
索引文件由多组4096个Segment组成,一组Segment中第一个Segment被称为Header,每个Segment包含4096条索引,每个索引占8个字节(5字节BlockAdd,3字节BlockOffset,相比V5的6字节变大主要是为了扩大Block大小)。Header的引入是为了解决某个客户端数据索引定位的问题,其存储了ip与Segment的映射关系。
Metric作为聚合指标数据,一般用于阈值告警通知。在Promethues出现前,携程借鉴了OpenTSDB的思路实现了一套内部的TSDB。该系统将所有数据和索引存储到HBase数据库,我们通过将Tag编码到HBase的rowkey中,来实现快速检索。后来,我们相关技术向VictorialMetrics时序数据库和ClickHouse列存数据库迁移。目前的VictorialMetrics系统规模是200台物理机(40C256G,4T SSD)。当基数(Tag维度组合)较多时,VictorialMetrics的性能会急剧下降,这是因为Metric到ID的映射关系缓存在内存中,当Miss后,将从索引文件中读取,大量文件解码将导致CPU持续高位,影响性能,因此内存决定了VM支持的基数有限。对于高基数的数据,我们引入了ClickHouse,当前规模600台物理机(32C128G)。
Q:日志的分词器用的是什么?
A:我们的倒排索引使用的是ES,我们的日志有一部分是支持倒排索引给出的维度的检索的,包括应用、机器、时间、等预设的固定维度。如果是用户info某一不带有任何标记的句子时,考虑到句子可能会很长(存储索引会很庞大),我们只截取前128个字节进行分词,并以message的方式放入倒排中进行检索。128字节之后的内容不支持精确检索,因此当查询到多条结果时,需要用户在浏览器中自行过滤。
Q:日志ETL 使用的是什么框架?
A:ETL使用的是内部自研的框架,主要用于做格式Format和预聚合。
Q:ClickHouse用做日志存储的优点是什么?
A:我们的日志包括比较杂乱的普通日志(例如:今天是个好天气)和较为规整的业务日志(例如:包含多维度信息的订单日志)。ClickHouse主要用于存储业务日志,它会提前为这些业务日志中的维度建立列,当然它也用于存储高基数据。ClickHouse的优缺点取决于需要使用的场景。例如,ClickHouse维度的列是固定的,当其维度增多时,性能会明显下降。相比之下,Clog的限制就比较小,并且它支持分词功能。
作者:曹东
来源:DATAFunTalk
本文为 @ DataFunTalk 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。