理论部分

一:ELK平台介绍

1.1:ELK概述

ELK由ElasticSearch、Logstash和Kiabana三个开源工具组成:

1:Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

2:Logstash是一个完全开源的工具,他可以对你的日志进行收集、过滤,并将其存储供以后使用

3:Kibana 也是一个开源和免费的工具,它Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。

进行日志处理分析,一般需要经过一下几步:

(1)将日志进行集中化管理

(2)将日志格式化(Logstash)并输出到Elasticsearch

(3)对格式化后的数据进行索引和存储(Elasticsearch)

(4)前端数据的展示(Kibana)

1.2:Elasticsearch

1:ElasticSearch概述

Elasticsearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的。

2:Elasticsearch核心概念
(1)接近实时(NRT)
Elasticsearch是一个接近实时的搜索平台。

(2)集群(cluster)
一个集群就是由一个或多个节点组织在一起,它们共同持有你整个的数据,并一起提供索引和搜索功能。

(3)节点(node)
一个节点是你集群中的一个服务器,作为集群的一部分,它存储你的数据,参与集群的索引和搜索功能。

(4)索引(index)
一个索引就是一个拥有几分相似特征的文档的集合。在一个集群中,可以定义任意多的索引。

(5)类型(type)
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义完全由你来定。

(6)文档(document)
一个文档是一个可被索引的基础信息单元。

(7)分片和复制(shards & replicas)
一个索引可以存储超出单个结点硬件限制的大量数据。

