ELK日志分析系统原理与部署

一、ELK日志分析系统简介

ELK日志分析系统是Logstash、Elasticsearch、Kibana开源软件的集合,对外是作为一个日志管理系统的开源方案,它可以从任何来源、任何格式进行日志搜索、分析与可视化展示

1.1ELK日志分析系统组成

elasticsearch(es):通过搭建群集;存储日志数据,索引日志数据
logstash :收集日志,收集到了后给es存储
kibana :视图形式展现日志信息,更加人性化

1.2日志处理步骤

1.将日志进行集中化管理
2.将日志格式化(Logstash)并输出到Elasticsearch
3.对格式化后的数据进行索引和存储(Elasticsearch)
4.前端数据的展示(Kibana)
在这里插入图片描述

二、三款软件各自概念

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实验环境及准备

在这里插入图片描述
[root@localhost ~]# hostnamectl set-hostname node1 #修改主机名
[root@localhost ~]# su
[root@node1 ~]# java -version #确认java已安装(Centos7.6自带)
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)
[root@node1 ~]# vim /etc/hosts #添加本地解析,识别集群主机名
14.0.0.10 node1
14.0.0.20 node2

3.2实验步骤

3.2.1node1和node2中部署Elasticsearch

1.安装elasticsearch-5.5.0.rpm包,包上传到/opt目录下

[root@node1 ~]# rpm -ivh elasticsearch-5.5.0.rpm
警告:elasticsearch-5.5.0.rpm:V4 RSA/SHA512 Signature, 密钥 ID d88e42b4: NOKEY
准备中...                          ################################# [100%]
Creating elasticsearch group... OK
Creating elasticsearch user... OK
正在升级/安装...
   1:elasticsearch-0:5.5.0-1          ################################# [100%]
###NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using systemd
 sudo systemctl daemon-reload
 sudo systemctl enable elasticsearch.service
###You can start elasticsearch service by executing
 sudo systemctl start elasticsearch.service

2.根据上一步的提示加载elasticsearch服务

[root@node1 ~]# systemctl daemon-reload
[root@node1 ~]# systemctl enable elasticsearch.service
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.

3.更改elasticsearch主配置文件

