ELK入门及搭建使用
一、ELK是什么?
ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana
1、Elasticsearch
这是一个基于Lucene的分布式全文搜索框架,可以对logs进行分布式存储。此为ELK的核心组件,日志的处理以及存储全部由Elasticsearch 完成。
2、Logstash
主要是用来日志的搜集、分析、过滤日志的工具,用来部署到各自的服务器上收集Log日志,通过内置的ElasticSearch插件解析后输出日志到ElasticSearch中。
3、kibana
可以多维度的展示Elasticsearch 中的数据。提供了丰富的UI组件,简化了使用难度。
二、ELK为什么用以及解决什么问题?
项目初期的时候,服务器数量较少,一般来说对日志没有过多的考虑,随着应用的越来越多,日志散落在各个服务器的logs文件夹下,想要查找日志需要在众多服务器上去逐一查找,效率非常低而且确实有很大的不方便。
当线上出现问题我们需要日志分析的时候大概会这么做:直接在日志文件中 grep ‘xx’ order.log就可以获得自己想要的信息。
那你们想过这种方式的问题吗?
1.日志量太大文本搜索太慢怎么办、如何多维度查询
2.应用太多,面临数十上百台应用时你该怎么办(难道只能一台一台的去服务器上找?)
3.随意登录服务器查询log对系统的稳定性及安全性肯定有影响
4.如果开发人员对Linux不太熟练,会造一定的困扰
ELK因此就应运而生,那么为什么要用ELK呢?ELK又能给我们解决哪些问题呢?
1.日志统一收集,管理,访问。查找问题方便安全
2.使用简单,可以大大提高定位问题的效率
3.可以对收集起来的log进行分析(建立日志可视化界面,使得日志分析更加便捷)
4.能够提供错误报告,监控机制(当异常触发时能够及时通过短信、邮件等方式通知相关负责人员)
三、ELK架构
3.1 Logstash作为日志收集器
这种架构是比较原始的部署架构,在各应用服务器端分别部署一个Logstash组件,作为日志收集器,然后将Logstash收集到的数据过滤、分析、格式化处理后发送至Elasticsearch存储,最后使用Kibana进行可视化展示,这种架构不足的是:
Logstash比较耗服务器资源,所以会增加应用服务器端的负载压力。
3****.2 Filebeat作为日志收集器****(****目前使用最多的是****这****种部署架构****,如果不需要logstash做过滤和监控告警等特殊处理,可以直接弃用logstash****)
该架构与第一种架构唯一不同的是:应用端日志收集器换成了Filebeat,Filebeat轻量,占用服务器资源少,将日志数据发送到Logstash或者Elasticsearch时,Filebeat 使用背压敏感协议,以应对更多的数据量。如果 Logstash 或者Elasticsearch正在忙于处理数据,则会告诉 Filebeat 减慢读取速度。一旦拥堵得到解决,Filebeat 就会恢复到原来的步伐并继续传输数据,所以使用Filebeat作为应用服务器端的日志收集器,一般Filebeat会配合Logstash一起使用(logstash主要是对日志消息进行过滤和传输及监控告警),这种部署方式也是目前最常用的架构。
3****.3 引入缓存队列的部署架构
该架构在第二种架构的基础上引入了Redis缓存队列(还可以是其他消息队列例如Kafka),将Filebeat收集到的数据发送至Redis,然后在通过Logstasth读取Redis中的数据,这种架构主要是解决大数据量下的日志收集方案,使用缓存队列主要是解决数据安全与均衡Logstash与Elasticsearch负载压力。
3****.4 以上三种架构的总结
第一种部署架构由于资源占用问题,现已很少使用,目前使用最多的是第二种部署架构,至于第三种部署架构除非是第二种架构不能满足性能要求或者有其他需求,因为在数据量较大的情况下,Filebeat 使用压力敏感协议向 Logstash 或 Elasticsearch 发送数据。如果 Logstash 正在繁忙地处理数据,它会告知 Filebeat 减慢读取速度。拥塞解决后,Filebeat 将恢复初始速度并继续发送数据。
四、搭建ELK
版本:elasticsearch 5.6.12,logstash5.6.9,kibana5.3.0,filebeat5.6.3 四个版本(JDK需要1.8)
2、安装filebeat
(1)解压filebeat:tar zxvf filebeat-5.6.3-linux-x86_64
(2)filebeat-5.6.3-linux-x86_64目录下编辑filebeat.yml文件
filebeat.prospectors:
-
type: log
enabled: true
Paths that should be crawled and fetched. Glob based paths.
paths:
- /var/log/*.log
----------------------------- Logstash output --------------------------------
output.logstash:
The Logstash hosts
hosts: ["192.168.97.3:5044"] #logstash服务iP和端口,如果有多个logstash,可以写多个。
bin目录下启动filebeat,启动命令:./filebeat -e -c filebeat.yml
3.安装logstash
(1)解压logstash:tar zxvf logstash-5.6.9.tar.gz
(2)在config目录创建配置文件:logstash.conf
(3)logstash.conf 做好input ,filter,output三大块, 其中input是吸取logs文件下的所有log后缀的日志文件,filter是一个过滤函数,这里不用配置,output配置了导入到
hosts为192.168.97.3:9200的elasticsearch中,每天建一个索引。
input {
#file {
# type => "log"
# path => "/logs/*.log"
# start_position => "beginning"
#}
beats {
port => 5044
}
}
output {
stdout {
codec => rubydebug { }
}
elasticsearch {
hosts => "192.168.97.3:9200"
index => "log-%{+YYYY.MM.dd}"
}
}
(4)bin目录下启动logstash,启动命令:./logstash -f ../config/logstash.conf,如果想要后台运行启动:./logstash -f ../config/logstash.conf &
4、安装elasticSearch
elasticSearch启动的时候需要注意,elasticSearch不能以root账号启动,所以还需要添加一个新账户。
4.1 解压:tar zxvf elasticsearch-5.6.4.tar.gz
4.2 添加新账户:useradd es,
对新账户授权:chown -R es:es /usr/local/soft/elasticsearch-5.6.4
4.3安装过程中可能会遇到如下几个问题:
(1)max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
解决方法:vi /etc/security/limits.conf
user hard nofile 65536
user soft nofile 65536
(2)max number of threads [1024] for user [apps] is too low, increase to at least [2048]
解决办法:vi /etc/security/limits.d/90-nproc.conf
修改如下内容:
- soft nproc 1024
修改为
- soft nproc 2048
(3)max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144]
解决办法:vi /etc/sysctl.conf
添加下面配置:
vm.max_map_count=655360
并执行命令:
sysctl -p
4.4 切换用户角色:su es ,在bin 目录下启动elasticSearch,启动命令:./elasticsearch ,如果需要后台启动:./elasticsearch -d
以上elasticsearch只是单机安装,集群安装如下:
4.5 同一台机器安装三台elasticsearch集群:cp -r elasticsearch-5.6.12 elasticsearch-n1、cp -r elasticsearch-5.6.12 elasticsearch-n2、cp -r elasticsearch-5.6.12 elasticsearch-n3。
elasticsearch-n1 目录的config目录下elasticsearch.yml文件编辑
cluster.name: my-es #集群名称
node.name: node-01 # 节点名称
node.master: true #主节点(候选)
node.data: true #存储数据
network.host: 192.168.97.3
http.port: 9200 #es对外提供访问的端口
transport.tcp.port: 9300 #es集群之间通信的端口
单播(unicast)协议,指定要发现的节点信息了,可以不指定端口[默认9300]
discovery.zen.ping.unicast.hosts: ["192.168.97.3","192.168.97.3:8300","192.168.97.3:7300"]
默认是1看到的具有master节点资格的最小数量,然后才能在集群中做操作。官方的推荐值是(N/2)+1,如果只有2个节点设为1
discovery.zen.minimum_master_nodes: 2
====================================================================
elasticsearch-n2 目录的config目录下elasticsearch.yml文件编辑
cluster.name: my-es
node.name: node-02
node.master: false
node.data: true
network.host: 192.168.97.3
http.port: 8200
transport.tcp.port: 8300
discovery.zen.ping.unicast.hosts: ["192.168.97.3","192.168.97.3:8300","192.168.97.3:7300"]
discovery.zen.minimum_master_nodes: 2
======================================================================
elasticsearch-n3 目录的config目录下elasticsearch.yml文件编辑
cluster.name: my-es
node.name: node-03
node.master: true
node.data: true
network.host: 192.168.97.3
http.port: 7200
transport.tcp.port: 7300
discovery.zen.ping.unicast.hosts: ["192.168.97.3","192.168.97.3:8300","192.168.97.3:7300"]
discovery.zen.minimum_master_nodes: 2
5.安装kibana
(1)解压:tar zxvf kibana-5.3.0-linux-x86_64.tar.gz
(2)在config目录下的kibana.yml文件中指定一下你需要读取的elasticSearch地址和可供外网访问的bind地址就可以了
elasticsearch.url: "http://192.168.97.3:9200"
server.host: 0.0.0.0
(3)bin目录下启动kibana,启动命令:./kibana ,如果想要后台启动 :./kibana &
注意:
在es和logstash都安装成功后,一定要先往logstash里面写入日志,直到es的索引创建成功再来启动kibana。访问:<u>http://localhost:5601</u> 此时会进入配置界面,如下所示:其中红框的内容是es的索引名字正则表达式,和logstash里面(index => "log-%{+YYYY.MM.dd}")的一致。这里用log-*就可以匹配