摘要:
研究背景:如今,随着软件系统的结构越来越庞大,业务越来越复杂,运维人员很难对软件系统有着全面的了解。在日常的运维工作中,运维人员经常会因不理解系统的行为模式而导致无法对当前系统的运行状态进行正确的评估,降低系统的可用性。日志记录了系统运行过程中输出的所有信息,是运维人员分析系统行为,评估系统状态,定位系统异常的重要依据。然而,系统每日可能会产生大量的日志数据,纯粹人工分析日志的效率十分低下,难以满足运维人员的工作需求。因此,如何实现对日志自动分析以提高运维人员的工作效率,维持软件系统的高可用性是近年来研究的热点。
研究目的:在日常的运维工作中,运维人员经常会查询系统的日志以分析系统当前或过去的运行状态。这种针对日志的查询,除了传统的类SQL查询,还有一种基于日志模式的查询。以分布式存储系统为例,通常分布式存储系统增加一个新的存储节点的过程至少包含两个行为:“添加新节点”、“注册新节点为存储节点”。因此,“添加新节点”和“注册新节点为存储节点”,这两个行为的组成的序列即为一个日志模式,其反映了系统增加新存储节点的行为模式。当运维人员想判断系统是否正确添加了一个存储节点时,通常会查询系统添加存储节点的日志模式,以分析系统的真实情况。虽然,目前的商用日志管理和分析工具以及各类数据库能够很好地支持传统的类SQL查询,但是其无法高效地完成日志的模式查询。因此,本文的目的便是想要寻找一种算法,能够高效地完成日志的模式查询,辅助运维人员维护系统的稳定性和可用性。
研究方法: 为了高效地完成日志的模式查询,我们提出了一个新的日志存储和查询架构PLQ(Pattern-based Log Query)。首先,我们在分析了不同领域的日志后,发现日志具有数据局部性:相同类型的日志和包含相同参数的日志通常是在某些时间段内一起大量出现,而非随时间均匀地出现。因此,我们为PLQ设计了一种基于块的日志存储算法:对原始的日志序列基于时间窗口进行分段,将不同时间窗口内的日志,按照其所属的日志类型存储到不同的日志块中。日志块是日志存储和查询的基本单位。由于日志具有数据局部性,因此相比朴素地将单条日志作为存储和查询的基本单位,基于块的日志存储算法能够在保证查询准确性的情况下提高查询的效率。此外,为了高效地查询日志模式,PLQ中的日志索引均是位图索引,日志查询过程均是基于高效的位运算。日志包含四类数据:日志类型、时间戳、数值类型参数、字符串类型参数,每种数据类型,在PLQ中均有着不同的索引和查询算法。
为了验证PLQ的效率和有效性,我们利用了不同领域的日志数据,设计了不同的查询语句来测试PLQ的表现。此外,我们还对比了目前流行的几种日志管理和分析工具(Elastic Search、Splunk)以及经典的关系型数据库(MySQL),来评估PLQ是否在日志模式查询上有着更好的适应性。
研究结果:相比目前的日志管理和工具以及传统的关系型数据库,PLQ对于日志的模式查询有着更好的适应性。基于块的日志存储方案和基于位图索引的查询方案使得PLQ能够高效地完成日志的模式查询。此外,对于大数据量的日志和频繁更新索引的情况,PLQ依旧有着良好的表现。
研究结论:PLQ能够支持不同领域的日志模式的高效查询。我们相信PLQ能够帮助运维人员更好地完成运维工作,辅助运维人员维持系统的稳定性和高可用性。在未来的工作中,我们计划将PLQ优化为分布式的架构,进一步提高PLQ的表现。