前言

什么是ELK?

通俗来讲,ELK是由Elasticsearch、Logstash、Kibana 三个开源软件的组成的一个组合体,这三个软件当中,每个软件用于完成不同的功能,ELK 又称为ELK stack,官方域名为stactic.co,ELK stack的主要优点有如下几个:
处理方式灵活: elasticsearch是实时全文索引,具有强大的搜索功能
配置相对简单:elasticsearch全部使用JSON 接口,logstash使用模块配置,kibana的配置文件部分更简单。
检索性能高效:基于优秀的设计,虽然每次查询都是实时,但是也可以达到百亿级数据的查询秒级响应。
集群线性扩展:elasticsearch和logstash都可以灵活线性扩展
前端操作绚丽:kibana的前端设计比较绚丽,而且操作简单

什么是Elasticsearch:

是一个高度可扩展的开源全文搜索和分析引擎,它可实现数据的实时全文搜索搜索、支持分布式可实现高可用、提供API接口,可以处理大规模日志数据,比如Nginx、Tomcat、系统日志等功能

ELK-7.0安装部署收集展示_第1张图片

什么是Logstash:

可以通过插件实现日志收集和转发,支持日志过滤,支持普通log、自定义json格式的日志解析。

ELK-7.0安装部署收集展示_第2张图片

什么是kibana:

主要是通过接口调用elasticsearch的数据,并进行前端数据可视化的展现。

ELK-7.0安装部署收集展示_第3张图片

一、elasticsearch部署:

1、环境准备

服务版本 IP地址 主机名
elasticsearch-7.0.0-x86_64 10.201.1.121 linux-host1.exmaple.com
elasticsearch-7.0.0-x86_64 10.201.1.122 linux-host2.exmaple.com
  • 关闭防所有服务器的火墙和selinux
systemctl  disable  firewalld
systemctl  disable  NetworkManager
sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
echo "* soft nofile 65536" >> /etc/security/limits.conf
echo "* hard nofile 65536" >> /etc/security/limits.conf
  • 设置epel源、安装基本操作命令并同步时间:
[root@linux-host1 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@linux-host1 ~]# yum install -y net-tools vim lrzsz tree screen lsof tcpdump wget ntpdate
[root@linux-host1 ~]# cp /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime 
[root@linux-host1 ~]# echo "*/5 * * * *  ntpdate time1.aliyun.com &> /dev/null && hwclock -w" >> /var/spool/cron/root
[root@linux-host1 ~]# systemctl  restart crond
[root@linux-host1 ~]# reboot  
  • 在两台服务器准备java环境:

下载二进制包自定义profile环境变量:

下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
[root@linux-host1 ~]# tar xvf jdk-8u121-linux-x64.tar.gz  -C /usr/local/
[root@linux-host1 ~]# ln -sv /usr/local/jdk1.8.0_121 /usr/local/jdk
[root@linux-host1 ~]# vim /etc/profile
export HISTTIMEFORMAT="%F %T `whoami` "
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
[root@linux-host1 ~]# source  /etc/profile
[root@linux-host1 ~]# java -version
java version "1.8.0_121" #确认可以出现当前的java版本号
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

2、官网下载elasticsearch并安装:

下载地址:https://www.elastic.co/cn/downloads/elasticsearch
rpm -ivh elk/elasticsearch-7.0.0-x86_64.rpm
  • 编辑各elasticsearch服务器的服务配置文件
[root@linux-host1 elk]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml 
cluster.name: hkstv
node.name: node-1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["10.201.1.121", "10.201.1.122"]
cluster.initial_master_nodes: ["10.201.1.121", "10.201.1.122"]
[root@linux-host2 ~]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml 
cluster.name: hkstv
node.name: node-2
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["10.201.1.121", "10.201.1.122"]
cluster.initial_master_nodes: ["10.201.1.121", "10.201.1.122"]
  • 启动elasticsearch服务并验证:
 systemctl  restart elasticsearch

ELK-7.0安装部署收集展示_第4张图片

  • 通过浏览器访问elasticsearch服务端口

ELK-7.0安装部署收集展示_第5张图片

3、安装elasticsearch插件之head:(两台其中一台安装即可)

插件是为了完成不同的功能,官方提供了一些插件但大部分是收费的,另外也有一些开发爱好者提供的插件,可以实现对elasticsearch集群的状态监控与管理配置等功能。

