上图展示了日志应用的几个阶段。目前有很大一部分企业都处于 level 3 与 level 4 两个阶段中,其中level 3 占据更大部分。检索级意味着日志很少做结构化抽取,通过一个平台实现所有运维数据的全局搜索,无法做关联分析。分析级有一个前置条件,需要对原始文本日志进行较好的处理,能够从非结构化信息里提取出有用的结构化信息,日志海量涌现时更加难以支撑。
如果企业能够实现非常好的结构化日志,能够产生大量有意义的列,可以为分析提供很好的支撑。但是当结构化不足时,则只能做简单的搜索。
很多企业日志量巨大,日志质量不高,应用中存在大量没有意义的日志或有意义的日志但没有被完整记录,没有暴露出可观测性。另外,日志输出非常随意,完全没有结构化,甚至直接输出文本,对重要信息进行提取时,只能通过正则表达式的方式提取。最后,运维和开发分离,运维不理解开发输出的日志。
很多运维人的目标是先将日志收进,收进的日志只包含非常有限的结构化字段,只对采集器自带的结构化字段做索引,无法提取出关键信息。而当日志需求变得如此简单,对日志做索引也变得不再必要,只要求提供全文索引即可。
而事后诊断,比如根据 error code 、时间段搜索,即使使用暴力计算也可以快速得出结果。
因此,业内产生了日志“新”势力,核心为降低成本。比如不建索引,直接暴力计算;使用云上最便宜的存储对象,不用 SSD 、磁盘等,提高压缩率,但这必定会牺牲一定的性能,因为查询时需要解压缩。
但以上思路存在明显缺点,海量日志不做索引纯粹扫描需要一定的时间。需要对时间做索引,对原始文本打 tag 做索引。
针对以上需求,Elasticsearch官方推出了异步搜索。搜索下发后,可以在后台慢慢运行搜索,分批地将结果取回。搜索错误日志时,可以先将前面 100 条结果返回,一定时间后再将后续 100 条返回。
Elasticsearch的另一新功能为运行时字段Runtime Field。不建索引但依然可以支持各种搜索。
定义一个 script(暴力计算),从 string 里取出想要的信息,相当于一个虚拟字段。有了虚拟字段后,所有 ES 查询语句都可以像正常字段一样进行查询,但其本质依然是暴力计算。如果将时间段缩小,运行速度也能够基本满足用户需求。
此前社区的做法是将很远期的日志做 Snapshot存到对象里,但仅作做备份用,无法进行查询。如果要查询,则需要将对象恢复到集群,需要很多人为工作。而我们期望的理想状况是在对象里直接进行查询。因此Elasticsearch开发了官方功能Searchable Snapshot ,将日志存放在对象里,日志随着生命周期变得越越冷,可以直接查询。但无法快速返回结果,一般是通过异步搜索进行查询。此功能非常适用于大型企业超长时间段的日志搜索。
阿里云也提供了类似的功能OpenStore ,由阿里云自研,可以基于阿里云的基础设施做更强大的优化。其多级缓存的实现机制与官方原版不太一样,利用 SSD 或旋转磁盘做多级缓存,因此搜索速度会比官方原版更好。
Flink 能在tag索引时起到很好的作用。ES 官方是 Logstash,但现在 EFK可以使用 Flink 代替 Logstash 。Logstash 不是集群,而是一个多实例 load balance 。但是 Flink 的集群性能、精确一次投递等特性都优于Logstash。
因此 Flink 在很多场景的应用都更有优势,比如多行日志合并,可以通过 Flink 窗口将多行日志合并到一行中;比如维度添加,Flink可以帮助查询很多结构化数据,补全到日志流中,最后产生结构化的信息。只有标签和维度更全面,才能将暴力计算的 scan 缩小到最小,使得既不牺牲太多性能,又能够大幅降低成本。
Flink 对于存指标、降采样都是很好的选择。
EFK为Elasticsearch+Flink+Libana,用Flink 替代了原先的Logstash,且整条链路全托管,可以快速搭建日志全观测解决方案。
海量日志写入时,处理问题比如标签提取等,Flink的处理能力强于其他同类产品。大量并发写入时,承载能力也是很大的问题,ES为其提供了解决方案。另外,OpenStore能够帮助解决日志存储成本高的问题。同时,此套开源生态可扩展性很强,上下游接入能力非常强。
如今的IoT 场景会产生大量日志会进,写入和存储都会面临巨大压力。
而阿里云为其提供了解决方案,迁移成本低,基于 ES 和 Flink 可以轻松兼顾云下和云上,将两端打通。阿里云 ES OpenStore 可以将远期日志存到 OSS ,切实降低了成本。且高并发写入下 Flink 的处理能力也为其提供了很好的支撑。
大促时,写入流量一定会存在峰值和波谷,而在云上可以轻松实现削峰填谷。
阿里云 ES Indexing Service 提供了海量 ES 池,流量可以打入池内,支撑海量写入。ES Indexing Service 会构建好索引并转移到 ES 集群,ES 集群只需提供搜索能力即可。通过ES Indexing Service 可以更好地匹配峰值,无需预留过多ES计算实例。