ELK又被称为ELK Stack,既然被称为Stack,说明它并不是某一种技术,它是Elastic公司推出的一整套日志收集、分析和展示的解决方案。ELK分别为3个开源项目的首字母缩写,这三个项目分别是:Elasticsearch、Logstash 和 Kibana。下面我们分别来介绍这三个项目。
Elastic Search
Elastic Search(简称ES)毫无疑问是ELK的核心,他是一个分布式的开源搜索和分析引擎,适用于几乎所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据。说到Elastic Search就不能不提Apache Lucene。Lucene是一个高性能、全功能的全文检索引擎库,但其仅仅是一个库,需要使用Java将Lucene集成到应用程序中,并且需要一定的信息检索学知识才能了解其工作原理。而Elasticsearch 同样使用 Java 编写,其内部使用 Lucene 做索引与搜索,但它隐藏了Lucene 的复杂性,取而代之的提供一套简单一致的 RESTful API,从而使全文搜索变得简单。同时,针对大数据场景,ES可以分布式部署于上千台节点,处理PB级数据。下面介绍几个ES的基本概念
集群(Cluster)
集群是一个或多个节点(服务器)的集合,这些节点负责保存全部数据,并在所有节点之间提供联合索引和搜索功能。
节点(Node)
节点是一台服务器,它是群集的一部分,存储数据并参与群集的索引和搜索功能。
索引(Index)
索引是具有相似特征的文档的集合。 例如,可以为客户数据创建索引,为产品目录创建另一个索引,为订单数据创建另一个索引。 索引由名称标识(必须全为小写),并且对该索引中的文档执行索引,搜索,更新和删除操作时,该名称用于引用索引。
倒排索引(inverted index)
Elasticsearch 使用倒排索引(也称为反向索引)来进行全文本搜索。倒排索引会列出在所有文档中出现的每个特有词汇,并且可以找到包含每个词汇的全部文档。而一般关系型数据库所用的正向索引(forward index)如果需要通过关键词来所某个文档,需要遍历全部文档,对于全文检索来说,效率低下。
Logstash
Logstash是一个开源的数据收集引擎,可以为ES收集来自不同数据源的数据,并利用其丰富的过滤器,对数据进行实时解析和转换,而ES并不是logstash的唯一输出选择,它同样可以为数据库、消息队列、云存储等多种应用提供数据。
工作原理
Logstash事件处理管道包括三个阶段:输入→过滤→输出。输入会生成事件,过滤器会对其进行修改,输出会将它们发送到其他地方。输入和输出支持编解码器,使您可以在数据进入或退出管道时对其进行编码或解码,而不必使用单独的过滤器。
输入(Input)
Logstash可以在同一时间从不同的常用来源捕捉数据,比如日志、指标、Web应用和数据存储等。
筛选器(Filter)
筛选器是Logstash管道中的中间处理设备。如果事件符合特定条件,则可以将过滤器与条件语句结合使用,对事件执行操作。比如常用的过滤器插件grok,它可以将非结构化的日志机构化,将日志消息分解成逻辑命名的字段,便于查询、分析和可视化。
输出(Output)
输出是Logstash管道的最后阶段。一个事件可以通过多个输出,但是一旦完成所有输出处理,该事件就完成了执行。根据不同的用途,logstash的输出到不同的下游,比如这些经过筛选的数据如果用于分析,就会被输出到Elastic Search或者MongoDB,如果用于监控就会被输出到Nagios或者Zabbix,如果用于存档就会被输出到HDFS或者S3。
Kibana
Kibana是一个开源的分析和可视化平台,用来搜索、查看储存在ES所以含中的数据。Kibana强大的交互功能可以使用户轻松地执行高级数据分析,并且以各种图表、表格和地图的形式可视化数据,其展示界面基于浏览器,简单易懂,能够快速创建和共享动态仪表板,实时显示ES查询的变化。
Beats
Beats是ELK stack中后来加入的一个组件,它是一个轻量级的数据采器,我们知道logstash也具有数据采集功能,但由于logstash是基于java开发,需要依赖虚拟机,同时又要进行数据处理,因此在性能方面并不令人满意。而beats在数据收集层面上并不进行过于复杂的数据处理,只是进行数据采集并传输给下游,另一方便,由于beats采用go语言开发,go是一种系统编程语言,具有并发友好以及部署方便的特点,能够在不依赖虚拟机的情况下运行,因此在数据采集方面性能优于logstash。Beats以libbeat为核心库的架构,方便用户创建出适合于不通类型数据采集的Beats。 目前官方负责维护的Beats和所收集的数据有以下几种。 Auditbeat审计数据 Filebeat日志文件 Functionbeat 云端数据 Heartbeat 可用性监测数据 Journalbeat 系统日志 Metricbeat 系统或服务的轻量型指标 Packetbeat 网络数据 Winlogbeat Windows事件日志 通过Beats采集的数据可以直接传输到ES,如果需要事先处理,也可以先发送到Logstash进行解析,然后再传输给ES,下图是Beats的常见使用方法。