阅读 705

Elasticsearch+Logstash+Kibana实战部署[ELK]

ELK简介

什么是ELK?通俗来讲,ELK是由Elasticsearch、Logstash、Kibana 三个开源软件组成的一个组合体,这三个软件当中,每个软件用于完成不同的功能,ELK又称ELKstack,官网 www.elastic.co/ , ELK主要优点有如下几个:

1、处理方式灵活:elasticsearch是实时全文索引,具有强大的搜索功能。
2、配置相对简单:elasticsearch全部使用JSON接口,logstash使用模块配置,kibana的配置文件部分更简单。
3、检索性能高:基于优秀的设计,虽然每次查询都是实时,但是也可以达到百亿级数据的查询秒级响应。
4、集群线性扩展:elasticsearch和logstash都可以灵活线性扩展。
5、前端操作绚丽:kibana的前端设计比较绚丽,而且操作简单。
复制代码

Elasticsearch

  • elasticsearch是一个高度可扩展全文搜索和分析引擎,基于Apache Lucene 构建,能对大容量的数据进行接近实时的存储、搜索和分析操作,可以处理大规模日志数据,比如Nginx、Tomcat、系统日志等功能。

Logstash

  • 数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置;支持普通log、自定义json格式的日志解析。

Kibana

  • 数据分析和可视化平台。通常与 Elasticsearch 配合使用,对其中数据进行搜索、分析和以统计图表的方式展示。

ELK部署准备

这里实验所使用系统CentOS 7.4 x86_64,请关闭防火墙和selinux。

IPAddress Hostname Mem
172.18.12.172 elk-node1 4G
172.18.12.163 elk-node2 4G

上传软件包

  • elasticsearch-7.4.2-linux-x86_64.tar.gz
  • jdk-8u221-linux-x64.tar.gz
  • kibana-7.4.2-linux-x86_64.tar.gz
  • logstash-7.4.2.tar.gz
  • Elasticsearch-head
  • node-v12.14.0-linux-x64.tar.xz

软件包下载地址 提取码:se5p


安装JDK并配置环境变量

[root@localhost /]# tar -xzvf jdk-8u221-linux-x64.tar.gz
[root@localhost /]# vim etc/profile
复制代码

添加如下:

#set java environment
JAVA_HOME=/sk/jdk1.8.0_221
JRE_HOME=$JAVA_HOME/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPATH
复制代码

使配置生效

[root@localhost /]# source /etc/profile
复制代码

查看JDK版本

[root@localhost /]# java -version
复制代码


Elasticsearch部署

一、解压elasticsearch并配置bin/elasticsearch.yml

[root@localhost tmp]# tar -zxvf elasticsearch-7.4.3.tar.gz 
[root@localhost tmp]# mkdir /ELK
[root@localhost tmp]# mv elasticsearch-7.4.3 /ELK/elasticsearch
[root@localhost /]# cd ELK/elasticsearch/config/
[root@localhost config]# vim elasticsearch.yml
复制代码

配置如下:

cluster.name: ELK-Cluster    #ELK的集群名称,名称相同即属于是同一个集群
node.name: elk-node1    #本机在集群内的节点名称
path.data: /ELK/elasticsearch/data    #数据存放目录
path.logs: /ELK/elasticsearch/data/log    #日志保存目录
bootstrap.memory_lock: true    #服务启动的时候锁定足够的内存,防止数据写入swap
network.host: 172.18.12.164    #监听的IP地址
http.port: 9200    #服务监听的端口
discovery.seed_hosts: ["172.18.12.172", "172.18.12.173"]   #单播配置一台即可
cluster.initial_master_nodes: ["elk-node1", "elk-node2"]  
复制代码

二、配置内存限制

[root@localhost config]# vim jvm.options
复制代码

配置如下:

-Xms2g
-Xmx2g
复制代码

最小和最大内存限制,为什么最小和最大设置一样大?
参考:www.elastic.co/guide/en/el…

三、创建用户以及数据目录

[root@localhost config]# mkdir -p /ELK/elasticsearch/{data,data/log}
[root@localhost elasticsearch]# groupadd elk
[root@localhost elasticsearch]# useradd -g elk elk
[root@localhost elasticsearch]# passwd elk
[root@localhost elasticsearch]#  chown -R elk:elk /ELK/elasticsearch/ -R
[root@localhost bin]# su elk
[elk@localhost elasticsearch]# cd bin/
[elk@localhost bin]# ./elasticsearch
复制代码
ERROR: [3] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
[2]: memory locking requested for elasticsearch process but memory is not locked
[3]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
复制代码

启动报错:需要修改文件的最大打开数以及内存锁定

修改内核参数

[root@localhost bin]# vim /etc/security/limits.conf
复制代码

配置如下:

* soft nofile 65536
* hard nofile 131072
* soft memlock unlimited
* hard memlock unlimited
复制代码

修改最大线程数

[root@localhost bin]# vim /etc/security/limits.d/20-nproc.conf
复制代码

配置如下:

