1. 文档信息
- 创建者:汪彪
- 创建日期:2020-9-29
- 当前版本:01.00.00
1.1 版本历史
版本 | 修改日期 | 修改人 | 修改说明 |
---|---|---|---|
01.00.000 | 2020-09-29 | 汪彪 | 文档创建 |
2. ELK概述
ELK是ElasticSearch、Logstash和Kiabana的简称,这三者是核心套件,但并非全部。
1:Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
2:Logstash是一个完全开源的工具,他可以对你的日志进行收集、过滤,并将其存储供以后使用(如,搜索)。
3:Kibana 也是一个开源和免费的工具,它Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。
ELK主要被用来做日志分析和管理
2.1 使用原因
日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。我们可以集中化的管理日志。例如:开源的rsyslog,将所有服务器上的日志收集汇总。
集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。
ELK可以收集大量的数据,利用索引机制快速查询,还能通过多种可视化界面展示搜集到的信息。
2.2 ELK架构
可以向ELK架构中添加,或者替换其中套件的技术非常多,很多时候可以替换成自己熟悉的即可,按照实际情况和需求来使用,可以增加或者删减一些套件,不必生搬硬套。
ELK的核心思想就是,一个套件搜集整理数据,一个套餐存储并提供快速的搜索功能,一个套件来展示存储的数据。很多时候因为其他因素,会添加更多的其他套件。
我所选择的框架:
filebate->Logstash -> Elasticsearch -> Kibana
选择这样搭建框架的原因:filebate只能读取文件,但比起logstash消耗的资源少上太多,启动logstash会消耗更多的系统资源,整体的运行效率就会被拖慢。
当存在多个服务器的时候,每台服务器上都必须启动一个搜集日志的工具,如果使用logstash,会给整体的所有服务器带来更大的压力,如果只是读取日志文件,就不必启动那么多的logstash,仅仅启动一个fielbate就足够了,而需要用logstash收集redis、es、nginx等fieldbate无法收集的内容时,再单独启动logstash即可,而且ELK框架也是易于扩展的,在添加新的套件时,如kafkamq,niginx时,只需要修改配置文件,添加新的内容即可。
流程概述:
(1)对日志进行搜集(filebate)交给Logstash
(2)将日志格式化(Logstash)并输出到Elasticsearch
(3)对格式化后的数据进行索引和存储(Elasticsearch)
(4)前端数据的展示(Kibana)
下面先介绍常见的架构
2.1.1 数据量小,且数据可靠性要求不强(允许ELK故障时丢失数据
Logstash -> Elasticsearch -> Kibana
- 收集客户端: rsyslog/heka/flume/logstash/fluent都行,在这个阶段,客户端收集性能不需要过多的考虑,* 都可以满足,看自己的喜好,值得说的是这样的架构规模因数据量不大,客户端此时可以做解析、过滤日志处理后再入到elasticsearch,前提是一定要保证客户端不能影响到生产环境的业务稳定性。不保证收集客户端的可靠性,可通过 supervisor/monit等工具做守护,添加监控
- 数据存储、搜索: elasticsearch 配置默认即可满足,至于分片复本默认都可以,视数据重要性决定是否添加复本,如果添加,最多一个复本足矣(添加复本性能下降很大,规模不大,这个问题应该不会出现)
- 数据展示: kibana 可以根据ES的数据做各种各样的图表来直观展示业务实时状况
2.1.2 数据量大,且数据不允许丢失,实时、稳定性要求高
架构如下:
filebates -> Kafka -> Logstash -> Elasticsearch -> Kibana
- 收集客户端: 选型上,在上面基础之上同上,在这里就不能像小规模时的在客户端做大量的数据处理了,尽量收集最原始数据给kafka或redis,因数据量达到一定程度,客户端因数据处理策略会体现出压力过大,从而会影响到生产环境业务的稳定性
- 队列: 可选择redis/kafka这类的队列工具,优选kafka,因它的分布式、高可用性、大吞吐的特性,它保证了在高并发下即使ES集群故障,在故障恢复后数据仍可追加;从数据客户端收集的原始日志写入到kafka,可供各种应用消费
- 数据处理: 可选用logstash/hangout/rsyslog等,优选hangout,性能较logstash好,功能是仿照logstash做的,大部分需求可满足,在这层做数据的解析、过滤等,比如geoip、useragent、json格式化、字段切割/拼接等,按天索引写入elasticsearch(索引建议提前一天以上建立,减少整点自动建立时的高负载),使用curator做定时关闭、删除N天前的索引,如有多索引查询,还可以使用此工具做alias来方便多索引联合查询。
- 数据存储、搜索: elasticsearch集群,考虑多分片一复本最佳,根据数据大小与搜索频度来调整分片数量,建立索引命名规范,相同类型数据统一建立即mapping模板,添加如bigdesk\marvel\head\kopf这样的监控工具来长期分析性能并调优
- 数据展示: kibana 根据ES数据做图表,使用elasticdump工具定时备份.kibana索引数据(.kibana是kibana的默认索引名称,里面包含了所有kibana中的配置,如图表、搜索、设置、index pattern等)
3. ELK关键配置详情(假设环境已经安装)
ELK通过对filebeat的配置,读取不同的文件,按照不同的规则,进行多行匹配,把文件内容输出到logstash或者es中,logstash可以把搜集到的原始数据进行二次处理,再存储到es中,es按照索引查询,kibana多种方式展示数据。下面是不固定的配置。固定的在环境安装中有说明!
3.1 filebeat关键配置
打开filebeat.yml,对以下关键内容进行配置
#输入源,可以写多个
filebeat.input:
- type: log
enabled: true
#输入源文件地址
path:
- /data/logs/tomcat/*.log
#多行正则匹配,匹配规则 例:2020-09-29,不是这样的就与上一条信息合并
multiline:
pattern: '\s*\['
negate: true
match: after
#起个名字,下面会用到
tags: ["tomcat"]
#输出目标,可以把logstash改成es
output.logstash:
hosts: [172.29.12.35:5044]
3.2 logstash关键配置
自己建立一个以.conf为后缀的文件,或者打开config文件夹下的.conf文件,这里的配置文件是可以同时启动多个的,而且还有一个功能强大的filter功能,可以过滤原始数据。
#输入源(必须)
input {
#控制台键入
stdin {}
#文件读取
file {
#类似赋予的名字
type => "info"
#文件路径,可以用*代表所有
path => ['/usr/local/logstash-7.9.1/config/data-my.log']
#第一次从头开始读,下一次继续上一次的位置继续读
start_position => "beginning"
}
file {
type => "error"
path => ['/usr/local/logstash-7.9.1/config/data-my2.log']
start_position => "beginning"
codec=>multiline{
pattern => "\s*\["
negate => true
what => "previous"
}
}
#与filebates配合使用
beats{
port => 5044
}
}
#输出目标(必须)
output {
#判断type是否相同
if [type] == "error"{
#如果是,就写入此es中
elasticsearch{
hosts => "172.29.12.35:9200"
#kibana通过index的名字进行查询,这里的YYYY是动态获取日期
index => "log-error-%{+YYYY.MM.dd}"
}
}
if [type] == "info"{
elasticsearch{
hosts => "172.29.12.35:9200"
#kibana通过index的名字进行查询
index => "log-info-%{+YYYY.MM.dd}"
}
}
#这里判断的是filebates中赋予的tags是否是tomcat
if "tomcat" in [tags]{
elasticsearch{
hosts => "172.29.12.35:9200"
#kibana通过index的名字进行查询
index => "tomcat"
}
}
#控制台也会打印信息
stdout {
codec => rubydebug {}
}
}
这里是logstash控制台打印的结果显示