ELK日志分析系统

Posted TaKe___Easy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ELK日志分析系统相关的知识,希望对你有一定的参考价值。

一、前言概述与基础理论

1.1 ELK系统简介

  • ELK日志分析系统是由:Elasticsearch、Logstash、Kibana组合而成
    • Elasticsearch:开源分布式搜索引擎。特点有:分布式、零配置、自动发现、索引自动分片、索引副本机制、restful风格接口、多数据源、自动搜索负载等等
    • Logstash:是个完全开源的工具,可以对我们的日志进行收集、过滤。并将其存储供以后使用
    • Kibana:也是个开源和免费的工具。Kibana可以为Logstash和Elasticsearch提供友好的日志分析Web界面,可以帮助我们汇总、分析和搜索重要数据日志

1.2 ELK日志工作原理

APPServer集群
Logstash Agent采集器
ElasticSearch Cluster
Kibana Server
Browser
  • Logstash收集AppServer产生的Log,并存放到Elastic Search集群中,而Kibana则从ES集群中查询数据生成图表,再返回给Browser。
  • 简单的说就是需要经过以下几个步骤
    • 1.将日志进行集中化管理(beats)
      • beats包含以下四种工具
        • ①.Packetbeat(收集网络流量数据)
        • ②.Topbeat(收集系统、进程和文件系统级别的CPU和内存使用情况等数据)
        • ③.Filebeat(收集文件数据)
        • ④.Winlogbeat(收集Windows事件日志数据)
    • 2.将日志格式化(logstash)
    • 3.对格式化后的数据进行索引和存储(elasticsearch)
    • 4.前端数据的展示(Kibana)

1.3 Elasticsearch、Logstash、Kibana详细介绍

1.3.1 Elasticsearch

  • Elasticsearch是一个基于lucene的搜素服务器。它提供了一个分布式多用户能力的全文搜索索引,基于RESTFUL Web接口
  • Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是第二流行的企业搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便
  • 目前GITHUB和百度这些搜索引擎都引荐成了ES搜索引擎
  • Elasticsearch的基础核心概念
    • 1.接近实时(NRT)
      • Elasticsearch是一个接近实时的搜索平台。这意味着从索引一个文档直到这个文档能够被搜索到时会有一个轻微的延迟(通常是1秒)
    • 2.集群(Cluster)
      • 一个集群就是由一个或多个节点组织在一起。它们共同持有整个集群的数据,并一起提供索引和搜索功能。其中一个节点为主节点,这个节点是可以通过选举产生的,并提供跨节点的联合索引和搜索的功能。集群有一个唯一性标示的名字,默认是(Elasticsearch)
      • 集群名字很重要,每个节点是基于集群名字加入到其集群中的。因此需要确保在不同环境中使用不同的集群名字
      • 一个集群可以只有一个节点。建议在配置Elasticsearch时,配置成集群模式
      • es具有集群机制,节点通过集群名称加入到集群中,同时在集群中的节点会有一个自己的唯一身份标识(自己的名称)
    • 3.节点(node)
      • 节点就是一台单一的服务器,是集群的一部分,存储数据并参与集群的索引和搜索功能。
      • 像集群一样,节点也是通过名字来标识。默认是在节点启动时随机分配的字符名。也可以自己定义,该名字很重要,在集群中用于识别服务器对应的节点
      • 节点可以通过指定集群名字来加入到集群中。默认情况,每个节点都被设置加入到Elasticsearch集群。如果启动了多个节点且能自动发现彼此,它们将会自动组建一个名为Elasticsearch的集群
    • 4.索引(index)
      • 一个索引就是一个拥有几分相似特征的文档的集合。比如说你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母),并且当我们要对这个索引中对应的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字
      • 在一个集群中可以定义任意多的索引
      • 索引相当于关系型数据库的库
    • 5.类型(type)
      • 在一个索引中,可以定义一种或多种类型
      • 类型其实就是你的索引的一个逻辑上的分类或分区。其语义完全由你自己决定。通常会为具有一组共同字段的文档定义一个类型。比如说假设你运营一个论坛,且将你所有的数据存储到一个索引中。那么在这个索引中,你可以为用户数据定义一个类型,为论坛数据定义另一个类型,也可以为评论数据再定义一个类型
      • 类型相当于关系型数据库的表
    • 6.文档(document)
      • 一个文档是一个可被索引的基础信息单元。比如说你可以拥有某一个用户的文档,某一个产品的文档,也可以拥有某个订单的文档,
      • 文档以JSON(javascript Object Notation)表示,而JSON是一个到处存在的互联网数据交互格式
      • 一个文档必须在一个索引内被索引或者分配一个类型
      • 文档相当于关系型数据库的列
    • 7.分片和副本(Shards & Replicas)
      • 在实际情况下,索引存储的数据可能超过单个节点的硬件限制。比如说一个10亿大小的文档需要1TB空间,可能不适合存储在单个节点的磁盘上,或者从单个节点搜索请求太慢了。所以为了解决这个问题,Elasticsearch提供了将索引分成多个分片的功能。当在创建索引时,可以定义想要分片的数量。
      • 每一个分片就是一个全功能的独立的索引,可以位于集群中任何节点上
      • 分片存在的两个最主要原因:①.水平分割扩展,增大存储量。②.分布式并行跨分片操作,提高性能和吞吐量。
      • 分布式分片的机制和搜索请求的文档如何汇总完全是由Elasticsearch控制的,而这些控制对用户而言是透明的
      • 因为网络问题等等其他问题的存在。所以为了提升健壮性,建议要有一个故障切换机制。这样当发生故障时可以防止分片或者节点不可用。为此,Elasticsearch让我们将索引分片复制一份或者多份,称之为多平副本或者副本
      • 副本存在的两个主要原因:①.高可用性,以应对分片或者节点故障。所以分片副本要再不同的节点上。②.高性能,增大吞吐量,搜索可以并行在所有副本上执行
      • 总之,每个索引可以被分片成多个分片。一个索引也可以被复制0次(没有复制的意思)和多次。一旦复制了,每个索引就有了主分片(作为复制源原来的分片)和复制分片(主分片的拷贝)之别。分片和副本的数量可以在索引创建的时候指定。在索引创建之后,可以在任何时候动态地改变副本的数量,但是不能改变分片的数量
      • 默认情况下,Elasticsearch中的每个索引被分片成5个主分片和1个副本。这也意味着集群中国至少要有两个节点,索引将会有5个主分片和另外5个副本分片(1个完全拷贝),这样的话每个索引总共就会有10个分片