Elasticsearch7.0不能使用命令直接安装head插件

  • 修改配置文件/etc/elasticsearch/elasticsearch.yml增加参数
# 增加参数,使head插件可以访问es 
http.cors.enabled: true 
http.cors.allow-origin: "*"
  • 下载head插件 解压至/opt目录下
wget  https://github.com/mobz/elasticsearch-head/archive/master.zip
  • 安装node
wget https://npm.taobao.org/mirrors/node/latest-v4.x/node-v4.4.7-linux-x64.tar.gz
tar -zxvf node-v4.4.7-linux-x64.tar.gz
  • 修改环境变量/etc/profile添加
export NODE_HOME=/opt/node-v4.4.7-linux-x64
export PATH=$PATH:$NODE_HOME/bin
export NODE_PATH=$NODE_HOME/lib/node_modules
  • 设置生效
source /etc/profile
  • 安装grunt
cd /opt/elasticsearch-head-master
npm install -g grunt-cli 
  • 修改head插件源码/opt/elasticsearch-head-master/Gruntfile.js

ELK-7.0安装部署收集展示_第6张图片

PS:hostname是新增的,不要忘记原有的true后面加,符号

  • 修改连接地址/opt/elasticsearch-head-master/_site/app.js

ELK-7.0安装部署收集展示_第7张图片

  • 下载运行head必要的文件(放置在文件夹/tmp下)
cd /tmp
wget https://github.com/Medium/phantomjs/releases/download/v2.1.1/phantomjs-2.1.1-linux-x86_64.tar.bz2
yum -y install bzip2
  • 运行head
cd /opt/elasticsearch-head-master
npm install 
  • 后台启动

grunt server &

  • web页面验证

ELK-7.0安装部署收集展示_第8张图片

  • Master与Slave的区别:
    Master的职责:
    统计各node节点状态信息、集群状态信息统计、索引的创建和删除、索引分配的管理、关闭node节点等
    Slave的职责:
    同步数据、等待机会成为Master

4、监控elasticsearch集群状态:

  • 通过shell命令获取集群状态:
[root@linux-host1 elk]# curl -sXGET  http://10.201.1.121:9200/_cluster/health?pretty=true

ELK-7.0安装部署收集展示_第9张图片

#获取到的是一个json格式的返回值,那就可以通过python对其中的信息进行分析,例如对status进行分析,如果等于green(绿色)就是运行在正常,等于yellow(×××)表示副本分片丢失,red(红色)表示主分片丢失

  • python脚本
[root@linux-host1 ~]# cat els-cluster-monitor.py 
#!/usr/bin/env python
#coding:utf-8

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
import subprocess
body = ""
false="false"
obj = subprocess.Popen(("curl -sXGET http://10.201.1.121:9200/_cluster/health?pretty=true"),shell=True, stdout=subprocess.PIPE)
data =  obj.stdout.read()
data1 = eval(data)
status = data1.get("status")
if status == "green":
    print "50"
else:
    print "100"
  • 脚本执行结果:
[root@linux-host1 ~]# python els-cluster-monitor.py 
50

二、部署logstash:

1、环境准备

服务版本 IP地址 主机名
logstash-7.0.0 10.201.1.123 linux-host3.exmaple.com

关闭防火墙和selinux,并且安装java环境

[root@linux-host3 ~]# systemctl  stop firewalld
[root@linux-host3 ~]# systemctl  disable  firewalld
[root@linux-host3 ~]# sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config
[root@linux-host3 ~]# yum install  jdk-8u121-linux-x64.rpm
[root@linux-host3 ~]# java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)
[root@linux-host3 ~]# reboot

2、安装logstash:

rpm -ivh logstash-7.0.0.rpm 

三、部署kibana:

Kibana是一个通过调用elasticsearch服务器进行图形化展示搜索结果的开源项目。

服务版本 IP地址 主机名
kibana-7.0.0 10.201.1.122 linux-host2.exmaple.com
  • 安装kibana
rpm -ivh kibana-7.0.0-x86_64.rpm
  • 配置kibana
[root@linux-host2 ~]#  grep  "^[a-Z]" /etc/kibana/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://10.201.1.121:9200"]
  • 启动kibana服务并验证:
systemctl  start kibana
systemctl  enable  kibana
ss -tnl | grep 5601
  • 查看状态:

http://10.201.1.122:5601/status

ELK-7.0安装部署收集展示_第10张图片

四、收集官网nginx的访问日志

nginx服务器地址:10.201.1.8

  • 收集流程

