一、ELK日志分析系统简介
ELK日志分析系统是Logstash、Elasticsearch、Kibana开源软件的集合,对外是作为一个日志管理系统的开源方案,它可以从任何来源、任何格式进行日志搜索、分析与可视化展示
1.1ELK日志分析系统组成
- elasticsearch(es):通过搭建群集;存储日志数据,索引日志数据
- logstash :收集日志,收集到了后给es存储
- kibana :视图形式展现日志信息,更加人性化
1.2日志处理步骤
- 1.将日志进行集中化管理
- 2.将日志格式化(Logstash)并输出到Elasticsearch
- 3.对格式化后的数据进行索引和存储(Elasticsearch)
- 4.前端数据的展示(Kibana)
二、3款软件各自概念
2.1Elasticsearch介绍
-
Elasticsearch的概述
提供了一个分布式多用户能力的全文搜索引擎 -
Elasticsearch核心概念
-
(1)接近实时(NRT)
elasticsearch是一个接近实时的搜索平台,这意味着,从索引一个文档直到这个文档能够被搜索到有一个轻微的延迟(通常是1秒) -
(2)集群(cluster)
一个集群就是由一个或多个节点组织在一起,它们共同持有你整个的数据,并一起提供索引和搜索功能。其中一个节点为主节点,这个主节点是可以通过选举产生的,并提供跨节点的联合索引和搜索的功能。集群有一个唯一性标示的名字,默认是elasticsearch,集群名字很重要,每个节点是基于集群名字加入到其集群中的。因此,确保在不同环境中使用不同的集群名字。
一个集群可以只有一个节点。强烈建议在配置elasticsearch时,配置成集群模式。 -
(3)节点(node)
节点就是一台单一的服务器,是集群的一部分,存储数据并参与集群的索引和搜索功能。像集群一样,节点也是通过名字来标识,默认是在节点启动时随机分配的字符名。当然,你可以自己定义。该名字也很重要,在集群中用于识别服务器对应的节点。
节点可以通过指定集群名字来加入到集群中。默认情况,每个节点被设置成加入到elasticsearch集群。如果启动了多个节点,假设能自动发现对方,他们将会自动组建一个名为elasticsearch的集群。 -
(4)索引(type)
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客数据定义另一个类型,当然,也可以为评论数据定义另一个类型。 -
类型相对于关系型数据库的表
索引(库)–》类型(表)–》文档(记录) -
(5)分片和副本(shards & replicas)
在实际情况下,索引存储的数据可能超过单个节点的硬件限制。如一个10亿文档需1TB空间可能不适合存储在单个节点的磁盘上,或者从单个节点搜索请求太慢了。为了解决这个问题,elasticsearch提供将索引分成多个分片的功能。当在创建索引时,可以定义想要分片的数量。每一个分片就是一个全功能的独立的索引,可以位于集群中任何节点上。
每个索引可以被分成多个分片。一个索引也可以被复制0次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和副本的数量可以在索引创建的时候指定。
在索引创建之后,你可以在任何时候动态地改变副本的数量,但是你事后不能改变分片的数量。
默认情况下,Elasticsearch中的每个索引被分片5个主分片和1个副本,这意味着,如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个副本分片(1个完全拷贝),这样的话每个索引总共就有10个分片。
-
2.2Logstash介绍
- 一款强大的数据处理工具
- 可实现数据传输、格式处理、格式化输出
- 数据输入(从业务输入)、数据加工(如过滤、改写等)以及数据输出(输出到Elasticsearch群集)
- Logstash的主要组件
- shipper:日志收集者,负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来。通常,远程代理端(agent)只需要运行这个组件即可
- indexer:日志存储者,负责接收日志并写入到本地文件
- broker:日志hub,负责连接多个shipper和多个indexer
- search and storage:允许对事件进行搜索和存储
- web interface:基于Web的展示界面
2.3Kibana介绍
- 一个针对Elasticsearch的开源分析及可视化平台
- 搜索、查看存储在Elasticsearch索引中的数据
- 通过各种图表进行高级数据分析及展示
- 主要功能
Elasticsearch无缝之集成
整合数据,复杂数据分析
让更多团队成员收益
接口灵活,分享更容易
配置简单,可视化多数据源
简单数据导出
三、ELK日志分析系统部署
3.1实验环境及准备
主机名 | IP地址 | 主要软件 |
---|---|---|
node1 | 192.168.127.60 | Elasticsearch、Kibana |
node2 | 192.168.127.50 | Elasticsearch |
apache | 192.168.127.40 | httpd、 Logstash |
[root@node1 ~]# hostnamectl set-hostname node1 #更改主机名
[root@node2 ~]# hostnamectl set-hostname node2
[root@node1 ~]# vi /etc/hosts
192.168.127.60 node1
192.168.127.50 node2
#安装编译包
[root@node1 ~]# yum -y install gcc-c++ gcc make pcre
[root@node1 ~]# yum install -y java-1.8.0
[root@node1 ~]# java -version
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
3.2实验步骤
3.2.1node1和node2中部署Elasticsearch
1、安装elasticsearch—rpm包
上传elasticsearch-5.5.0.rpm到/opt目录下
[root@node1 ~]# cd /opt
[root@node1 opt]# rpm -ivh elasticsearch-5.5.0.rpm
2、加载系统服务
[root@node1 opt]# systemctl daemon-reload
[root@node1 opt]# systemctl enable elasticsearch.service
3、更改elasticsearch主配置文件
[root@node1 opt]# cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak #备份配置文件,以防出错无法恢复
[root@node1 opt]# vi /etc/elasticsearch/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 ####提供服务绑定的IP地址,0.0.0.0代表所有地址
http.port: 9200 ####侦听端口为9200
discovery.zen.ping.unicast.hosts: ["node1", "node2"] ####集群发现通过单播实现
[root@node1 opt]# grep -v "^#" /etc/elasticsearch/elasticsearch.yml
4.创建数据存放路径并授权
[root@node1 ~]# mkdir -p /data/elk_data
[root@node1 ~]# chown elasticsearch.elasticsearch /data/elk_data/
5.启动elasticsearch,查看是否成功开启
[root@node1 elasticsearch]# systemctl daemon-reload #修改了配置文件,要重新加载
[root@node1 elasticsearch]# systemctl start elasticsearch.service
[root@node1 opt]# netstat -antp | grep 9200
tcp6 0 0 :::9200 :::* LISTEN 7124/java
6、查看节点信息 用真机的浏览器打开 http://192.168.127.60:9200 / http://192.168.127.50:9200显示节点的信息
2.2.3、检查集群信息
1、检查群集健康情况
在真机浏览器打开 http://192.168.127.60:9200/_cluster/health?pretty
2、检查群集状态信息
输入http://192.168.127.60:9200/_cluster/state?pretty
2.2.4、安装elasticsearch-head插件
上面查看集群的方式不太方便,但是我们可以通过安装 elasticsearch-head 插件后,来管理集群。
elasticsearch-head是一个界面化的集群操作和管理工具,可以对集群进行傻瓜式操作。你可以通过插件把它集成到elasticsearch(5.0版本后不支持此方式),也可以安装成一个独立webapp。
node1、node2都要安装head插件,步骤相同。
#####上传node-v8.2.1.tar.gz到/opt#####
#####编译安装node组件依赖包,耗时比较长,大约30分钟。#####
[root@localhost opt]# cd /opt
[root@node1 opt]# tar xzvf 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 -j4 #j4参数指多线程编译,编译速度会大大提高
[root@node1 node-v8.2.1]# make install
######安装phantomjs#####
######上传软件包到/usr/local/src/#####
[root@localhost node-v8.2.1]# cd /usr/local/src/
[root@localhost src]# tar xjvf phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@localhost src]# cd phantomjs-2.1.1-linux-x86_64/bin
[root@localhost bin]# cp phantomjs /usr/local/bin
#####安装elasticsearch-head#####
[root@localhost bin]# cd /usr/local/src/
[root@localhost src]# tar xzvf elasticsearch-head.tar.gz
[root@localhost src]# cd elasticsearch-head/
[root@localhost elasticsearch-head]# npm install
设置 elasticsearch 跨域访问
[root@localhost ~]# cd ~
[root@localhost ~]# vi /etc/elasticsearch/elasticsearch.yml ####下面配置文件,插末尾##
http.cors.enabled: true
http.cors.allow-origin: "*"
[root@localhost ~]# systemctl restart elasticsearch
####启动elasticsearch-head 服务器
[root@localhost ~]# cd /usr/local/src/elasticsearch-head/
[root@localhost elasticsearch-head]# npm run start & ####切换到后台运行
[root@localhost elasticsearch-head]# netstat -lnupt |grep 9100
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 114739/grunt
[root@localhost elasticsearch-head]# netstat -lnupt |grep 9200
tcp6 0 0 :::9200 :::* LISTEN 114626/java
2.2.5、使用elasticsearch-head
在真机上打开浏览器输入node1和node2的地址查看集群状况。http://192.168.127.60:9100/
http://192.168.127.50:9100/
模拟在node1节点命令上创建索引、类型,查看网页版elasticsearch。
[root@node1 ~]# curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'
下图可以看见索引默认被分片5个,并且有一个副本
进入数据浏览可以查看索引名称和类型。
2.3、安装 logstash服务器
2.3.1、配置环境
更改主机名、关闭防火墙、关闭核心防护
1、更改主机名
hostnamectl set-hostname apache
su
2、关闭防火墙
systemctl stop firewalld
setenforce 0
3、关闭核心防护
sed -i '7s/enforcing/disabled/' /etc/sysconfig/selinux
2.3.2、安装Apahce、logstash
1、安装Apahce服务(httpd)
[root@apache ~]# yum -y install httpd
[root@apache ~]# systemctl start httpd
2、安装Java环境
[root@apache ~]# java -version ###如果没有装,安装yum -y install java-1.8.0
openjdk version "1.8.0_181"
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
3、安装logstash
上传logstash-5.5.1.rpm到/opt目录下
[root@apache ~]# cd /opt
[root@apache opt]# rpm -ivh logstash-5.5.1.rpm ##安装logstash
[root@apache opt]# systemctl start logstash.service ##启动logstash
[root@apache opt]# systemctl enable logstash.service
[root@apache opt]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/ ##建立logstash软连接
2.4、logstash与elasticsearch对接
使用 logstash 命令测试 logstash 和 elasticsearch 是否功能正常,完成对接
字段描述解释:
● -f 通过这个选项可以指定logstash的配置文件,根据配置文件配置logstash
● -e 后面跟着字符串 该字符串可以被当做logstash的配置(如果是” ”,则默认使用stdin做为输入、stdout作为输出)
● -t 测试配置文件是否正确,然后退出
#使用logstash将信息写入elasticsearch中输入 输出 对接
[root@apache opt]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.127.60:9200"] } }'
。。。。。。。。省略。。。。。。。
The stdin plugin is now waiting for input:
10:40:06.558 [Api Webserver] INFO logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
www.baidu.com ###输入内容
www.sina.com.cn ###输入内容
www.google.com.cn ###输入内容
登录宿主机打开浏览器 输入http://192.168.127.60:9100/ 查看索引信息,会多出 logstash-2020.11.23索引。
点击数据浏览查看响应的内容就是在命令行输入的信息。
【登录192.168.127.40 Apache主机 做对接配置】
Logstash配置文件主要由三部分组成:input、output、filter(根据需要)
[root@apache opt]# chmod o+r /var/log/messages #给其他用户一个只读权限
[root@apache opt]# ll /var/log/messages
-rw----r--. 1 root root 1092894 11月 24 00:01 /var/log/messages
[root@apache opt]# vi /etc/logstash/conf.d/system.conf
input {
file{
path => "/var/log/messages"
type => "system"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["192.168.127.60:9200"]
index => "system-%{+YYYY.MM.dd}"
}
}
[root@apache opt]# systemctl restart logstash.service
登录真机
打开浏览器 输入http://192.168.127.60:9100/ 查看索引信息,会多出 system-2020.11.23
2.5、在node1主机安装kibana
上传kibana-5.5.1-x86_64.rpm 到/usr/local/src目录
[root@node1 ~]# cd /usr/local/src/
[root@node1 src]# rpm -ivh kibana-5.5.1-x86_64.rpm
[root@node1 src]# cd /etc/kibana/
[root@node1 kibana]# cp kibana.yml kibana.yml.bak
[root@node1 kibana]# vi kibana.yml
server.port: 5601 #### kibana打开的端口
server.host: "0.0.0.0" ####kibana侦听的地址
elasticsearch.url: "http://192.168.127.60:9200" ###和elasticsearch建立联系
kibana.index: ".kibana" ####在elasticsearch中添加.kibana索引
[root@node1 kibana]# systemctl start kibana.service ###启动kibana服务
[root@node1 kibana]# systemctl enable kibana.service ###开机启动kibana服务
登录宿主机使用浏览器输入192.168.127.60:5601
首次登录创建一个索引名字:system-* 这是对接系统日志文件
然后点击create即可
然后点最左上角的Discover按钮,再点下面的 host旁边的add 右面的图中只显示 Time 和host 选项
2.6、对接Apache主机的Apache 日志文件
[root@apache opt]# cd /etc/logstash/conf.d/
[root@apache conf.d]# touch apache_log.conf
[root@apache conf.d]# vi 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.127.60:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.127.60:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
[root@apache conf.d]# /usr/share/logstash/bin/logstash -f apache_log.conf
登录宿主机打开浏览器输入http://192.168.127.40
再次打开浏览器 输入http://192.168.127.60:9100/ 连接,查看索引信息
能发现apache_access-2020.11.23、apache_error-2020.11.23
打开浏览器 输入http://192.168.127.60:5601
点击左下角有个management选项-----index patterns----create index pattern----分别创建apache_error-* 和 apache_access-* 的索引
到了这里我们的ELK日志分析已经搭建成功,也介绍了使用方法,可以通过ELK完成日志分析了。