一、ELK介绍
ELK Stack是软件集合Elasticsearch、Logstash、Kibana的简称,它们都是开源软件。新增了一个FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具。
Elasticsearch 是一个基于 Lucene 的、支持全文索引的分布式存储和索引引擎,主要负责将日志索引并存储起来,方便业务方检索查询。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Logstash是一个日志收集、过滤、转发的中间件,主要负责将各条业务线的各类日志统一收集、过滤后,转发给 Elasticsearch 进行下一步处理。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
Kibana是一个可视化工具,也是一个开源和免费的,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
Filebeat隶属于Beats。目前Beats包含四种工具:
1、Packetbeat(搜集网络流量数据)
2、Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据
3、Filebeat(搜集文件数据)
4、Winlogbeat(搜集 Windows 事件日志数据)
Filebeat 官方文档:
https://www.elastic.co/cn/products/beats/filebeat
https://www.elastic.co/guide/en/beats/filebeat/5.6/index.html
Elasticsearch 官网: https://www.elastic.co/cn/products/elasticsearch
Logstash官网:https://www.elastic.co/cn/products/logstash
Kibana官网: https://www.elastic.co/cn/products/kibana
二、ELK架构体系
架构图一:
这是最简单的一种ELK架构方式。优点是搭建简单,易于上手。缺点是Logstash耗资源较大,运行占用CPU和内存高。另外没有消息队列缓存,存在数据丢失隐患。
此架构由Logstash分布于各个节点上搜集相关日志、数据,并经过分析、过滤后发送给远端服务器上的Elasticsearch进行存储。Elasticsearch将数据以分片的形式压缩存储并提供多种API供用户查询,操作。用户亦可以更直观的通过配置Kibana Web方便的对日志查询,并根据数据生成报表。
架构图二:
此种架构引入了消息队列机制,位于各个节点上的Logstash Agent先将数据/日志传递给Kafka(或者Redis),并将队列中消息或数据间接传递给Logstash,Logstash过滤、分析后将数据传递给Elasticsearch存储。最后由Kibana将日志和数据呈现给用户。因为引入了Kafka(或者Redis),所以即使远端Logstash server因故障停止运行,数据将会先被存储下来,从而避免数据丢失。
架构图三:
此种架构将收集端logstash替换为beats,更灵活,消耗资源更少,扩展性更强。同时可配置Logstash 和Elasticsearch 集群用于支持大集群系统的运维日志数据监控和查询。
三、ELK运行原理
笔者现在使用了微服务架构,应用流程如下:使用log4j的appender向kafka的topic发送日志信息,同时也记录了文本文件,logstash收到kafka的数据存储起来过滤后交给elasticsearch拿去建立索引分析、检索,最后kibana的web页面来搜索日志、分析出图表等。
四、ELK应用场景
1、分布式部署项目,需要收集日志。
2、微服务架构项目,收集各个服务的日志。
3、大数据行业。
五、安装 elasticsearch
环境介绍 centos 7
关闭防火墙 selinux
安装 java
上传 jdk-8u131-linux-x64.rpm 安装包
rpm -ivh jdk-8u131-linux-x64.rpm
vim /etc/profile.d/jdk.sh
JAVA_HOME=/usr/java/jdk1.8.0_131
JRE_HOME=/usr/java/jdk1.8.0_131/jre
PATH=JAVA_HOME/bin:JAVA_HOME/lib/dt.jar:JRE_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPATH
source /etc/profile.d/jdk.sh # 使环境变量生效
下载 elasticsearch 包
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.1.0.rpm
rpm -ivh elasticsearch-6.1.0.rpm
设置data的目录
mkdir -p /data/es-data # 创建/data/es-data目录,用于elasticsearch数据的存放
chown -R elasticsearch:elasticsearch /data/es-data #修改该目录的拥有者为elasticsearch
设置log的目录
mkdir -p /log/es-log # 创建/data/es-log目录,用于elasticsearch日志的存放
chown -R elasticsearch:elasticsearch /log/es-log # 修改该目录的拥有者为elasticsearch
修改 配置文件
vim /etc/elasticsearch/elasticsearch.yml
改33行 path.data: /var/lib/elasticsearch
为 path.data: /data/es-data #设置data 存放的路径为/data/es-data
改37行 path.logs: /var/log/elasticsearch
为 path.logs: /log/es-log #设置logs日志的路径为/log/es-log
改43行 #bootstrap.memory_lock: true
为 bootstrap.memory_lock: false #设置内存不使用交换分区
改55行 #network.host: 192.168.0.1
为 network.host: 0.0.0.0 #设置允许所有ip可以连接该elasticsearch
改59行 #http.port: 9200
为 http.port: 9200 # 开启监听端口为9200
#增加新参数,为了让elasticsearch-head 插件可以访问es(5.x版本如果没有可以自己手动添加)
http.cors.enabled: true
http.cors.allow-origin: “*”
systemctl start elasticsearch #启动服务
systemctl status elasticsearch #查看服务状态
systemctl enable elasticsearch #设置开机自启
netstat -antulp | grep 9200 #查看监听端口
ps -ef | grep elasticsearch #查看进程
浏览器 访问
六 安装 logstash
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.1.0.rpm
rpm -ivh logstash-6.1.0.rpm
设置 data 目录
mkdir -p /data/ls-data # 创建/data/la-data目录,用于logstash数据的存放
chown -R logstash:logstash /data/ls-data #修改改目录的所有者为logstash
设置log 目录
mkdir -p /log/ls-log # 创建/logs/ls-log 目录,用于logstash日志的存放
chown -R logstash:logstash /log/ls-log # 修改该目录的所有者为logstash
修改配置文件
vim /etc/logstash/logstash.yml
改 28行 path.data: /var/lib/logstash
为 path.data: /data/ls-data
改 64行 path.config: /etc/logstash/conf.d/*.conf
为 path.config: /etc/logstash/conf.d
改 208行 path.logs: /var/log/logstash
为 path.logs: /log/ls-log
systemctl start logstash #启动服务
systemctl status logstash #查看状态
systemctl enable logstash #设置开机自启
ps -ef | grep logstash #查看服务进程
查看 是否启动成功
创建一个软连接。每次执行命令的时候不用在写安装路径(yun安装的在/usr/share下)
ln -s /usr/share/logstash/bin/logstash /bin/
执行logstash 的命令
logstash -e ‘input { stdin { } } output { stdout {} }’
等一会会出现 The stdin plugin is now waiting for input: 输入 666 回车,有返回的输出。
Ctrl+c 退出
测试输出
#192.168.174.141是试验elk的ip
/usr/share/logstash/bin/logstash -e ‘input { stdin { } } output { elasticsearch { hosts => [“192.168.174.141:9200”] } stdout { codec => rubydebug }}’
七 Kibana 安装
wget https://artifacts.elastic.co/downloads/kibana/kibana-6.1.0-x86_64.rpm
rpm -ivh kibana-6.1.0-x86_64.rpm
查看 安装路径, 一般是安装在/usr/share/kibana/ 下
修改 配置文件
vim /etc/kibana/kibana.yml
改2行 #server.port: 5601
为 server.port: 5601
改7行 #server.host: “localhost”
为 server.host: “0.0.0.0”
改 21行 #elasticsearch.url: http://localhost:9200
为 elasticsearch.url: http://localhost:9200
改 30行 #kibana.index: “.kibana”
为 kibana.index: “.kibana”
systemctl start kibana #启动服务
systemctl status kibana #查看服务状态
systemctl enable kibana #设置开机自启
ps -ef | grep kibana #查看服务进程
浏览器访问