1. ELK
ELK (Elasticearch 、 Logstash 、 kibana)日志分析系统,顾名思义,就是可以收集服务器的日志生成日志报表,以更直观的方式呈现给管理员,方便管理员对服务进行了解
Elasticearch 、 Logstash 、 kibana 三款软件都是 开源工具, 官方为:http://www.elastic.co/cn
日志系统: 收集日志 分析日志数据 友好的web
1)信息的查找 异常(worning error nnot fount) 2) 服务诊断 分析服务器的负载情况和运行状态 优化 3) 数据分析 —》 top 10
组成部分:
1)采集端 agent 负责对日志源数据进行采集、封装、并发送给聚合端,
2) 聚合段 collector
负责接收来自采集端的数据,按照 一定规则进行数据处理,将数据发送给存储 端
3) 存储段 store
数据存储(可扩展性、可靠性
2. ELK 组件
1) ElasticSearch (分布式存储引擎)
ES 是一个开源分布式分析搜索引擎,建立在全文搜索引擎库的基础上,同时隐藏了 Apache Lucene 的复杂性,ES 将所有的 功能都大大的包围了一个独立服务,并提供了一个简单的RESTfule 的接口,它具有分布式、零基础、自动发现、索引自动分片、多数据源、自动搜索负载等等
2) Logstash(数据搜集引擎)
Logstash 是一个完全开源的工具,主要用于日志的手机、分析、过滤日志,几乎支持所有的类型的日志,同时可以对数据处理,并输出给 ES
3) Kibana(数据分析和可视化平台)
Kibana 是一个开源的免费工具,Kibana 可以为 Logstash 和ES 提供图形化日志分析的 web 界面,可以汇总、分析和搜索需要的重要数据日志。
4) Filebeat(ELK协议栈的新成员)
Filebeat 是一个轻量级的开源日志文件数据搜集器,基于Logstash-Forwarder 源代码开发,在需要手机日志的数据 server上安装Filebeat ,并制定日志目录或日志文件后,Filebeat 就能读取数据,徐苏发送到Logstash 进行解析,或者直接发送给 ES 进行集中存储和分析
3. ELK 架构
常见的日志分析解决方案:
1) 最简单的架构
由Logstash 收集 APPserver 日志并进行分析,输出给ES进行存储、分析,最后通过 Kibana 拉取数据生成图形化界面呈现给用户
这种架构实现简单,但是 对CPU以及系统资源消耗比较严重。
2) 使用 Filebeat 作为日志收集器
这种架构解决了 Logstash 在各个服务器上占用过高的系统资源问题,Filebeat 相比较Logstash 占用资源小。
3) 加入消息列队
这种架构适用于大型 日志分析系统,通过消息队列降低了网络堵塞,减少了数据丢失的情况。
3. ELK 方案工作流程
1) APPServer 生成日志,由 Filebeat 收集Server 生成的日志,经过消息队列输出至 Logstash 服务进行分析数据。
2) Logstash 将分析好的数据输出至 ES 进行存储、分析。
3) 最后 Kibana 拉取 ES 的数据,并生成图形化界面呈现给用户。
4) Kibana 通过 ES 实现对日志数据的搜索。
4. 部署 ELK 日志分析系统
实现环境:
ES: 192.168.116.103:9200
Kibana: 192.168.116.104:5601
Logstash: 192.168.116.105:
Filebeat: 192.168.116.106:
服务器 | 部署环境 |
ES | 部署JAVA环境,安装ES分布式系统 |
Kibna | 部署 JAVA 环境,部署Kibana,并部署消息队列(虚拟机紧张,当然了也可以单独部署在另一台) |
Logstash | 部署 Logstash |
Filebeat | 部署 Nginx,作为 AppServer ,安装 filebeat 收集日志 |
部署 ES 日志分析系统
因是实验环境,所以采用一台 服务器做 ES,生产环境中需使用多个节点。
详情可参考:
1) 部署 java 环境
所需软件: jdk-8u201-linux-x64.tar.gz
[root@localhost ~]# tar -zxf jdk-8u201-linux-x64.tar.gz
[root@localhost ~]# mv jdk1.8.0_201/ /usr/local/java
[root@localhost ~]# echo 'export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:%JAVA_HOME/bin:$JRE_HOME/bin ' >> /etc/profile
[root@localhost ~]# rm -rf /usr/bin/java
[root@localhost ~]# source /etc/profile
# 重新读取系统变量文件
[root@localhost ~]# java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
2) 部署 ES 系统
- 详情可参考:
- 修改文件读取数量
[root@localhost ~]# vim /etc/security/limits.conf
# 末尾添加
* soft nofile 655360
* hard nofile 655360
* soft nproc 2048
* hard nproc 4096
[root@localhost ~]# echo "vm.max_map_count=655360" >> /etc/sysctl.conf
[root@localhost ~]# sysctl -p
vm.max_map_count = 655360
- 安装 ES
[root@localhost ~]# ntpdate ntp.ntsc.ac.cn
# 同步各服务器时间
[root@localhost ~]# tar -zxf elasticsearch-6.3.2.tar.gz
[root@localhost ~]# mv elasticsearch-6.3.2 /usr/local/es
[root@localhost ~]# useradd es
# 创建ES 运行用户,ES使用 root 用户运行报错。
[root@localhost ~]# mkdir -p /es/{data,logs}
# 创建 数据、日志存储目录
[root@localhost ~]# chown -R es:es /usr/local/es/
- 重启服务器
- 修改 ES 配置文件
[root@localhost ~]# vim /usr/local/es/config/elasticsearch.yml
# ---------------------------------- Cluster -----------------------------------
cluster.name: my-application
# ------------------------------------ Node ------------------------------------
node.name: node-1 # 节点名称
node.data: true # 表示为数据节点
node.master: true # 具有 master 选举资格
# ----------------------------------- Paths ------------------------------------
path.data: /es/data # 指定数据存放目录
path.logs: /es/logs # 指定日志存储目录
# ---------------------------------- Network -----------------------------------
network.host: 192.168.116.103 # 指定 ES 本机地址
http.port: 9200
# --------------------------------- Discovery ----------------------------------
discovery.zen.minimum_master_nodes: 1 # 由几个节点组成集群
- 暂时先不启动
部署Kibana、Kafka
因实验环境,将其部署在一起
1) 部署 Kibana
- Kibana 端口 5601
- 安装 kibana
[root@localhost ~]# tar -zxf kibana-6.3.2-linux-x86_64.tar.gz
[root@localhost ~]# mv kibana-6.3.2-linux-x86_64 /usr/local/kibana
- 修改Kibana配置文件
- 并指定 ES 地址与端口用于拉取 日志数据
[root@localhost ~]# vim /usr/local/kibana/config/kibana.yml
server.port: 5601
# 监听端口
server.host: "192.168.116.104"
# 监听地址
elasticsearch.url: "http://192.168.116.103:9200"
# 指定 ES 地址,用于拉取数据
2) 部署 JAVA 环境
[root@localhost ~]# tar -zxf jdk-8u201-linux-x64.tar.gz
[root@localhost ~]# mv jdk1.8.0_201/ /usr/local/java
[root@localhost ~]# echo 'export JAVA_HOME=/usr/local/java
export JRE_HOME=/usr/local/java/jre
export CLASSPATH=$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$PATH:%JAVA_HOME/bin:$JRE_HOME/bin ' >> /etc/profile
[root@localhost ~]# rm -rf /usr/bin/java
[root@localhost ~]# source /etc/profile
# 重新读取系统变量文件
[root@localhost ~]# java -version
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
3) 部署 Zookeeper
- zookeeper 端口 2181
Kafka 依赖于 Zookeeper 来保存集群的数据信息,从而保证系统的可用性
[root@localhost ~]# tar -zxf zookeeper-3.4.12.tar.gz
[root@localhost ~]# mv zookeeper-3.4.12 /usr/local/zookeeper
- 定义 zookeeper 的标识
[root@localhost ~]# cd /usr/local/zookeeper/
[root@localhost zookeeper]# mkdir data
[root@localhost zookeeper]# echo 1 > data/myid
- copy zookeeper 配置文件
[root@localhost ~]# cd /usr/local/zookeeper/
[root@localhost zookeeper]# cp conf/zoo_sample.cfg conf/zoo.cfg
- 修改 Zookeeper 配置文件
[root@localhost zookeeper]# vim conf/zoo.cfg
dataDir=/usr/local/zookeeper/data
# 指定数据存放目录
dataLogDir=/usr/local/zookeeper/data
# 指定日志存放位置
- 启动 zookeeper
[root@localhost zookeeper]# /usr/local/zookeeper/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
- 检测服务
[root@localhost ~]# netstat -anpt | grep LISTEN | grep 2181
tcp6 0 0 :::2181 :::* LISTEN 1560/java
- 如果服务器启动没有报错,但是服务没有跑起来,大多数是因为 java 变量问题。
4) 部署 Kafka
- 安装 卡夫卡
[root@localhost ~]# tar -zxf kafka_2.12-2.1.0.tgz
[root@localhost ~]# mv kafka_2.12-2.1.0 /usr/local/kafka
- 修改 kafka 配置文件
[root@localhost ~]# vim /usr/local/kafka/config/server.properties
broker.id=1
# 修改标识 ID
listeners=PLAINTEXT://192.168.116.104:9092
# 指定本机地址,9092 为kafka 监听地址
num.partitions=2
# 几个分
log.dirs=/usr/local/kafka/data
# 指定kafka日志存放位置
zookeeper.connect=192.168.116.104:2181
# 指定zookeeper 地址与端口号,如有多个 zookeeper 使用 , 隔开
- 运行 kafa
[root@localhost ~]# /usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
[root@localhost ~]# netstat -anpt | grep 9092
tcp6 0 0 192.168.116.104:9092 :::*
- 创建topic(主题)测试
- 可以理解为创建一个消息队列
[root@localhost ~]# /usr/local/kafka/bin/kafka-topics.sh --create --zookeeper 192.168.116.104:2181 --replication-factor 1 --partitions 2 --topic elk
Created topic "elk".
参数含义:
kafka-topics.sh # 命令字
zookeeper # 使用哪个 zookeeper
--replication-factor # 指定分区个数
--toplic # 主题名称
- 模拟生产者
[root@localhost kafka]# /usr/local/kafka/bin/kafka-console-producer.sh --broker-list 192.168.116.104:9092 --topic elk
- 模拟消费者
[root@localhost ~]# /usr/local/kafka/bin/kafka-console-consumer.sh --bootstrap-server 192.168.116.104:9092 --topic elk --from-beginning
- 当生产者与消费者运行起来,会进入阻塞状态,这时在 生产者的阻塞状态下,在屏幕中输入的任何内容,都会同步至 消费者的 阻塞界面
部署 Logstash
1) 安装 Logstash
[root@localhost ~]# tar -zxf logstash-6.3.2.tar.gz
[root@localhost ~]# mv logstash-6.3.2 /usr/local/logstash
- 修改 logstash 的配置文件
[root@localhost ~]# vim /usr/local/logstash/config/logstash.yml
# ------------ Pipeline Configuration Settings --------------
path.config: /usr/local/logstash/config/*.conf # 自动识别配置文件路径
config.reload.automatic: true # 配置文件自动重载
config.reload.interval: 3s # 自动加载时间间隔
# ------------ Metrics Settings --------------
http.host: "192.168.116.105" # 指定本机地址
部署 Filebeat
1) 部署 Nginx
[root@localhost ~]# useradd -M -s /sbin/nologin nginx
[root@localhost ~]# tar zxf nginx-1.12.2.tar.gz -C /usr/src/
[root@localhost ~]# cd /usr/src/nginx-1.12.2/
[root@localhost nginx-1.12.2]# ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-pcre && make && make install
[root@localhost nginx-1.12.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
2) 安装 Filebeat
[root@localhost ~]# tar -zxf filebeat-6.3.2-linux-x86_64.tar.gz
[root@localhost ~]# mv filebeat-6.3.2-linux-x86_64 /usr/local/filebeat
方案一:
nginx --》 filebeat --》 logstash --》 es —》 kibana
基于以上搭建的环境,通过以上流程实现
1) 修改 Filebeat 配置文件
- 通过配置文件,设置 Filebeat 所需要收集的日志文件内容,如不设置则默认收集 /var/log/ 目录下的所有日志
- Filebeat 收集的日志内容,将传输至 Logstash 的5044端口
[root@localhost ~]# vim /usr/local/filebeat/filebeat.yml
#=========================== Filebeat inputs =============================
# filebeat.inputs:
# 将该行进行注释
#- type: log
# 将该行进行注释
# 以下内容手写
filebeat:
prospectors:
- type: log
paths:
- /usr/local/nginx/logs/access.log
tags: ["nginx"]
# 以上内容表示输入内容类型为 log
# 所读取的日志文件为 /usr/lcoal/nginx/logs/access.log nginx的成功访问日志
# tags 为标签
enabled: true
# 将 falst 改为 true 刚刚写入的配置文件是否生效
# 以下内容进行注释,禁止读取任何日志
# paths:
# - /var/log/*.log
#-------------------------- Elasticsearch output ------------------------------
# 以下内容注释,禁止将日志内容直接输出给 ES
# output.elasticsearch:
# hosts: ["localhost:9200"]
#----------------------------- Logstash output --------------------------------
# 解开以下注释,将日志内容输出给 Logstash 服务器进行分析
output.logstash:
# The Logstash hosts
hosts: ["192.168.116.105:5044"]
# 指定 Logstash的服务 地址与端口
2) 在 Logstash 服务器中手动编写日志传输的日志文件
- 编写配置文件,使 Logstash 认识 ES,将其从 Filebeat 收到的日志 分析过后的数据输出至 ES 文件系统中进行存储
[root@localhost ~]# vim /usr/local/logstash/config/nginx-logstash.conf
input {
beats {
port => 5044
}
}
output {
elasticsearch {
hosts => "192.168.116.103:9200"
index => "nginx"
}
}
# 参数解释
input { # 输入内容,表示从哪里接收日志内容
beats {
port => 5044 # 044 端口接收从 FIlebeat 传输的日志内容
}
}
output { # 输出内容,将分析好的日志数据,传输至ES
elasticsearch {
hosts => "192.168.116.103:9200" # 指定 ES 的主机、端口
index => "nginx" # 标签为 Nginx
}
}
启动服务
es 》 Logstash 》 Filebeat 》 kibana
- 安装以上顺序启动服务, 将防护墙全部关闭,或者开放对应端口
1)启动 es
- 启动成功后悔进入阻塞状态
[root@localhost ~]# chown -R es:es /es/
[root@localhost ~]# su es
[es@localhost root]$ /usr/local/es/bin/elasticsearch
2) 启动 Logstash
- 启动成功会进入阻塞状态
[root@localhost ~]# /usr/local/logstash/bin/logstash -t /usr/local/logstash/config/nginx-logstash.conf
3) 启动 Filebeat
[root@localhost ~]# /usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml
4) 启动 kibana
[root@localhost ~]# /usr/local/kibana/bin/kibana
此时访问 Nginx,生产日志,然后再访问 kibana进行查看
http://kibana-ip:5601
创建索引样式:
方案二、
nginx 》 filebeat 》 kafka 》 logstash 》 ES 》 kibana
基于以上配置进行修改, filebeat 不再将日志直接输出给 logstash,而是输出给 kafka ,然后又kafka 输出给 logstash, logstash结构 kafka 的日志内容
通过消息队列缓解了 logstash的压力
- 修改 filebeat 配置文件
[root@localhost ~]# vim /usr/local/filebeat/filebeat.yml
# 关闭输出给 logstash,手动编写 输 kafka 内容,并指定输出至那个主题
#----------------------------- Logstash output --------------------------------
#output.logstash:
# The Logstash hosts
# hosts: ["192.168.116.105:5044"]
output.kafka:
enable: true
hosts: ["192.168.116.104:9092"]
topic: "elk"
- 修改logstash 接收文件
[root@localhost ~]# vim /usr/local/logstash/config/nginx-logstash.conf
input {
kafka {
bootstrap_servers => "192.168.116.104:9092"
consumer_threads => 1 # 消费者线程数量
decorate_events => "true" # 消息偏移量、信息加入消息队列
topics => "elk" # 指定主题
auto_offset_reset => "latest"
}
}
output {
elasticsearch {
hosts => "192.168.116.103:9200"
index => "kafka" # 索引样式标签
}
}
# 参数含义
input {
kafka { # 接收kafka输入的消息
bootstrap_servers => "192.168.116.104:9092" # 指定接收的地址端口
consumer_threads => 1 # 指定消费者线程数量
decorate_events => "true" # 消开启息偏移量、信息加入消息队列
topics => "elk" # 指定主题
auto_offset_reset => "latest" # 偏移量自动复位,最新的偏移量
}
}
output {
elasticsearch {
hosts => "192.168.116.103:9200"
index => "kafka" # 索修改引样式标签,便于与nginx 区分
}
}
- 启动kafka服务
- 启动zookeeper
[root@localhost ~]# /usr/local/zookeeper/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
- 启动 kafka
[root@localhost ~]# /usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
1)启动 es
- 启动成功后悔进入阻塞状态
[root@localhost ~]# chown -R es:es /es/
[root@localhost ~]# su es
[es@localhost root]$ /usr/local/es/bin/elasticsearch
2) 启动 Logstash
- 启动成功会进入阻塞状态
[root@localhost ~]# /usr/local/logstash/bin/logstash -t /usr/local/logstash/config/nginx-logstash.conf
3) 启动 Filebeat
[root@localhost ~]# /usr/local/filebeat/filebeat -c /usr/local/filebeat/filebeat.yml
4) 启动 kibana
[root@localhost ~]# /usr/local/kibana/bin/kibana
访问 Nginx ,再访问 kibana
创建索引样式:
基于以上环境,大体都已经搭建完成,但是直接访问 kibana 相对来说不是很安全,我们呢可以搭建一个Nginx 作为反向代理服务器,将 kibana 隐藏起来
- 修改 Nginx 的配置文件
- 最后只访问代理服务器即可
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf
location /{
proxy_pass http://192.168.116.104:5601;
}