1.3.2 Logstash

  • Logstash是由JRuby语言编写,基于消息(message-based)的简单架构,运行在Java虚拟机(JVM)上
  • 不同于分离的代理点(agent)或主机端(Server),Logstash可配置单一的代理端(agent)与其开源软件结合,以实现不同的功能
  • 因为Logstash只做三件事,所以它的概念很简单
    • 1.Collect:数据输入(收集)
    • 2.Enrich:数据加工(例如过滤,改写等等)
    • 3.Transport:数据输出(被其他模块进行调用)
  • Logstash主要组件
    • 1.Shipper:日志收集者。负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来。通常远程代理端(agent)只需要运行这个组件即可
    • 2.Indexer:日志存储者。负责接收日志并写入到本地文件
    • 3.Broker:日志Hub。负责连接多个Shipper和Indexer
    • 4.Search and Storage:允许对事件进行搜索和存储
    • 5.Web Interface:基于Web的展示界面
    • 因为以上组件可以在LogStash中独立部署,所以Logstash才提供了更好的集群扩展性
  • Logstash主机分类
    • 1.代理主机(agent host):作为事件的传递者(shipper)将各种日志数据发送至中心主机。只需要运行Logstash代理程序。
    • 2.中心主机(central host):可运行包括中间转发器(Broker)、索引器(Indexer)、搜索和存储器(Search and Storage)、Web界面端(Web Interface)在内的各个组件。从而实现对日志数据的接收、处理和存储