分片很重要,主要有两方面的原因:
1)允许你水平分割/扩展你的内容容量。
2)允许你在分片(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量。

1.3:Logstash

1:Logstash介绍

Logstash有JRuby语言编写,运行在Java虚拟机(JVM)上,是一款强大的数据处理工具,可以实现数据传输、格式处理、格式化输出。Ligstash具有强大的插件功能,常用于日志处理。

Logstash的设计理念:Logstash只做三件事,数据输入、数据加工、数据输出

2:Logstash 工作的三个阶段:

(1)input 数据输入端,可以接收来自任何地方的源数据。

(2)Filter 数据中转层,主要进行格式处理,数据类型转换、数据过滤、字段添加,修改等,常用的过滤器如下。

(3)output 是logstash工作的最后一个阶段,负责将数据输出到指定位置,兼容大多数应用,常用的有:

2:Logstash组件

(1)Shipper:日志收集者,负责监控本地日志文件的变化,及时收集最新的日志文件内容

(2)Indexer:日志存储者,负责接收日志并写入到本地文件

(3)Broker:日志Hub,负责链接多个Shipper和多个Indexer

(4)Search and Storage:允许对时间进行搜索和存储

(5)Web Interface:基于web的展示界面

1.4:Kibana

1:Kibana介绍

Kibana 是一个设计使用和Elasticsearch配置工作的开源分析和可视化平台。可以用它进行搜索、查看、集成Elasticsearch中的数据索引。可以利用各种图表、报表、地图组件轻松的对数据仅进行可视化分析

2:Kibana主要功能

Elasticsearch无缝集成

整合数据

复杂数据分析

让更多的团队成员收益

接口灵活

配置简单

可视化多数据源

简单数据导出

实验部分

ELK日志分析系统_第1张图片

1.1:环境准备(两个节点上都要准备)

1:配置域名解析

(1)node1节点的设置

[root@localhost ~]# hostname node1

[root@localhost ~]# bash

[root@node1 ~]# vi /etc/hosts

192.168.8.134 node1

192.168.8.136 node2

(2)node2节点的设置

[root@localhost ~]# hostname node2

[root@localhost ~]# bash

[root@node2 ~]# vi /etc/hosts

2:检查java环境

(1)node1的java环境

[root@node1 ~]# java -version

openjdk version "1.8.0_102"

OpenJDK Runtime Environment (build 1.8.0_102-b14)

OpenJDK 64-Bit Server VM (build 25.102-b14, mixed mode)

(2)node2的java环境

[root@node2 ~]# java -version

openjdk version "1.8.0_102"

OpenJDK Runtime Environment (build 1.8.0_102-b14)

OpenJDK 64-Bit Server VM (build 25.102-b14, mixed mode)

1.2:部署Elasticsearch软件(在两个node节点上都部署)

1:在node1节点上安装Elasticsearch软件

(1)安装Elasticsearch软件

[root@node1 ~]# systemctl stop firewalld

[root@node1 ~]# rpm -ivh elasticsearch-5.5.0.rpm

(2)加载系统服务

[root@node1 ~]# systemctl daemon-reload

[root@node1 ~]# systemctl enable elasticsearch.service

(3)更改Elasticsearch主配置文件

[root@node1 ~]# vi /etc/elasticsearch/elasticsearch.yml

cluster.name: my-elk-cluster ##17行

node.name: node1 ##23行

path.data: /data/elk_data ##33行

path.logs: /var/log/elasticsearch/ ##37行

bootstrap.memory_lock: false ##43行

network.host: 0.0.0.0 ##55行

http.port: 9200 59行

discovery.zen.ping.unicast.hosts: ["node1", "node2"] ##68行

(4)创建数据存放路径并授权

[root@node1 ~]# mkdir -p /data/elk_data

[root@node1 ~]# chown elasticsearch:elasticsearch /data/elk_data/

2:在node2节点上安装Elasticsearch软件

(1)安装Elasticsearch软件

[root@node2 ~]# systemctl stop firewalld

[root@node2 ~]# rpm -ivh elasticsearch-5.5.0.rpm

(2)加载系统服务

[root@node2 ~]# systemctl daemon-reload

[root@node2 ~]# systemctl enable elasticsearch.service

(3)更改Elasticsearch主配置文件

[root@node2 ~]# vi /etc/elasticsearch/elasticsearch.yml

cluster.name: my-elk-cluster ##17行

node.name: node2 ##23行

path.data: /data/elk_data ##33行

path.logs: /var/log/elasticsearch/ ##37行

bootstrap.memory_lock: false ##43行

network.host: 0.0.0.0 ##55行

http.port: 9200 59行

discovery.zen.ping.unicast.hosts: ["node1", "node2"] ##68行

(4)创建数据存放路径并授权

[root@node2 ~]# mkdir -p /data/elk_data

[root@node2 ~]# chown elasticsearch:elasticsearch /data/elk_data/

3:启动Elasticsearch并查看是否开启成功

(1)在node1上启动

[root@node1 ~]# systemctl start elasticsearch.service

[root@node1 ~]# netstat -anpt | grep 9200

tcp6 0 0 :::9200 :::* LISTEN 6987/java

(2)在node2上启动

[root@node2 ~]# systemctl start elasticsearch.service

[root@node2 ~]# netstat -anpt | grep 9200

tcp6 0 0 :::9200 :::* LISTEN 5991/java

4:查看节点信息

(1)查看节点1

打开浏览器

http://192.168.8.134:9200

ELK日志分析系统_第2张图片

(2)查看节点2

打开浏览器

http://192.168.8.136:9200

ELK日志分析系统_第3张图片

(3)查看群集健康情况

打开浏览器

http://192.168.8.136:9200/_cluster/health?pretty

ELK日志分析系统_第4张图片

(4)查看群集的状态信息

打开浏览器

http://192.168.8.136:9200/_cluster/state?pretty

ELK日志分析系统_第5张图片

1.3:在node1上安装Elasticsearch-head插件(只需在node1上安装)

1:编译安装node

[root@node1 ~]# tar zxvf node-v8.2.1.tar.gz

[root@node1 ~]# cd node-v8.2.1/

[root@node1 node-v8.2.1]# yum -y install gcc*

[root@node1 node-v8.2.1]# ./configure && make && make install

2:安装phantomjs

[root@node1 ~]# tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2

[root@node1 ~]# cd phantomjs-2.1.1-linux-x86_64/bin/

[root@node1 bin]# cp phantomjs /usr/local/bin/

3:安装Elasticsearch-head

[root@node1 ~]# tar zxvf elasticsearch-head.tar.gz

[root@node1 ~]# cd elasticsearch-head/

[root@node1 elasticsearch-head]# npm install

4:修改Elasticsearch主配置文件

[root@node1 elasticsearch-head]# vi /etc/elasticsearch/elasticsearch.yml

在末尾添加:

http.cors.enabled: true

http.cors.allow-origin: "*"

5:启动服务(必须在解压的elasticsearch-head目录下启动)

[root@node1 ~]# cd elasticsearch-head/

[root@node1 elasticsearch-head]# npm run start &

[1] 90716

[root@node1 elasticsearch-head]#

\> [email protected] start /root/elasticsearch-head

\> grunt server

Running "connect:server" (connect) task

Waiting forever...

Started connect web server on http://localhost:9100

[root@node1 elasticsearch-head]# netstat -anpt | grep 9100

tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 90729/grunt

[root@node1 elasticsearch-head]# netstat -lnupt | grep 9200

tcp6 0 0 :::9200 :::* LISTEN 90600/java

6:通过elasticsearch-head查看elasticsearch信息

浏览器中访问:

http://localhost:9100/

ELK日志分析系统_第6张图片

ELK日志分析系统_第7张图片

ELK日志分析系统_第8张图片

7:插入索引

[root@node1 ~]# curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'Content-Type:application/json' -d '{"user":"zhangsan","mesg":"hello world"}'

{

"_index" : "index-demo",

"_type" : "test",

"_id" : "1",

"_version" : 1,

"result" : "created",

"_shards" : {

​ "total" : 2,

​ "successful" : 1,

​ "failed" : 0

},

"created" : true

}

刷新浏览器,会发现添加的索引:

img

img

1.4:Logstash安装及使用方法

1:在node1上安装Logtash

[root@node1 ~]# rpm -ivh logstash-5.5.1.rpm

[root@node1 ~]# systemctl start logstash.service

[root@node1 ~]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/

2:测试Logtash

(1)输入采用标准输入,输出采用标准输出

[root@node1 ~]# logstash -e 'input { stdin{} } output { stdout{} }'

The stdin plugin is now waiting for input:

10:19:45.831 [Api Webserver] INFO logstash.agent - Successfully started Logstash API endpoint {:port=>9600}

www.baidu.com

2018-04-17T02:20:01.564Z localhost.localdomain www.baidu.com

www.sina.com

2018-04-17T02:20:14.612Z localhost.localdomain www.sina.com

^C10:20:21.838 [SIGINT handler] WARN logstash.runner - SIGINT received. Shutting down the agent.

10:20:21.851 [LogStash::Runner] WARN logstash.agent - stopping pipeline {:id=>"main"}

按下ctrl+c退出

(2)使用rubydubug显示详细输出

[root@node1 ~]# logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'

The stdin plugin is now waiting for input:

10:21:43.495 [Api Webserver] INFO logstash.agent - Successfully started Logstash API endpoint {:port=>9600}

www.baidu.com

{

​ "@timestamp" => 2018-04-17T02:23:02.842Z,

​ "@version" => "1",

​ "host" => "localhost.localdomain",

​ "message" => "www.baidu.com"

}

按下ctrl+c退出

(3)使用Logtash将信息写入Eloasticsearch中

注意:如果下列命令执行后提示拒绝连接,可以重启以下elasticsearch服务

[root@node1 ~]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.8.134:9200"] } }'

ELK日志分析系统_第9张图片

ELK日志分析系统_第10张图片

3:Logstash配置文件

(1)修改Logstash配置文件

[root@node1 ~]# chmod o+r /var/log/messages

[root@node1 ~]# touch /etc/logstash/conf.d/system.conf

[root@node1 ~]# vi /etc/logstash/conf.d/system.conf

input {

​ file {

​ path=>"/var/log/messages"

​ type=>"system"

​ start_position=>"beginning"

​ }

​ }

output {

​ elasticsearch {

​ hosts=>["192.168.8.134:9200"]

​ index=>"system-%{+YYYY.MM.dd}"

​ }

​ }

(2)重启Logstash服务

[root@node1 ~]# systemctl restart logstash

(3)刷新页面,查看Elasticsearch的信息

ELK日志分析系统_第11张图片

ELK日志分析系统_第12张图片

1.5:安装Kibana

1:在node1上安装Kibana

[root@node1 ~]# rpm -ivh kibana-5.5.1-x86_64.rpm

[root@node1 ~]# systemctl enable kibana.service

2:修改Kibana主配置文件

[root@node1 ~]# vi /etc/kibana/kibana.yml

server.port: 5601 ##2行

server.host: "0.0.0.0" ##7行

elasticsearch.url: "http://192.168.8.134:9200" ##21行

kibana.index: ".kibana" ##30行

3:启动Kibana服务

[root@node1 ~]# systemctl start kibana

4:验证Kibana

(1)浏览器访问

http://192.168.8.134:5601

ELK日志分析系统_第13张图片

(2)查看索引字段

ELK日志分析系统_第14张图片

(3)查看图标和日志信息

ELK日志分析系统_第15张图片

6:添加apache服务器的日志

(1)在apache服务器上安装httpd

[root@localhost ~]# systemctl stop firewalld

[root@localhost ~]# yum -y install httpd

[root@localhost ~]# java -version

openjdk version "1.8.0_102"

OpenJDK Runtime Environment (build 1.8.0_102-b14)

OpenJDK 64-Bit Server VM (build 25.102-b14, mixed mode)

[root@localhost ~]# rpm -ivh logstash-5.5.1.rpm

[root@localhost ~]# systemctl daemon-reload

[root@localhost ~]# systemctl enable logstash

[root@localhost 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.8.134:9200"]

​ index=>"apache_access-%{+YYYY.MM.dd}"

​ }

​ }

​ if [type]=="error" {

​ elasticsearch {

​ hosts=>["192.168.8.134:9200"]

​ index=>"apache_error-%{+YYYY.MM.dd}"

​ }

​ }

​ }

[root@localhost ~]# systemctl start httpd

[root@localhost conf.d]# /usr/share/logstash/bin/logstash -f apache_log.conf

(2)浏览器访问

http://192.168.8.134:9100/

ELK日志分析系统_第16张图片

http://192.168.8.134:5601

ELK日志分析系统_第17张图片