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 架构

常见的日志分析解决方案:

elk查询日志固定查询_elk查询日志固定查询

1) 最简单的架构

elk查询日志固定查询_centos_02

由Logstash 收集 APPserver 日志并进行分析,输出给ES进行存储、分析,最后通过 Kibana 拉取数据生成图形化界面呈现给用户

这种架构实现简单,但是 对CPU以及系统资源消耗比较严重。

2) 使用 Filebeat 作为日志收集器

这种架构解决了 Logstash 在各个服务器上占用过高的系统资源问题,Filebeat 相比较Logstash 占用资源小。

elk查询日志固定查询_elk查询日志固定查询_03

3) 加入消息列队

这种架构适用于大型 日志分析系统,通过消息队列降低了网络堵塞,减少了数据丢失的情况。

elk查询日志固定查询_zookeeper_04


3. ELK 方案工作流程

elk查询日志固定查询_centos_05

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;
    }