[root@node1 ~]# cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
[root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml
[root@node1 ~]# grep -v '^#' /etc/elasticsearch/elasticsearch.yml
17行:cluster.name: my-elk-cluster      #集群名字
23行:node.name: node1                     #节点名字
33行:path.data: /data/elk_data           #数据存放路径
37行:path.logs: /var/log/elasticsearch   #日志存放路径
43行:bootstrap.memory_lock: false      #不在启动的时候锁定内存(这样可以让图片等资源加载时使用内存)
55行:network.host: 0.0.0.0          #提供服务绑定的IP地址,0.0.0.0代表所有地址
59行:http.port: 9200                    #监听端口为9200
68行:discovery.zen.ping.unicast.hosts: ["node1", "node2"]    #集群发现通过单播实现,单播的主机名为"node1", "node2"

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

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

5.启动elasticsearch,查看是否成功开启

[root@node1 ~]# systemctl start elasticsearch.service
[root@node1 ~]# netstat -ntap | grep 9200
tcp6       0      0 :::9200                 :::*                    LISTEN      70030/java

6.查看节点信息,用真机浏览器打开http://14.0.0.10:9200 ,会显示节点的信息,node2节点同理

{
    
    
  "name" : "node1",
  "cluster_name" : "my-elk-cluster",
  "cluster_uuid" : "RKjkoyipTP2SK0IYKNGsww",
  "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)检测集群的健康情况
用真机浏览器打开http://14.0.0.10:9200/_cluster/health?pretty 
{
    
    
  "cluster_name" : "my-elk-cluster",
  "status" : "green",      #green代表健康
  "timed_out" : false,
 ...省略内容
}2)检测集群的状态(比健康情况显示的更加详细)
用真机浏览器打开http://14.0.0.10:9200/_cluster/state?pretty 
{
    
    
  "cluster_name" : "my-elk-cluster",
  "version" : 2,
  "state_uuid" : "ziAM74YMTFKhjgJJCV1UVA",
  "master_node" : "khUsN0_XQpu0OApE0jiZ0g",
  "blocks" : {
    
     },
  "nodes" : {
    
    
    "khUsN0_XQpu0OApE0jiZ0g" : {
    
    
      "name" : "node1",
      "ephemeral_id" : "tG6UKpOkRLOMd71aXt33pA",
      "transport_address" : "14.0.0.10:9300",
      "attributes" : {
    
     }
    }
  },

7.两个节点安装elasticsearch-head插件(安装插件可以更加人性化的管理集群)

1)编译安装node组件依赖包
上传node-v8.2.1.tar.gz
[root@node2 ~]# yum -y install gcc gcc-c++ make
[root@node2 ~]# tar zxf node-v8.2.1.tar.gz
[root@node2 ~]# cd node-v8.2.1/
[root@node2 node-v8.2.1]# ./configure
[root@node2 node-v8.2.1]# make -j4 (用4个核心数处理,按个人电脑配置而定)
[root@node2 node-v8.2.1]# make install
(2)编译安装phantomjs(前端框架)
上传软件包到/usr/local/src
[root@node1 node-v8.2.1]# cd /usr/local/src/
[root@node1 src]# tar jxf phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@node1 src]# cd phantomjs-2.1.1-linux-x86_64/bin/
[root@node1 bin]# cp phantomjs /usr/local/bin/3)安装elasticsearch-head(数据可视化工具)
[root@node1 node-v8.2.1]# cd /usr/local/src/
[root@node1 src]# tar zxf elasticsearch-head.tar.gz
[root@node1 src]# cd elasticsearch-head/
[root@node1 elasticsearch-head]# npm install

8.修改elasticsearch.yml主配置文件

[root@node1 ~]# vim /etc/elasticsearch/elasticsearch.yml
http.cors.enabled: true
http.cors.allow-origin: "*"
[root@node1 ~]# systemctl restart elasticsearch.service

9.后台启动elasticsearch-head服务

[root@node1 ~]# cd /usr/local/src/elasticsearch-head/
[root@node1 elasticsearch-head]# npm run start &
[1] 116185
[root@node1 elasticsearch-head]#
> elasticsearch-head@0.0.0 start /usr/local/src/elasticsearch-head
> grunt server

Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100

[root@node1 elasticsearch-head]# netstat -ntap | grep 9100   #检测elasticsearch-head端口是否开启
tcp        0      0 0.0.0.0:9100            0.0.0.0:*               LISTEN      116195/grunt
[root@node1 elasticsearch-head]# netstat -ntap | grep 9200
tcp6       0      0 :::9200                 :::*                    LISTEN      116098/java

10.真机上输入http://14.0.0.10:9100/验证
在这里插入图片描述

11.回到node节点创建索引,并登录数据化可视网页查看索引信息
索引为index-demo,类型为test

[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" : 2,
    "failed" : 0
  },
  "created" : true
}

在这里插入图片描述
在这里插入图片描述

3.2.2apache主机中安装logstash并做日志搜集

1.更改主机名

[root@localhost ~]# hostnamectl set-hostname apache
[root@localhost ~]# su

2.安装apache服务

[root@apache ~]# yum -y install httpd
[root@apache ~]# systemctl start httpd

3.安装java环境,没有自带安装使用yum -y install java安装

[root@apache ~]# 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)

4.安装logstash,将logstash-5.5.1.rpm上传到/root目录下

[root@apache ~]# rpm -ivh logstash-5.5.1.rpm
[root@apache ~]# systemctl start logstash.service
[root@apache ~]# systemctl enable logstash.service
[root@apache ~]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/    #建立命令软链接

5.logstash(apache)与elasticsearch(node)功能是否正常,做对接测试

logstash命令选项解释:
-f:指定logstash的配置文件,根据配置文件配置logstash
-e:后面跟着字符串,该字符串可以被当做logstash的配置(如果是“ ”,则默认使用stdin做输入,stdout为输出)
-t:测试配置文件是否正确,然后退出
#输入采用标准输入,输出采用标准输出
[root@apache ~]# logstash -e 'input { stdin{} } output { stdout{} }'
...省略内容
10:01:04.460 [Api Webserver] INFO  logstash.agent - Successfully started Logstash API endpoint {
    
    :port=>9600}
