前言
当我们部署集群服务器的时候,日志文件就会散落在多台服务器上。查看日志信息就需要到各个服务器上去取和查看,我们把这些日志文件归集到一个地方统一管理。
这个时候ELK系统出现了,ELK是elasticsearch、Logstashh和Kibana三个系统的首字母组合。
当然ELK不只是查看日志功能这么简单,还有更多的应用。
概述
Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Logstash是一个完全开源的工具,他可以对你的日志进行收集、过滤,并将其存储供以后使用(如,搜索)。
Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。
ELK工作流程
在需要收集日志的所有服务上部署logstash,作为logstash agent(logstash shipper)用于监控并过滤收集日志,将过滤后的内容发送到Redis,然后logstash indexer将日志收集在一起交给全文搜索服务ElasticSearch,可以用ElasticSearch进行自定义搜索通过Kibana 来结合自定义搜索进行页面展示。
一. 部署ELK日志分析系统
1.1 案例设计
主机 操作系统 主机名/IP地址 主要软件
服务器 CentOS 7.4 node1/20.0.0.22 Elasticsearch
服务器 CentOS 7.4 node2/20.0.0.23 Elasticsearch
服务器 CentOS 7.4 20.0.0.24 Logstash\apache
服务器 CentOS 7.4 20.0.0.21 kibana
1.2 配置 elasticsearch环境
登录20.0.0.22更改主机名
hostnamectl set-hostname
su
配置主机名解析
vim /etc/hosts
20.0.0.22 node1
20.0.0.23 node2
查看Java环境
[root@node1 ~]# java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
1.3 部署elasticsearch软件
1、安装 elasticsearch-rpm包
上传 elasticsearch-55.0.pm到/op目录下
[root@node1 ~]# cd /opt
[root@node1 ~]# rpm -ivh elasticsearch-5.5.0.rpm //rpm
直接安装elasticsearch软件包,没有依赖
、加载系统服务
[root@node1 ~]# systemctl daemon-reload
//以守护进程来加载,并开启elasticsearch服务
[root@node1 ~]# systemctl enable elasticsearch.service
3、更改 telasticsearch主配置文件
[root@node1 ~]# cd /etc/elasticsearch/
[root@node1 ~]# cp -p elasticsearch.yml elasticsearch.yml.bak
//备份配置文件时记得是使用cp -p 保存权限
[root@node1 ~]# vim elasticsearch.yml
修改以下选项:
cluster.name: my-elk-cluster
node.name: node1
path.data: /data/elk_data
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: false
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["node1", "node2"]
#######################################################################
配置文件分析:
cluster.name: my-elk-cluster #集群名
node.name: node1 #当前节点名
path.data: /data/elk_data #数据存放的位置
path.logs: /var/log/elasticsearch #日志存放的位置
bootstrap.memory_lock: false #不在启动的时候锁定内存:锁定物理内存地址,防止es内存被交换出去
network.host: 0.0.0.0 #提供服务绑定的IP地址,0.0.0.0代表所有地址
http.port: 9200 #侦听端口为9200
discovery.zen.ping.unicast.hosts: ["node1", "node2"] #集群发现通过单播实现(群集里包含的节点,并非指主机名)
4、创建数据存放路径并授权
[root@node1 ~]# mkdir -p /data/elk_data
[root@node1 ~]# chown elasticsearch:elasticsearch /data/elk_data/ //赋予给elasticsearch管理
5、启动 elasticsearch是否成功开启
[root@node1 ~]# systemctl start elasticsearch.service
[root@node1 ~]# systemctl restart elasticsearch.service
[root@node1 ~]# netstat -anpt | grep 9200
6.查看节点信息用真机的浏览器打开
在谷歌浏览器输入:http:12.0.0.22:9200
{
"name" : "node1",
"cluster_name" : "my-elk-cluster",
"cluster_uuid" : "O7vIIvwYT8KeQIMW9tc_HQ",
"version" : {
"number" : "5.5.0",
"build_hash" : "260387d",
"build_date" : "2017-06-30T23:16:05.735Z",
"build_snapshot" : false,
"lucene_version" : "6.6.0"
},
"tagline" : "You Know, for Search"
}
1.4 安装 elasticsearch-head插件
上述查看集群的方式,及其不方便,我们可以通过安装 lasticsearch-head播件后,我们可以以可式化的方式,友好的查看到日志数据
1.41 安装node依赖包
(为了安装elasticsearch-head工具的依赖包),手工编译安装
上传node-v8.2.1.tar.gz 到/opt 编译安装node组件依赖包样耗时比较长47分钟
[root@node1 ~]# yum -y install gcc gcc-c++ make
[root@node1 ~]# cd /opt
[root@node1 ~]# tar zxvf node-v8.2.1.tar.gz
[root@node1 ~]# cd node-v8.2.1/
[root@node1 ~]# ./configure
[root@node1 ~]# make -j3 (时间比较久)
[root@node1 ~]# make install
1.42 安装phantomjs前端架构
上传phantomjs-2.1.1-linux-x86_64.tar.bz2 到/opt
[root@node1 ~]# tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src/
[root@node1 ~]# cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/
[root@node1 phantomjs-2.1.1-linux-x86_64]# ls
bin examples README.md
ChangeLog LICENSE.BSD third-party.txt
[root@node1 phantomjs-2.1.1-linux-x86_64]# cp bin/phantomjs /usr/local/bin/
1.43 安装elasticsearch-head数据可视化工具
1.安装elasticsearch-head
上传elasticsearch-head.tar.gz 到/opt
[root@node1 ~]# tar zxvf elasticsearch-head.tar.gz -C /usr/local/src/
[root@node1 ~]# cd /usr/local/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm install
2.修改主配置文件
[root@node1 elasticsearch-head]# vim /etc/elasticsearch/elasticsearch.yml
在末尾加入
http.cors.enabled: true //开启跨域访问支持,默认为false
http.cors.allow-origin: "*" //跨域访问允许的域名地址
[root@node1 elasticsearch-head]# systemctl restart elasticsearch.service
3.开启elasticsearch-head工具,检查9100和9200端口
[root@node1 elasticsearch-head]# npm run start &
[1] 101019
[root@node1 elasticsearch-head]# netstat -anpt | grep 9100
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 101029/grunt
[root@node1 elasticsearch-head]# systemctl restart elasticsearch.service
[root@node1 elasticsearch-head]# netstat -anpt | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 101085/java
4.真机使用谷歌浏览器测试
在真机上输入:12.0.0.22:9100 可以看到群集很健康是绿色的 在
elasticsearch后面的栏目中输入http:/19216810041:9200
5.5 logstash搭建安装(12.0.0.24)
5.51 安装logstash软件
上传logstash-5.5.1.rpm到/opt,改主机名为apache
[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的命令能让系统所识别
1.52 测试logstash软件
采用标准输入和输出的方式测试一下
[root@apache opt]# logstash -e 'input { stdin{} } output { stdout{} }'
输入:www.baidu.com
显示:2020-10-29T03:31:32.572Z apache www.baidu.com
使用rubydebug显示详细输出,codec是一种编解码器
[root@apache opt]# logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
输入:www.baidu.com
显示:
{
"@timestamp" => 2020-10-29T03:46:17.817Z,
"@version" => "1",
"host" => "apache",
"message" => "www.baidu.com"
}
使用logstash将信息写入elasticsearch中
[root@apache opt]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["12.0.0.24:9200"] } }'
输入:
www.baidu.com
www.sina.com.cn
www.google.com.cn
输出:
终端没有显示,要去宿主机的浏览器访问12.0.0.24:9100
下面输入:http://12.0.0.24:9200/点击连接
发现概览里面多出一个logstash-2020.10.29的索引
点击数据浏览选择logstash-2020.10.29的索引,右边显示框会显示我们在终端输入的三个地址。
1.53 做对接配置
与系统日志(/var/log/messages)做对接配置
[root@apache opt]# cd /var/log/
[root@apache log]# ll messages
找到messages文件
-rw-------. 1 root root 1033039 10月 29 11:58 messages
给他加个其他用户可读的权限
[root@apache log]# chmod o+r messages
[root@apache log]# ll messages
-rw----r--. 1 root root 1053833 10月 29 12:00 messages
对于想要对接的数据,在/etc/logstash/conf.d 新创建一个新的**.conf 文件**
[root@apache log]# vim /etc/logstash/conf.d/system.conf //新建配置文件
input {
file{
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["20.0.0.10:9200"]
index => "system-%{+YYYY.MM.dd}"
}
}
去宿主机的浏览器访问20.0.0.10:9100 下面输入:http://20.0.0.10:9200/点击连接
发现概览里面多出一个system-2020.10.29的索引
5.6 kibana安装 (12.0.0.21)
上传kibana-5.5.1-x86_64.rpm包到/opt目录下,主机名改为kibana
[root@kibana opt]# rpm -ivh kibana-5.5.1-x86_64.rpm
去到kibana目录,做个备份再编辑配置文件
[root@kibana opt]# cd /etc/kibana/
[root@kibana opt]# cp kibana.yml kibana.yml.bak
[root@kibana kibana]# vim kibana.yml
第二行:server.port: 5601
第七行:server.host: “0.0.0.0”
二十一:elasticsearch.url: “http://20.0.0.10:9200”
三十行:kibana.index: “.kibana”
开启kibana服务,设为开机自启
[root@kibana kibana]# systemctl start kibana.service
[root@kibana kibana]# systemctl enable kibana.service
真机输入20.0.0.40:5601
首次登录创建一个索引名字:system-* ##这是对接系统日志文件 Index name or pattern
##下面输入system-* 然后点最下面的create创建按钮 创建完成之后点击页面左上角的Discover界面就能看到system-*的信息
然后鼠标悬停再system-*下面一排里面的host上,会出现一个add按钮
点击add按钮,会发现右边界面只有time和host选项了,这样显示方式更友好
1.7 logstaicsearch对接apache日志文件,kibana可视化展示 (20.0.0.24)
[root@apache log]# cd /etc/logstash/conf.d/
[root@apache conf.d]# touch apache_log.conf
[root@apache conf.d]# vim 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 => ["20.0.0.10:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["20.0.0.10:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
[root@apache conf.d]# /usr/share/logstash/bin/logstash -f apache_log.conf
宿主机访问12.0.0.22:9100
连接http://12.0.0.22:9200/
可以看到索引信息多了两条
apache_error-2020.10.29
apache_access-2020.10.29
再开一个网页访问20.0.0.40:5601
左边选项最后一个Management ----> Index Patterns ---->Create Index Pattern
分别创建 apache_access-* 和 apache_error-* 的索引
创建完之后要等一段时间才能有数据显示。