前言
近些年在开源领域,用于构建日志系统的软件有两类典型:
- Elasticsearch:基于 Lucene 构建倒排索引提供搜索功能,DocValue 存储支持了其统计分析能力。
- Clickhouse:列式存储是其优秀 OLAP 性能的保障。
这里把上述系统归入 schema-on-write 系列。百花齐放,本文介绍三款 "schema-on-read" 类型日志系统。
为什么是打了引号的 schema-on-read?尽管几家厂商对外宣传关键词常常用到 index-free、schema-less,但从技术角度应该理解为一种轻量级索引技术,将大部分计算成本后置到使用时发生。它们的出现有其背景:
- 技术能力:硬件技术快速发展,云计算 IaaS 资源(计算、存储、网络)已足够便宜、弹性。
- 客户诉求:近两年市场紧缩,企业的 IT 预算更加精细。
- 场景固化:相当比例的日志使用场景具有写多读少、随时间变长热度降低特性。
Humio
简介
Humio 是 2016 年成立的一家英国公司,2021 年 3 月被 CrowdStrike 收购($352 million 现金加 $40 million 股票期权)。产品提供日志的搜索、统计、仪表盘、告警服务。
数据路径
Humio 用 Kafka 充当数据 buffer,落盘数据到内置存储供查询分析。可以开启投递到 S3。
由于轻索引方案延迟表现不满足告警、仪表盘场景,但大部分时候它们的 query 模式固定,且按时间顺序进行。Humio 的方案是流计算,在数据摄入的 pipeline 中计算告警和图表:
- 只处理实时数据。
- 数据不需要排序。
- 数据都在内存中更新。
存储
内置存储主要服务的是日志搜索、分析场景,数据的压缩、索引对于后续的计算性能有决定性影响。
Humio 将数据按照 bucket 排列,在 bucket 上做好一些标签,标签内容包括:
- 数据的时间区间。
- 数据的来源、类型。
- 基于数据 key-value 的 bloom filter(增加 4% 存储以支持随机关键词)。
bucket 标签实际是一种粗粒度的索引,区别于以往对单条日志的细粒度索引。query engine 在计算时根据标签信息判断数据是否可能在 bucket 内,只读取相关的 bucket 数据。
计算
Humio 语法是管道式 SPL:
#host=github #parser=json
| repo.name=docker/*
| groupBy(repo.name, function=count())
| sort()
对应的执行计划:读数据、标签过滤、扫描过滤、聚合计算、结果写出。