*     soft    nproc    unlimited
复制代码

[root@localhost bin]# vim /etc/sysctl.conf
复制代码

配置如下:

vm.max_map_count = 655360
复制代码

令配置生效:

[root@localhost bin]# sysctl -p
[root@localhost bin]# reboot
复制代码

四、启动服务

[root@localhost bin]# su elk
[elk@localhost elasticsearch]# cd bin/
[elk@localhost bin]# ./elasticsearch
[elk@localhost bin]$ yum -y install net-tools
[elk@localhost bin]# netstat -nltup |grep java
复制代码
tcp6       0      0 172.18.12.164:9200      :::*                    LISTEN      9971/java           
tcp6       0      0 172.18.12.164:9300      :::*                    LISTEN      9971/java  
复制代码

同理配置另一台bin/elasticsearch.yml

[root@localhost tmp]# tar -zxvf elasticsearch-7.4.3.tar.gz 
[root@localhost tmp]# mkdir /ELK
[root@localhost tmp]# mv elasticsearch-7.4.3 /ELK/elasticsearch
[root@localhost /]# cd ELK/elasticsearch/config/
[root@localhost config]# vim elasticsearch.yml
-----------------------------------------------------------------------------------
cluster.name: ELK-Cluster    #ELK的集群名称,名称相同即属于是同一个集群
node.name: elk-node2    #本机在集群内的节点名称
path.data: /ELK/elasticsearch/data    #数据存放目录
path.logs: /ELK/elasticsearch/data/log    #日志保存目录
bootstrap.memory_lock: true    #服务启动的时候锁定足够的内存,防止数据写入swap
network.host: 172.18.12.166    #监听的IP地址
http.port: 9200    #服务监听的端口
discovery.seed_hosts: ["172.18.12.172", "172.18.12.173"]   #单播配置一台即可
cluster.initial_master_nodes: ["elk-node1", "elk-node2"]   
-----------------------------------------------------------------------------------
[root@localhost config]# vim jvm.options
-----------------------------------------------------------------------------------
-Xms2g
-Xmx2g
-----------------------------------------------------------------------------------
[root@localhost config]# mkdir -p /ELK/elasticsearch/{data,data/log}
[root@localhost elasticsearch]# groupadd elk
[root@localhost elasticsearch]# useradd -g elk elk
[root@localhost elasticsearch]# passwd elk
[root@localhost elasticsearch]#  chown -R elk:elk /ELK/elasticsearch/ -R
[root@localhost bin]# su elk
[elk@localhost elasticsearch]# cd bin/
[elk@localhost bin]# ./elasticsearch
[elk@localhost bin]$ yum -y install net-tools
[elk@localhost bin]# netstat -nltup |grep java

tcp6       0      0 172.18.12.164:9200      :::*                    LISTEN      9971/java           
tcp6       0      0 172.18.12.164:9300      :::*                    LISTEN      9971/java  
复制代码

Elasticsearch-head插件


一、解压并安装head插件&npm

[root@localhost tmp]# tar -zxvf elasticsearch-head.tar.gz
[root@localhost tmp]# mv elasticsearch-head /ELK/elasticsearch-head
[root@localhost tmp]# xz -d node-v12.14.0-linux-x64.tar.xz
[root@localhost tmp]# tar -xvf  node-v12.14.0-linux-x64.tar 
[root@localhost ELK]# ln -s /ELK/nodejs/bin/node /usr/bin/node
[root@localhost tmp]# mv node-v12.14.0-linux-x64 /ELK/nodejs
[root@localhost ELK]# ln -s /ELK/nodejs/bin/npm /usr/bin/npm                                    //建立软连接
[root@localhost elasticsearch-head]# npm install --registry=https://registry.npm.taobao.org     //使用淘宝源
[root@localhost elasticsearch-head]# npm run start
[root@localhost elasticsearch-head]# npm run start &		                                //后台启动
复制代码

二、访问http://IP___:9100

三、分别修改所有elasticsearch服务配置文件,开启跨域访问支持,然后重启elasticsearch服务

[root@localhost elasticsearch]# vim /ELK/elasticsearch/config/elasticsearch.yml 
复制代码

配置如下:

http.cors.enabled: true     
http.cors.allow-origin: "*"
复制代码
[root@localhost bin]# ps -ef |grep elastic

elk        9971      1  0 13:22 pts/0    00:00:45 /tmp/jdk1.8.0_221/bin/java -Xms2g -Xmx2g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Djava.io.tmpdir=/tmp/elasticsearch.JlwA3m72 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=data -XX:ErrorFile=logs/hs_err_pid%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -Xloggc:logs/gc.log -XX:+UseGCLogFil

[root@localhost bin]# kill -9 9971
[root@localhost bin]# su elk
[elk@localhost bin]$ ./elasticsearch &
复制代码

四、浏览器访问9100端口,将连接地址修改为elasticsearch地址

五、提交测试数据

Master和Slave的区别:

Master的职责:
统计各node节点状态信息、集群状态信息统计、索引的创建和删除、索引分配的管理、关闭node节点等

Savle的职责
同步数据、等待机会成为Master


Logstash部署

一、测试标准输入输出

[root@localhost tmp]$ mv logstash-7.5.1 /ELK/logstash
[root@localhost ELK]# cd logstash/bin/
[root@elk-node1 logstash]# vim /ELK/logstash/config/logstash.yml 
复制代码

配置logstash.yml

http.host: "192.168.30.129"
http.port: 9600
复制代码

测试标准输入输出

[root@localhost bin]# ./logstash -e 'input { stdin {} } output { stdout { codec => rubydebug} }'
复制代码

输入:hello word

{
      "@version" => "1",
    "@timestamp" => 2019-12-19T07:33:46.725Z,
       "message" => "hello word",
          "host" => "localhost"
}
复制代码

二、测试输出到文件

[root@localhost bin]# ./logstash -e 'input { stdin{} } output { file { path => "/tmp/log-%{+YYYY.MM.dd}messages.gz"}}'
复制代码

输入:

hello word

[2019-12-19T15:44:02,238][INFO ][logstash.outputs.file    ][main] Opening file {:path=>"/tmp/log-2019.12.19messages.gz"}
[2019-12-19T15:44:20,886][INFO ][logstash.outputs.file    ][main] Closing file /tmp/log-2019.12.19messages.gz
复制代码

查看文件内容:

[root@localhost bin]# tail /tmp/log-2019.12.19messages.gz 

{"message":"hello world","@version":"1","@timestamp":"2019-12-19T07:44:01.261Z","host":"localhost"}
复制代码

三、测试输出到elasticsearch

[root@linux-elk1 ~]#  ./logstash -e 'input {  stdin{} } output { elasticsearch {hosts => ["172.18.12.164:9200"] index => "mytest-%{+YYYY.MM.dd}" }}'
复制代码

四、elasticsearch服务器验证收到数据

[root@localhost /]# ll /ELK/elasticsearch/data/nodes/0/indices/

总用量 0
drwxrwxr-x. 8 elk elk 65 12月 19 15:51 bOpOoG7xRQW7OVV06ufvAw
drwxrwxr-x. 8 elk elk 65 12月 19 14:51 mPiADPveTbyGdvj-i9W7Uw
复制代码


kibana部署

一、解压并配置 kibana.yml

[root@localhost tmp]# tar -zxvf kibana-7.5.1-linux-x86_64.tar.gz 
[root@localhost tmp]# mv kibana-7.5.1-linux-x86_64 /ELK/kibana
[root@localhost tmp]# cd /ELK/kibana/config/
[root@localhost config]# vim kibana.yml
复制代码

配置如下

server.port: 5601    #监听端口
server.host: "172.18.12.164"    #监听地址
elasticsearch.hosts: ["http://172.18.12.164:9200","http://172.18.12.166:9200"] #elasticsearch服务器地址
i18n.locale: "zh-CN"    #修改为中文
复制代码

Kibana.yml配置文件详解

二、启动并验证

[root@localhost bin]# cd /ELK/kibana/bin/
[root@localhost bin]# ./kibana --allow-root
复制代码


Elastic Stack实战

一、收集yum日志

[root@elk-node1 logstash]# mkdir conf.d
[root@elk-node1 logstash]# touch conf.d/yum-log.conf
[root@elk-node1 logstash]# vim conf.d/yum-log.conf 
复制代码

编辑新增配置文件:

input {
    file {
        path => "/var/log/yum.log"     
        type => "systemlog"                    start_position => "beginning"        
        stat_interval => "2"    
    }
}

output {
    elasticsearch {
        hosts => ["172.18.12.172:9200"]       
        index => "logstash-%{type}-%{+YYYY.MM.dd}"    
    }
}
复制代码

检测配置文件语法是否正确:

[root@elk-node1 logstash]# /ELK/logstash/bin/logstash -f /ELK/logstash/conf.d/yum-log.conf  -t
复制代码
Thread.exclusive is deprecated, use Thread::Mutex
Sending Logstash logs to /ELK/logstash/logs which is now configured via log4j2.properties
[2019-12-20T16:53:29,595][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.queue", :path=>"/ELK/logstash/data/queue"}
[2019-12-20T16:53:29,615][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.dead_letter_queue", :path=>"/ELK/logstash/data/dead_letter_queue"}
[2019-12-20T16:53:30,038][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2019-12-20T16:53:31,328][INFO ][org.reflections.Reflections] Reflections took 67 ms to scan 1 urls, producing 20 keys and 40 values 
Configuration OK
[2019-12-20T16:53:31,979][INFO ][logstash.runner ] Using config.test_and_exit mode. Config Validation Result: OK. Exiting Logstash
复制代码

二、重启logstash服务

[root@elk-node1 logstash]# /ELK/logstash/bin/logstash -f /ELK/logstash/conf.d/yum-log.conf  &
复制代码

三、Kibana可视化界面配置