ELK日志服务器
ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。
日志服务器的作用
- 提高安全性
- 集中存放日志
传统日志服务器的缺点
对日志的分析困难
为什么使用ELK
- 一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。
- 一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。
ELK日志分析组件
- Elasticsearch
- 是基于Lucene(一个全文检索引擎的架构)开发的分布式存储检索引擎,用来存储各类日志。
- Logstash
- 作为数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置,一般会发送给 Elasticsearch。
- input:数据采集
- filter:数据过滤
- output:数据输出
- Kibana
- 在es集群中拿取数据,向用户展示图像化界面
日志处理步骤
- 将日志进行集中化管理
- 将日志格式化(Logstash) 并输出到Elasticsearch
- 对格式化后的数据进行索引和存储 (Elasticsearch)
- 前端数据的展示(Kibana)
扩展
Filebeat:轻量级的开源日志文件数据搜集器。常用于EFLK中,行的解析
filebeat结合logstash的好处:
- 通过 Logstash 具有基于磁盘的自适应缓冲系统,该系统将吸收传入的吞吐量,从而减轻 Elasticsearch 持续写入数据的压力
- 从其他数据源(例如数据库,S3对象存储或消息传递队列)中提取
- 将数据发送到多个目的地,例如S3,HDFS(Hadoop分布式文件系统)或写入文件
- 使用条件数据流逻辑组成更复杂的处理管道
完整的日志系统特征
- 收集:能够采集多种来源的日志数据
- 传输:能够稳定的把日志数据解析过滤并传输到存储系统
- 存储:存储日志数据
- 分析:支持 UI 分析
- 警告:能够提供错误报告,监控机制
ELK工作原理
- 在每一台机器上装上logstash搜集日志并且数据过滤的服务
- logstash1(端口5044搜集完数据之后,会将数据给消息队列(消息队列会将大数据进行排序,可以处理高并发),消息队列会知道数据是否处理完,处理完在给logstash2
- logstash2拿到数据之后,会将数据进行output给es(output里面会将数据指向es的端口+ip,数据会进行创建索引)
- es拿到数据之后会建立索引并进行存储,es数据中的数据会指向端口5061,给kibana
- kibana拿到数据会进行图形化展示到页面
实验
环境
- Apache:192.168.42.11
- node1(2核/4G):192.168.42.12
- node2(2和/4G):192.168.42.13
systemctl stop firewalld
setenforce 0
ELK集群部署(node节点操作)
环境准备(node1、node2)
[root@node1 ~]# vim /etc/hosts
#添加配置域名解析
192.168.42.12 node1
192.168.42.14 node2
#查看就java环境
[root@node1 ~]# java -version
但是这边建议使用jdk,所以安装jdk
#将jdk的压缩包下载好
[root@node2 ~]# rpm -ivh jdk-8u201-linux-x64.rpm
[root@node2 ~]# vim /etc/profile.d/java.sh
#设置jdk环境变量
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
[root@node2 ~]# source /etc/profile.d/java.sh
#刷新文件,使其生效
部署elasticseaech软件
以node1为例
安装elasticseaech包
[root@node1 opt]# rpm -ivh elasticsearch-5.5.0.rpm
#安装elasticseaech包
[root@node1 opt]# systemctl daemon-reload
[root@node1 opt]# systemctl enable elasticsearch.service
#开启服务
修改elasticsearch配置文件
[root@node1 opt]# cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
#编辑配置文件之前,将配置文件备份
[root@node1 opt]# vim /etc/elasticsearch/elasticsearch.yml
#配置文件里面的所有配置都是被注释掉的
17 cluster.name: my-elk-cluster
#取消17行注释,修改并指定集群名字
23 node.name: node1
#取消23行注释,指定节点名字:node1节点就写node1;node2节点就写node2
33 path.data: /data/elk_data
#取消33行注释,并指定数据存放路径
37 path.logs: /var/log/elasticsearch
#取消37行注释,并指定日志存放的路径
43 bootstrap.memory_lock: false
#取消43行的注释,修改为启动时候不锁定内存
55 network.host: 0.0.0.0
#取消55行注释,设置监听地址,0.0.0.0表示监听所有地址
59 http.port: 9200
#取消59行注释,ES 服务的默认监听端口为9200
68 discovery.zen.ping.unicast.hosts: ["node1", "node2"]
#取消68行注释,指定要发现的节点node1、node2
[root@node1 opt]# grep -v "^#" /etc/elasticsearch/elasticsearch.yml
#表示过滤出不是#号开头的行
创建数据存放的路径与授权,并且启动服务
[root@node1 opt]# mkdir -p /data/elk_data
#创建的数据存放目录
[root@node1 opt]# chown elasticsearch:elasticsearch /data/elk_data
#将目录的属主和属组修改为elasticsearch
[root@node1 opt]# systemctl start elasticsearch.service
#启动服务
[root@node1 opt]# lsof -i:9200
#查看端口是否启动成功
或者使用查看是否开启成功
[root@node1 opt]# netstat -antp | grep 9200
开启就立即查看的话是不会出现的,需要等一下,在会出现端口运行
查看节点信息
浏览器访问:http://192.168.42.12:9200 查看节点信息
浏览器访问:http://192.168.42.12:9200/_cluster/health?pretty 查看群集的健康情况,可以看到 status 值为 green(绿色), 表示节点健康运行。
浏览器访问: http://192.168.42.12:9200/_cluster/state?pretty 检查群集状态信息。
安装Elasticsearch-head插件
依然以node1为例
编译安装node
将node-v8.2.1.tar.gz安装包下载到opt目录下
[root@node1 opt]# yum install gcc gcc-c++ make -y
#安装依赖关系
[root@node1 opt]# tar zxvf node-v8.2.1.tar.gz
#解压
[root@node1 opt]# cd node-v8.2.1/
[root@node1 node-v8.2.1]# ./configure
#检测环境是否可以编译安装
[root@node1 node-v8.2.1]# make && make install
#编译安装
编译安装的时间可能会有点长,耐心等待一下吧!!!
安装phantomjs(前端的框架)
下载phantomjs-2.1.1-linux-x86_64.tar.bz2到opt目录下
[root@node1 opt]# tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src/
#解压并指定路径
[root@node1 opt]# cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin
[root@node1 bin]# cp phantomjs /usr/local/bin
#备份
安装Elasticsearch-head数据可视化工具
下载elasticsearch-head.tar.gz到/opt目录
[root@node1 opt]# tar zxvf elasticsearch-head.tar.gz -C /usr/local/src/
#解压并指定目录
[root@node1 opt]# cd /usr/local/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm install
#安装
修改Elasticsearch主配置文件
[root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml
#修改主配置文件
············#在末尾添加···········
http.cors.enabled: true
http.cors.allow-origin: "*"
解释:
http.cors.enabled: true
#开启跨域访问支持,默认为 false
http.cors.allow-origin: "*"
#指定跨域访问允许的域名地址为所有
[root@node1 ~]# systemctl restart elasticsearch
#重启服务
启动elasticsearch-head服务
启动时候必须在解压后的 elasticsearch-head 目录下启动服务,进程会读取该目录下的 gruntfile.js 文件,否则可能启动失败。
[root@node1 ~]# cd /usr/local/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm run start &
#放在后台,一直运行,按回车就好
[root@node1 elasticsearch-head]# netstat -natp |grep 9100
#查看端口
通过Elasticsearch-head查看Elasticsearch信息
浏览器访问:http://192.168.42.12:9100/ 如果看到群集健康值为 green 绿色,代表群集很健康。
在连接的那个框里面输入http:192.168.42.12:9200/ 点击链接就会出现
插入索引,再查看
#插入一个测试索引,索引为 index-demo,类型为 test。
[root@node1 elasticsearch-head]# curl -X PUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type:application/json' -d '{"user":"lisi","message":"helloween"}'
浏览器访问http://192.168.42.12:9100/
可以看见索引默认被分片5个,并且有一个副本。
点击“浏览数据”,会看见node1上有个index-demo,类型为test的数据信息
ELK Logstash部署(Apache节点)
安装Apache服务(httpd)
[root@apache ~]# yum -y install httpd
#安装httpd服务
[root@apache ~]# systemctl start httpd
#开启服务
[root@apache ~]# netstat -natp |grep 80
#查看端口是否开启
安装java环境和logstash
将安装包下载好
[root@apache ~]# rpm -ivh jdk-8u201-linux-x64.rpm
#安装
[root@apache ~]# vim /etc/profile.d/java.sh
#编辑环境变量,添加内容
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
[root@apache ~]# source /etc/profile.d/java.sh
#刷新
安装logstash
下载安装包到opt目录
[root@apache opt]# rpm -ivh logstash-5.5.1.rpm
#安装
[root@apache opt]# systemctl start logstash.service
#开启
[root@apache opt]# systemctl enable logstash.service
#设置开机自启
[root@apache opt]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
#创建软连接
测试logstash
定义输入和输出流:
[root@apache opt]# logstash -e 'input { stdin{} } output { stdout{} }'
#输入采用标准输入,输出采用标准输出
输入:www.baidu.com
执行ctrl+c退出
使用rubydebug 输出详细格式显示,codec为一种编解码器
[root@apache opt]# logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
输入:www.baidu.com
使用 Logstash 将信息写入 Elasticsearch 中
[root@apache opt]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.42.12:9200"] } }'
输入:www.baidu.com
结果不在标准输出显示,而是发送至 Elasticsearch 中,可浏览器访问 http://192.168.10.13:9100/ 查看索引信息和数据浏览。
[root@apache ~]# logstash -e 'input { stdin{} } output {elasticsearch { hosts=>["192.168.42.12:9200"] } }'
#使用 Logstash 将信息写入 Elasticsearch 中
www.baidu.com
www.sina.com.cn
www.google.com
并不会出来输出结果,是发送到Elasticsearch中
浏览器访问http://192.168.42.12:9100/ 查看索引信息和数据
定义logstash配置文件
#修改 Logstash 配置文件,让其收集系统日志/var/log/messages,并将其输出到 elasticsearch 中。
[root@apache ~]# chmod +r /var/log/messages
#给权限,让logstash可以读取日志
[root@apache ~]# vim /etc/logstash/conf.d/system.conf
#编辑配置文件
input {
file{
path =>"/var/log/messages"
type =>"system"
start_position =>"beginning"
}
}
output {
elasticsearch {
hosts =>["192.168.42.12:9200"]
index =>"system-%{+YYYY.MM.dd}"
}
}
[root@apache ~]# systemctl restart logstash
#重启服务
浏览器访问http://192.168.42.12:9100/
查看索引信息
Kiabana部署(在Node1节点上操作)
安装kiabana并设置主配置文件
下载安装包到opt目录
[root@node1 opt]# rpm -ivh kibana-5.5.1-x86_64.rpm
#安装
[root@node1 opt]# vim /etc/kibana/kibana.yml
#编辑主配置文件
2 server.port: 5601
#取消2行注释,Kiabana 服务的默认监听端口为5601
7 server.host: "0.0.0.0"
#取消7行注释,设置 Kiabana 的监听地址,0.0.0.0代表所有地址
21 elasticsearch.url: "http://192.168.42.12:9200"
#取消21行注释,设置和Elasticsearch建立连接的地址和端口
30 kibana.index: ".kibana"
#取消30行注释,设置在elasticsearch中添加.kibana索引
[root@node1 opt]# systemctl start kibana.service
#启动
[root@node1 opt]# systemctl enable kibana.service
#开机自启
[root@node1 opt]# netstat -natp | grep 5601
#查看是否开启
验证kibana
浏览器访问http://192.168.42.12:5601
在页面Index name or pattern下面的框里输入
system-*
#表示在索引名中输入之前配置的 Output 前缀“system”
回车,创建,在点击Discover按钮可以查看到图表显示的日志信息
也可以分类显示,在“Available Fields”中的“host”,点击后面的“add”,就可以看见按照“host”筛选后的结果
将Apache服务器的日志添加到es集群并通过kibana显示(Apache节点)
[root@apache ~]# vim /etc/logstash/conf.d/apache_log.conf
#编辑一个日志文件
input {
file{
path => "/etc/httpd/logs/access_log"
type => "access"
start_position => "beginning"
}
file{
path => "/etc/httpd/logs/error_log"
type => "error"
start_position => "beginning"
}
}
output {
if [type] == "access" {
elasticsearch {
hosts => ["192.168.42.12:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.42.12:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
[root@apache ~]# cd /etc/logstash/conf.d/
[root@apache conf.d]# /usr/share/logstash/bin/logstash -f apache_log.conf
#开启
验证
浏览器访问http://192.168.42.12:9100 查看所有是否创建成功 创建了error索引
浏览器访问http://192.168.42.12:5601 登录kibana
ELFK
ELFK部署
环境
- node1(2核/4G):192.168.42.12
- node2(2核/4G):192.168.42.13
- Apache:192.168.42.11
- filebeat:192.168.42.14
安装filebeat和设置filebeat主配置文件(node1节点)
下载filebeat安装包到opt目录
[root@node1 opt]# tar zxvf filebeat-6.6.0-linux-x86_64.tar.gz
#解压
[root@node1 opt]# mv filebeat-6.6.0-linux-x86_64 /usr/local/filebeat
[root@node1 opt]# cd /usr/local/filebeat/
[root@node1 filebeat]# vim filebeat.yml
#编辑主配置文件
··············
15 filebeat.prospectors:
#修改15行
24 enabled: true
#修改24行,从日志文件中读取消息
27 paths:
28 - /var/log/messages
#指定监控的日志文件
29 fields:
#可以使用 fields 配置选项设置一些参数字段添加到 output 中
30 service_name: filebeat
31 log_type: log
32 service_id: 192.168.42.14
--------------Elasticsearch output--------------
将Elasticsearch output那段全部注释掉
----------------Logstash output-----------------
165 output.logstash:
167 hosts: ["192.168.42.11:5044"]
#指定 logstash 的 IP 和端口
启动filebeat
[root@node1 filebeat]# ./filebeat -e -c filebeat.yml
注意,这边先不要启动filebeat,先启动logstash,再启动filebeat
Apache(含有logstash)节点上新建一个 Logstash 配置文件
[root@apache conf.d]# cd /etc/logstash/conf.d/
[root@apache conf.d]# vim logstash.conf
#编辑一个logstash文件
input {
beats {
port => "5044"
}
}
output {
elasticsearch {
hosts => ["192.168.10.12:9200"]
index => "%{[fields][service_name]}-%{+YYYY.MM.dd}"
}
stdout {
codec => rubydebug
}
}
[root@apache conf.d]# logstash -f logstash.conf
#启动logstash
[root@node1 filebeat]# ./filebeat -e -c filebeat.yml
#开启filebeat
测试
浏览器访问http://192.168.42.12:5601 登录kibana,按照之前查看的方法,查看索引“filebeat-*”,查看图表信息