在10.201.1.8服务器上安装filebeat,通过配置filebeat来收集access.log,同时将收集到的日志输出到redis上,redis服务器地址为10.201.1.124
然后10.201.1.123上的logstash收集redis中存放的日志,将日志存放到els中,最终通过配置kibana实现业务展示

1、在10.201.1.8上安装filebeat

rpm -ivh filebeat-7.0.0-x86_64.rpm
  • 设置nginx日志格式
  log_format  json '{"user_ip":"$http_x_real_ip","lan_ip":"$remote_addr","log_time":"$time_iso8601","user_req":"$request","http_code":"$status","body_bytes_sent":"$body_bytes_sent","req_time":"$request_time","user_ua":"$http_user_agent"}';
    access_log  /var/log/nginx/access.log  json;
  • 配置filebeat
cat /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  enabled: true 
  paths:
    - /var/log/nginx/access.log
  exclude_lines: ['10.201.1.36', '10.201.1.37', 'png', 'PlayDuration', '127.0.0.1', 'jpg', 'js', 'css', 'POST', 'skin']
  include_lines: ['html', 'tpl']
filebeat.config.modules:
  path: ${path.config}/modules.d/*.yml
  reload.enabled: false
setup.template.settings:
  index.number_of_shards: 1
setup.kibana:
output.redis:
  hosts: ["10.201.1.124:6379"]
  key: "nginx-log"
  db: 0
  timeout: 5
processors:
  - add_host_metadata: ~
  - add_cloud_metadata: ~
  • 启动filebeat
 systemctl  start filebeat
  • 验证redis是否有数据
[root@linux-host4 ~]# redis-cli localhost
10.201.1.124:6379> keys *
1) "nginx-log"

2、10.201.1.123上的logstash收集日志

  • 通过地图统计客户IP所在城市
cd /etc/logstash/
wget http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz
gunzip  GeoLite2-City.tar.gz
tar xf GeoLite2-City.tar
配置logstash使用地址库
其中elasticsearch 的索引名称必须必须必须以logstash-开头。
  • 配置收集规则
[root@linux-host3 elk]# cat /etc/logstash/conf.d/1.conf 
input{
redis {
    host => "10.201.1.124"
    port => "6379"
    db => "0"
    key => "nginx-log"
    data_type => "list"
 }

}
filter{

json {
        source => "message"
        remove_field => ["tags","beat","message"]
    }
useragent {
source =>"user_ua"
target =>"userAgent"
}
geoip {
                source => "lan_ip" 
                target => "geoip"
                database => "/etc/logstash/GeoLite2-City_20190430/GeoLite2-City.mmdb"
                add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
                add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}"  ]
                remove_field => ["[geoip][latitude]", "[geoip][longitude]", "[geoip][country_code]", "[geoip][country_code2]", "[geoip][country_code3]", "[geoip][timezone]", "[geoip][continent_code]", "[geoip][region_code]"]
        }
    mutate {
      convert => [ "[geoip][coordinates]", "float"]
      convert => [ "req_time","integer" ]
      convert => [ "body_bytes_sent","integer" ]
      remove_field => "timestamp"
      remove_field => "version"
      remove_field => "offset"
      remove_field => "user_ip"
    }

}
output{
    elasticsearch {
            hosts => ["10.201.1.121:9200"]
            index => "logstash-nginx-access-%{+YYYY.MM.dd}"
        }  
}
  • 重启logstash
systemctl  restart logstash

3、kibana展示

  • 创建索引

ELK-7.0安装部署收集展示_第11张图片

  • 展示收集的日志

ELK-7.0安装部署收集展示_第12张图片

  • 定义图像,展示

ELK-7.0安装部署收集展示_第13张图片

ELK-7.0安装部署收集展示_第14张图片

ELK-7.0安装部署收集展示_第15张图片

4、ELK定时删除30天前日志

  • 在10.201.1.121上写脚本
[root@linux-host1 opt]# cat /opt/elk_del.sh 
#!/bin/bash
DATE=`date -d "30 days ago" +%Y.%m.%d`
curl -s  -XGET http://127.0.0.1:9200/_cat/indices?v| grep $DATE | awk -F '[ ]+' '{print $3}' >/tmp/elk.log
for elk in `cat /tmp/elk.log`
do
        curl  -XDELETE  "http://127.0.0.1:9200/$elk"
done
  • 添加定时任务
00 01 * * * bash /opt/elk_del.sh &>/dev/null