1.3.3 Kibana

  • Kibana是一个针对 Elasticsearch的开源分析及可视化平台。用来搜索、查看交互存储在Elasticsearch索引中的数据
  • 使用Kibana可以通过各种图表进行高级数据分析及展示。Kibana让海量数据更容易理解
  • Kibana操作简单,基于浏览器的用户界面可以快速创建仪表板(dashboard)实时显示Elasticsearch查询动态
  • 设置Kibana也非常简单。无需编写代码。几分钟即可完成Kibana安装并启动Elasticsearch索引检测
  • Kibana主要功能
    • 1.Kibana架构为Elasticsearch定制,可以将任何结构化和非结构化数据加入Elasticsearch索引。Kibana还充分利用了Elasticsearch强大的搜索和分析功能
    • 2.整合数据。Kibana能够更好地处理海量数据,并以此创建柱形图、折线图、散点图、直方图、饼图和地图
    • 3.复杂数据分析。Kibana提升了Elasticsearch分析能力,能够更加智能地分析数据,执行数学转换并且根据要求来对数据切割分块
    • 4.让更多团队成员收益。强大的数据库可视化接口让各业务岗位都能够从数据集合中收益
    • 5.接口灵活,分享更容易。使用Kibana可以更加方便地创建、保存、分享数据,并将可视化数据快速交流
    • 6.配置简单。Kibana的配置和启用非常简单,用户体验非常友好。Kibana自带Web服务器,可以快速启动运行
    • 7.可视化多数据源。Kibana可以非常方便地把来自Logstash、ES-Hadoop、Beats或第三方技术的数据整合到Elasticsearch。支持的第三方技术包括:Apache Flume、Fluentd等等
    • 8.数据导出简单。Kibana可以方便地导出感兴趣的数据,与其数据集合融合后快速建模分析,发现新结果

二、ELK日志分析系统搭建

  • 配置和安装ELK日志分析系统,安装集群方式,2个Elasticsearch节点,并监控apache服务器日志

2.1 实验环境

主机操作系统主机名IP地址主要软件
服务器CentOS7.4Node1192.168.131.10Elasticsearch和Kibana
服务器CentOS7.4Node2192.168.131.11Elasticsearch
服务器CentOS7.4Apache192.168.131.12Logstash Apache
测试机本机(Win10)take-easy192.168.1.50Google浏览器

2.2 部署Elasticsearch软件(node1和node2都需部署)

  • 配置域名解析并修改java版本
【两台node节点都写入hosts文件。node1和node2的IP和对应主机名】
[root@node1 /]# vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.131.10 node1
192.168.131.10 node2

[root@node1 /]# java -version
openjdk version "1.8.0_131"
OpenJDK Runtime Environment (build 1.8.0_131-b12)
OpenJDK 64-Bit Server VM (build 25.131-b12, mixed mode)
[root@node1 local]# rz -E
rz waiting to receive.
[root@node1 local]# tar zxvf jdk-8u91-linux-x64.tar.gz 
[root@node1 local]# ls
bin  etc  games  include  jdk1.8.0_91  jdk-8u91-linux-x64.tar.gz  lib  lib64  libexec  sbin  share  src                        


[root@node1 local]# vim /etc/profile
export JAVA_HOME=/usr/local/jdk1.8.0_91
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib

【输出重新定义环境变量,$PATH一定要放在$JAVA_HOME的后面,让系统先读取到工作目录中的版本信息】
export PATH=${JAVA_HOME}/bin:$PATH   

  
[root@node1 local]# source /etc/profile
[root@node1 local]# java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
  • 安装elasticsearch-rpm包
[root@localhost opt]# hostnamectl set-hostname node1
[root@localhost opt]# su
[root@node1 opt]# systemctl stop firewalld.service 
[root@node1 opt]# setenforce 0
[root@node1 opt]# systemctl disable firewalld.service 
[root@node1 opt]# rz -E
rz waiting to receive.
[root@node1t opt]# ls
elasticsearch-5.5.0.rpm  rh
[root@node1 opt]# rpm -ivh elasticsearch-5.5.0.rpm 
  • 加载系统服务
[root@node1 opt]# systemctl daemon-reload 
[root@node1 opt]# systemctl enable elasticsearch.service 
Created symlink from /etc/systemd/system/multi-user.target.wants/elasticsearch.service to /usr/lib/systemd/system/elasticsearch.service.
  • 更改elasticsearch主配置文件
