固定链接 ELK初探

ELK初探

ELK初探

ELK初探

什么是ELK?


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的常见使用方法。

图片来源:https://www.elastic.co/guide/en/beats/libbeat/7.x/beats-reference.html#beats-reference

部署一个ELK

本例使用了滴滴云的虚拟机,因为是一个简单的demo,我们会把所有组件部署到一个虚机上,所以采用了配置较高的虚机,4核8G,40G高效云盘,操作系统为Centos 7.5。登陆后首先用sudo su命令切换到root用户。

  • 安装JDK8并设置环境变量。

  • 安装Elastic Search

编辑配置文件/usr/local/elasticsearch-5.3.0/config/elasticsearch.yml。

一定要用非root用户来启动ES,这里用滴滴云默认的登录用户dc2-user,将ES文件的属组和属主变为dc2-user。

启动ES并在后台运行。

访问本机的9200端口:

说明ES已经正常运行。

安装Kibana

出于安全考虑,我们现在配置文件中设置仅允许访问本机地址。

启动Kibana并在后台运行。

如果看到以下输出,说明kibana启动成功。

这里之所以没有放开Kibana的外方访问是因为Kibana本身无法鉴权,任何人都可以直接访问,因此这里我们用nginx来做身份验证,可以直接用yum install nginx来安装。
编辑配置文件/etc/nginx/nginx.conf,在http模块中添加以下内容:

生成用户名和密码文件。

如果没有htpasswd命令,需要安装httpd-tools,yum install -y httpd-tools。

启动nginx,systemctl start nginx,通过外网IP的8081端口访问kibana。注意,在滴滴云上如果需要外网访问某端口,需要在安全组中打开相应端口。

输入用户名和密码后可以看到Kibana的页面。

我们现在尝试在ES中插入一条日志。

成功后,在Kibana中创建索引匹配规则。

创建完成后可以在discover中可以查看到这条日志。

安装Logstash

Logstash的主要功能就是对输入的数据进行处理然后输出,因此就要为这些数建立一个通道,通过修改一下配置文件来创建通道:

启动Logstash。

如果看到以下信息,说明Logstash启动成功。

安装Filebeat

本例中的Beats我们选择Filebeat来收集本机的/var/log/nginx/以.log结尾的日志。

下载安装Filebeat。

配置数据采集和输出属性:

默认配置是向ES输出:

修改为向logstash输出。

配置文件中采集/var/log/nignx下以.log结尾的文件。

启动Filebeat。

在Kibana中创建新的pattern。

创建完成后可以到Discover中看到日志信息。

点击source可以看到总共收集了2个日志,access.log和error.log。

展开可以看到日志的详细信息,比如我们要看error.log的详细信息。

这样error.log的详细信息就展示出来了。

总结

至此,我们完成了一个简单的ELK应用,其中还包含了Filebeat,符合官网的标准ELK+beat架构。



图片来源:https://www.elastic.co/cn/what-is/elk-stack
参考链接:

https://www.elastic.co/

https://blog.csdn.net/u011142688/article/details/78499332

https://blog.csdn.net/u011142688/article/details/78499348

作者:贺子一

您的留言将激励我们越做越好