www.taobao.com     #随便输入几个网站
2020-09-15T02:01:20.374Z apache www.taobao.com
www.test.com
2020-09-15T02:01:26.871Z apache www.test.com
www.baidu.com
2020-09-15T02:01:32.232Z apache www.baidu.com

6.使用rubydebug显示详细输出,codec为一种编解码器

[root@apache ~]# logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
...省略内容
10:05:18.420 [Api Webserver] INFO  logstash.agent - Successfully started Logstash API endpoint {
    
    :port=>9600}
www.baidu.com
{
    
    
    "@timestamp" => 2020-09-15T02:05:25.552Z,
      "@version" => "1",
          "host" => "apache",
       "message" => "www.baidu.com"
}

7.使用logstash将信息输出给elasticsearch

[root@apache ~]# logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["14.0.0.10:9200"] } }'
...省略内容
10:08:22.143 [Api Webserver] INFO  logstash.agent - Successfully started Logstash API endpoint {
    
    :port=>9600}
www.baidu.com      #输入内容测试
www.test.com
www.taobao.com

8.打开浏览器输入http://14.0.0.10:9100/,查看索引信息,显示新的数据信息说明输出到elasticsearch成功
在这里插入图片描述

9.在apache主机中做对接配置

logstash配置文件主要由三部分组成:input、output、filter
[root@apache ~]# chmod o+r /var/log/messages    #允许其他用户访问
[root@apache ~]# ll /var/log/messages
-rw----r--. 1 root root 1001657 915 10:41 /var/log/messages
[root@apache ~]# vim /etc/logstash/conf.d/system.conf
input {
    
                        #logstash输入:从/var/log/messages输入,类型为system,起始位                     置为从头开始
        file {
    
    
          path => "/var/log/messages"
          type => "system"
          start_position => "beginning"
        }
      }

output {
    
                    #logstash输出:输出给elasticsearch(以IP地址指定位置)
        elasticsearch {
    
    
        hosts => ["14.0.0.10:9200"]
        index => "system-%{+YYY.MM.dd}"
        }
      }
[root@apache ~]# systemctl restart logstash.service

10.打开浏览器输入http://14.0.0.10:9100/,查看索引信息,显示新的索引信息代表logstash搜集到的日志信息成功输出给elasticsearch
在这里插入图片描述

3.3.3在node1主机安装kibana

1.在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]# vim kibana.yml
第2行:server.port: 5601           #kibana打开的端口
第7行:server.host: "0.0.0.0"     #kibana侦听的地址
第21行:elasticsearch.url: "http://14.0.0.10:9200"    #和elasticsearch建立联系
第30行:kibana.index: ".kibana"     #在elasticsearch中添加.kibana索引
[root@node1 kibana]# systemctl start kibana.service  #启动kibana服务
[root@node1 kibana]# systemctl enable kibana.service  #开机启动kibana服务

2.浏览器中登录14.0.0.10:5601,首次登录提示创建一个索引名字:
填入system-*,即对接系统日志文件名
在这里插入图片描述

同时也能看到刚才在kibana.yml中添加的在elasticsearch中添加.kibana索引配置生效了(用于验证kibana和elasticsearch是否成功连接)
在这里插入图片描述

3.添加logstash配置,收集apache服务的访问日志和错误日志中的数据

[root@apache conf.d]# cd /etc/logstash/conf.d/
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 => ["14.0.0.10:9200"]
            index => "apache_access-%{+YYY.MM.dd}"
          }
        }
        if [type] == "error" {
    
    
          elasticsearch {
    
    
            hosts => ["14.0.0.10:9200"]
            index => "apache_error-%{+YYY.MM.dd}"
          }
        }
    }
[root@apache conf.d]# logstash -f apache_log.conf
           #指定logstash的配置文件,根据apache_log.conf配置logstash(-f可以不重启加载)

4.浏览器访问http://14.0.0.10:9100/,查看apache日志文件的索引是否建立成功
在这里插入图片描述

5.kibana中添加刚才elasticsearch中新建的索引,可以以更加人性化的视图界面查看、分析日志,步骤如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
总结,ELK日志分析系统是一款非常强大的日志分析工具,能够帮助运维工程师更快更准确的定位到想要的日志,特别是kibana可视化工具,功能强大,使用起来非常人性化。

猜你喜欢

转载自blog.csdn.net/chengu04/article/details/108609624