【取消以下配置文件的注释,并进行相应修改】
[root@node1 opt]# vim /etc/elasticsearch/elasticsearch.yml 
 17 cluster.name: my-elk-cluster                         【修改集群名字为my-elk-cluster】
 23 node.name: node1                                     【修改节点名字为node1。node2主机则修改成node2】
 33 path.data: /data/elk_data                            【修改数据存放路径】
 37 path.logs: /var/log/elasticsearch/                   【修改日志存放路径】
 43 bootstrap.memory_lock: false 
 【锁定物理内存地址,防止es内存被交换出去,也就是避免es使用swap交换分区。因为频繁的交换会导致IOPS变高(性能测试:每秒的读写次数)】
 55 network.host: 0.0.0.0                                【提供服务绑定的IP地址,0.0.0.0代表所有地址】
 59 http.port: 9200                                      【监听端口为920068 discovery.zen.ping.unicast.hosts: ["node1", "node2"] 【通过单播的方式去发现集群】
 [root@node1 opt]# grep -v "^#" /etc/elasticsearch/elasticsearch.yml    【过滤查看信息】
cluster.name: my-elk-cluster
node.name: node1
path.data: /data/elk_data
path.logs: /var/log/elasticsearch/
bootstrap.memory_lock: false
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["node1", "node2"]
  • 创建数据存放路径并授权
[root@node1 opt]# mkdir -p /data/elk_data
[root@node1 opt]# chown elasticsearch:elasticsearch /data/elk_data/
  • 启动elasticsearch是否成功开启
[root@node1 opt]# systemctl start elasticsearch.service 
[root@node1 opt]# netstat -natp | grep 9200
tcp6       0      0 :::9200                 :::*                    LISTEN      5512/java   
  • 用本机浏览器打开 http://192.168.131.10:9200/和http://192.168.131.11:9200/进行节点信息查看
    在这里插入图片描述
  • 用本机浏览器打开 http://192.168.131.10:9200/_cluster/state?pretty查看群集状态信息
    在这里插入图片描述

2.3 安装elasticsearch-head插件(数据可视化工具)

  • 因为上述查看集群的方式及其不方便,所以我们可以通过安装elasticsearch-head插件来管理集群
  • node1和node2都需安装,且步骤一直。这里仅列出node1操作配置
  • 先要编译安装node组件依赖包(耗时较长)
[root@node1 opt]# yum install -y gcc gcc-c++ make 
[root@node1 opt]# rz -E
rz waiting to receive.
[root@node1 opt]# ls
elasticsearch-5.5.0.rpm  node-v8.2.1.tar.gz  rh
[root@node1 opt]# tar zxvf node-v8.2.1.tar.gz 
[root@node1 opt]# cd node-v8.2.1/
[root@node1 node-v8.2.1]# ./configure 
[root@node1 node-v8.2.1]# make & make install
  • 安装phantomjs(前端架构)
[root@node1 /]# cd /usr/local/src/
[root@node1 src]# ls
phantomjs-2.1.1-linux-x86_64.tar.bz2
[root@node1 src]# tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 
[root@node1 src]# cd phantomjs-2.1.1-linux-x86_64/bin/
[root@node1 bin]# cp phantomjs /usr/local/bin/       【将phantomjs可执行命令复制到路径环境变量中,便于系统识别】
[root@node1 bin]# ls /usr/local/bin/
node  npm  npx  phantomjs
  • 安装elasticsearch-head(数据可视化工具)
[root@node1 bin]# cd /usr/local/src/
[root@node1 src]# rz -E
rz waiting to receive.
[root@node1 src]# ls
elasticsearch-head.tar.gz     phantomjs-2.1.1-linux-x86_64.tar.bz2
phantomjs-2.1.1-linux-x86_64
[root@node1 src]# tar zxvf elasticsearch-head.tar.gz 
[root@node1 src]# cd elasticsearch-head/
[root@node1 elasticsearch-head]# npm install      【此插件基于前端开发,直接使用npm install安装即可】
  • 修改主配置文件
【直接在配置文件的末尾行插入即可】
[root@node1 elasticsearch-head]# vim /etc/elasticsearch/elasticsearch.yml 
 89 http.cors.enabled: true           【开启跨域访问支持,默认为false90 http.cors.allow-origin: "*"       【跨域访问允许的域名地址】
[root@node1 elasticsearch-head]# systemctl restart elasticsearch.

以上是关于ELK日志分析系统的主要内容,如果未能解决你的问题,请参考以下文章

ELK日志分析系统(实例!!!)

ELK日志分析系统

运维必备——ELK日志分析系统

ELK 企业级日志分析系统

ELK企业级日志分析系统

ELK日志分析系统搭建配置