更新时间:2024-05-25 20:55:03

开发一个业务应用或者一个组件,内部都会引入比较完备的日志模块用于记录服务运行的状态,通常日志类型包括:ERROR、WARN、INFO、DEBUG四种常见的类型。根据日志信息发现问题,寻找解决问题的入口基本上是排查问题的主要方式。

现代系统日志数据一般有规模大、种类杂、来源多、应用广、要求高、峰值大的特点。大型系统每天大约会产生数TB甚至更多的日志,作为一个日志存储与分析的平台,每天需要接收并处理的日志量同样是巨大的。高效的写入与搜索是衡量一个日志平台的关键核心点。对日志平台的写入与搜索进行不断的性能优化,不断的稳定性增强伴随着日志平台的始终。

 

数据写入的挑战

➢  高性能写入

日志系统通常的处理流程包括采集--解析--存储--检索4个主要步骤,整个流程对写入性能的要求往往很高。各个采集端采集过来的日志,经过解析后需要快速写入存储引擎以满足检索层的实时查询需求。检索层对查询操作具有一定的实时性要求,比如:当前时刻用户是希望在日志系统中查询出此时刻某个类型的业务,如果无法保证高性能的写入,则实时性的检索操作必然会受到影响。

一个日志系统每秒钟至少要写入上万条数据且数据不是简单的Append-Only处理,其内部会构建比较复杂的数据结构用于高效查询,这同样会影响写入的性能。因此,高性能的写入是日志处理平台的一个难点,更是一个挑战。

➢ 写入可靠性

数据落盘背后对应着IO操作,提升写入性能的前提是尽可能减少IO操作次数。因此通常会以写入异步化的方式处理数据,即数据先写入到OS Cache 内存中,当数据量达到一定大小(比如:1GiB)或者一定时间(比如:2分钟)后,再统一将OS Cache中的数据写入磁盘,提升写入性能。

虽然工业界在处理写入性能方面均采用异步化的方式,但这种方式也有弊端。比如:当机器掉电后,存放在OS Cache中的数据将会丢失,因此在提升数据写入性能的同时如何保障数据的可靠性同样是个难点。

 

数据搜索的挑战

➢ 高性能检索

海量日志数据的高效搜索对于任一日志系统来说都是非常必要,且具有很大挑战性。从计算机硬件来看,内存属于半导体元件,而磁盘属于机械器件,因此若数据全部加载进内存,对应的处理速度会有比较显著的提升。

然而,实际生产环境中往往是有限的机器资源,却面临着海量规模的数据。如何高性能的对海量数据进行检索,如何在海量的数据中快速检索出想要的数据是,这都是日志处理系统亟需解决的难点问题。

➢ 搜索精确度

数据搜索中,搜索出的文档与检索关键词匹配度越高说明搜索精确度越高。OpenSearch系统通过引入打分机制来衡量当前匹配程度的情况。这里有个基本矛盾点在于,底层遍历的数据量越大,其打分机制越精确,检索出的结果越精确。日志系统底层存储大多采用分布式的方式进行分区存储。对某一检索字段的打分是以分区数据为单位进行的,分区之间的计算是独立的,这样就会导致某些分区匹配度不高,即因为数据量很小得出了很高的分数,最终搜索结果排名靠前。此搜索场景检索出的结果就存在一定的误差。