ELK原理详解
1.ELK介绍
ELK是三个开源软件的缩写,分别为:Elasticsearch、Logstash、Kibana,后⾯还有⼀个fileBeat,它是⼀个轻量级的⽇志收集处理(Agent),FileBeat占⽤的资源很少,适合在各个服务器上收集⽇志后传输给Logstash。
Elasticsearch是基于Lucene全⽂检索引擎框架,基于Java语⾔编写,是⼀个开源的分布式收缩引擎,提供收集、分析、存储数据三⼤功能,特点是:分布式、零配置、⾃动发现、索引⾃动分⽚,索引副本机制,restful风格接⼝,多数据源,⾃动搜索负载等。
Kibana也是开源免费的⼯具,Kibana可以给Elasticsearch和Logstash提供很好的web界⾯,可以帮助汇总、分析和搜索重要的数据⽇志。
FileBeat属于Beats,是⼀个轻量型的⽇志采集器,早期的ELK架构中使⽤的是Logstash进⾏收集、解析并且过滤⽇志,但是Logstash对CPU、内存、IO等资源的消耗过⾼,相⽐于Logstash,Beats所占⽤的CPU和内存⼏乎可以忽略不记。⽬前Beats包括:Packagebeat(搜索⽹络流量数据)、Topbeat(搜集系统、进程和⽂件系统级别的CPU和内存使⽤情况等数据)、Filebeat(搜集⽂件数据)、Winlogbeat(搜集Windows事件⽇志数据)。
Logstash和Elasticsearch是⽤JAVA语⾔进⾏编写的,⽽Kibana使⽤的是node.js框架,在配置ELK环境时要保证系统⼜JAV JDK开发库。
2. 为什么要⽤ELK
在规模较⼤也就是⽇志量多⽽复杂的场景中,如果直接在⽇志⽂件中grep、awk获得⾃⼰想要的信息,那么效率就会很低下,⽽且也⾯临着包括⽇志量太⼤如何进⾏归档、⽂本搜索太慢、如何多维度进⾏查询等问题。这时候需要集中化的⽇志管理,所有服务器上的⽇志搜集进⾏汇总。常见的解决思路是建⽴集中式的⽇志搜集系统,将所有的节点上的⽇志进⾏统⼀的收集、管理、访问。⼤型的系统通常都是分布式部署的架构,不同的服务模块部署在不同的机器上,如果问题出现,那么⼤部分情况需要根据问题暴漏的关键信息,定位到具体的服务器和服务的模块,构建⼀套集中式的⽇志系统,可以提⾼定位问题的效率。⼀个完整的集中式⽇志系统,需要包括以下⼏个主要的特点:
收集:能够采集多种来源的⽇志数据
传输:能够稳定的把⽇志数据传输到中央系统
存储:如何存储⽇志数据
分析:可以⾄此UI分析
警告:能够提供错误报告,监控机制
ELK可以提供⼀整套的解决⽅案,并且都是开源的软件,之间相互配合使⽤,完美衔接,⾼效的满⾜了很多场合的使⽤。也是当前主流的⼀种⽇志系统。
3.ELK架构图
3.1 架构⼀
如果没有使⽤filebeat,logstash搜集⽇志,进⾏过滤处理,并将 数据发送到elasticsearch的架构图如下:
这是最简单的⼀种ELK架构⽅式,优点时搭建简单,容易上⼿,缺点是Logstash消耗的资源⽐较⼤,运⾏占⽤的CPU和内存很⾼,另外也没有消息队列缓存,存在数据丢失的隐患。此架构由Logstash分布于各个节点上搜集相关⽇志、数据,并经过分析、过滤后发送给远端服务器上的Elasticsearch进⾏存储。Elasticsearch将数据以分⽚的形式压缩存储并提供多种API供⽤户查询,操作。⽤户亦可以更直观的通过配置Kibana Web⽅便的对⽇志查询,并根据数据⽣成报表。
3.2 架构⼆
这种架构加⼊了消息队列机制,位于各个节点上的Logstash Agent⾸先将数据/⽇志传输给Kafka(或者Redis),并将队列中消息或数据间接传递给Logstash,Logstash过滤分析之后将数据传输给Elasticsearch进⾏存储,最后再由Kibana将⽇志和数据呈现给⽤户,⽽正是因为引⼊了Kafka(或者redis),才使得远端的Logstash server因为故障停⽌运⾏之后,数据会先被存储下来,从⽽避免数据的丢失。
3.3架构三
这种架构将收集⽇志端换成了beats,这样会更灵活,消耗资源会更少,扩展性也会更强。同时也可以配置Logstash和Elasticsearch集⽤于⽀持⼤集系统的运维⽇志数据监控和查询。
4.FileBeat的⼯作原理
filebeat由两个主要组件组成:prospectors和harvesters。这两个组件协同⼯作将⽂件变动发送到指定
的输出中。
Haverster(收割机):负责读取单个⽂件的内容。每个⽂件会启动⼀个Haverster,每个Haverster会逐⾏读取各个⽂件,并将⽂件内容发送到制定的输出中。Haverster负责打开和关闭⽂件,意味着Haverster运⾏的时候,⽂件描述符处于打开的状态,如果⽂件在收集中被重命名或者是被删除,Filebeat会继续读取此⽂件。所以在Haverster关闭之前,磁盘是不会被释放的。默认情况下filebeat会保持⽂件打开状态,直到达到close_inactive(如果此选项打开,filebeat会在指定的时间内将不会再更新的⽂件句柄关闭,时间从haverster 读取最后⼀⾏的时间开始计时。如果⽂件句柄被关闭后,⽂件发⽣了变化,就会启动⼀个新的Haverster。关闭⽂件句柄的时间不取决于⽂件的修改时间,如果这个参数配置不合适,就有可能发⽣⽇志不实的情况,由scan_frequency参数所决定,默认是10s.Haverster使⽤内部时间戳来记录⽂件最后被搜集的时间。例如:设置5m则在Harvester读取⽂件的最后⼀⾏之后,开始倒计时5分钟,若5分钟内⽂件⽆变化,则关闭⽂件句柄。默认5m)
prospector(勘探者):负责管理Haverster并到所有读取源。
安卓在线解析json prospector会到/data/下的所有log⽂件,并为每⼀个⽂件启动⼀个Haverster。prospector会检查每个⽂件,看Haverster是否已经启动,是否需要启动,或者⽂件是否可以忽略。如果Haverster关闭,只有在⽂件⼤⼩发⽣变化的时候Prospector才会执⾏检查。只能检查本地⽂件。
filebeat如何记录⽂件的状态:
将⽂件状态记录在⽂件中,默认是在/var/lib/filebeat/registry。此状态可以记住Haverster搜集⽂件的偏移量,若连接不上输出设备,如ES等,filebeat会记录发送前的最后⼀⾏,并再可以连接的时候继续发送。Filebeat在运⾏的时候,Prospector状态会被记录在内存中。Filebeat重启的时候,利⽤registry记录的状态来进⾏重建,⽤来还原到重启之前的状态。每个Prospector会为每个到的⽂件记录⼀个状态,对于每个⽂件,Filebeat存储唯⼀标识符以检测⽂件是否先前被收集。
Filebeat如何保证事件⾄少被输出⼀次:
Filebeat之所以能保证事件⾄少被传递到配置的输出⼀次,没有数据丢失,是因为filebeat将每个事件的传递状态保存在⽂件中。在未得到输出⽅确认时,filebeat会尝试⼀直发送,直到得到回应。若filebeat在传输过程中被关闭,则不会再关闭之前确认所有时事件。任何在filebeat关闭之前为确认的时间,都会在filebeat重启之后重新发送。这可确保⾄少发送⼀次,但有可能会重复。可通过设置shutdown_timeout 参数来设置关闭之前的等待事件回应的时间(默认禁⽤)。
5. Logstash ⼯作原理
Logstash事件处理有三个阶段:inputs → filters → outputs。是⼀个接收,处理,转发⽇志的⼯具。⽀持系统⽇志,webserver⽇志,错误⽇志,应⽤⽇志,总之包括所有可
以抛出来的⽇志类型。
Input:输⼊数据到logstash:
⼀些常⽤的输⼊为:
file :从⽂件系统的⽂件中读取,类似于tail -f 命令
syslog :在514端⼝上监听系统⽇志消息,并根据RFC3164标准进⾏解析
redis :从redis service 中读取
beats :从filebeat 中读取
Filters:数据中间处理,对数据进⾏操作:
⼀些常⽤的过滤器为:
grok :解析任意⽂本数据,Grok 是Logstash 最重要的插件。它的主要作⽤就是将⽂本格式的字符串,转换成为具体的结构化的数据,配合正则表达式使⽤。
官⽅提供的grok 表达式:
grok 在线调试:
mutate :对字段进⾏转换。例如对字段进⾏删除、替换、修改、重命名等。
drop :丢弃⼀部分events 不进⾏处理。
clone :拷贝 event ,这个过程中也可以添加或移除字段。
geoip :添加地理信息(为前台kibana 图形化展⽰使⽤)
filebeat.prospectors:
- input_type: log
path:
- /data/xxx.log
Outputs:outputs是logstash处理管道的最末端组件
⼀个event可以在处理过程中经过多重输出,但是⼀旦所有的outputs都执⾏结束,这个event也就完成⽣命周期。⼀些常见的outputs为:
elasticsearch:可以⾼效的保存数据,并且能够⽅便和简单的进⾏查询。
file:将event数据保存到⽂件中。
graphite:将event数据发送到图形化组件中,⼀个很流⾏的开源存储图形化展⽰的组件。
Codecs:codecs 是基于数据流的过滤器,它可以作为input,output的⼀部分配置。
Codecs可以帮助你轻松的分割发送过来已经被序列化的数据。
⼀些常见的codecs:
json:使⽤json格式对数据进⾏编码/解码。
multiline:将汇多个事件中数据汇总为⼀个单⼀的⾏。⽐如:java异常信息和堆栈信息。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论