前言
什么是ELK?
通俗来讲,ELK是由Elasticsearch、Logstash、Kibana 三个开源软件的组成的一个组合体,这三个软件当中,每个软件用于完成不同的功能,ELK 又称为ELK stack,官方域名为stactic.co,ELK stack的主要优点有如下几个:
处理方式灵活: elasticsearch是实时全文索引,具有强大的搜索功能
配置相对简单:elasticsearch全部使用JSON 接口,logstash使用模块配置,kibana的配置文件部分更简单。
检索性能高效:基于优秀的设计,虽然每次查询都是实时,但是也可以达到百亿级数据的查询秒级响应。
集群线性扩展:elasticsearch和logstash都可以灵活线性扩展
前端操作绚丽:kibana的前端设计比较绚丽,而且操作简单
什么是Elasticsearch:
是一个高度可扩展的开源全文搜索和分析引擎,它可实现数据的实时全文搜索搜索、支持分布式可实现高可用、提供API接口,可以处理大规模日志数据,比如Nginx、Tomcat、系统日志等功能
什么是Logstash:
可以通过插件实现日志收集和转发,支持日志过滤,支持普通log、自定义json格式的日志解析。
什么是kibana:
主要是通过接口调用elasticsearch的数据,并进行前端数据可视化的展现。
一、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
- 通过浏览器访问elasticsearch服务端口
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
PS:hostname是新增的,不要忘记原有的true后面加,符号
- 修改连接地址/opt/elasticsearch-head-master/_site/app.js
- 下载运行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页面验证
- 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
#获取到的是一个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
四、收集官网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展示
- 创建索引
- 展示收集的日志
- 定义图像,展示
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