• ELK日志分析系统


    ELK日志分析系统

    什么是ELK?

    ELK是elastic分公司研发的一套完整的日志收集、分析和展示的企业级解决方案,由三个开源的工具 组合实现,E是ElasticSearch,L是Logstash,K是Kibana。

    什么是ElasticSearch?

    Elasticsearch 是一个分布式的免费开源搜索和分析引擎,适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型的数据。Elasticsearch 在 Apache Lucene 的基础上开发而成,Elasticsearch 以其简单的 REST 风格 API、分布式特性、速度和可扩展性而闻名。

    Elasticsearch 的用途是什么?

    ELasticsearch在速度和可扩展性方面都表现出色,而且还能够索引多种类型的内容,其适用于多种用例:

    • 应用程序搜索
    • 网站搜索
    • 企业搜索
    • 日志处理和分析
    • 基础设施指标和容器监测
    • 应用程序性能监测
    • 地理空间数据分析和可视化
    • 安全分析
    • 业务分析

    什么是Logstash

    logstash是一个开源数据收集引擎,具有实时管道功能。logstash可以动态地将来来自不同数据源的数据统一起来,并将数据标准化到你所以选择的目的地(存储库)。

    Logstash 的作用是什么?

    Logstash 是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到指定位置。

    • 输入:采集各种样式、大小和来源的数据
    • 筛选:实时解析和转换数据
    • 输出:根据配置,将分析整理后的数据传输到指定的存储库。

    什么是Kibana?

    Kibana 是一款免费开源的前端应用程序,可以为 Elasticsearch 中索引的数据提供搜索和数据可视化功能。

    kibana作用是什么?

    Kibana 与 Elasticsearch 和更广意义上的 Elastic Stack 紧密集成,这一点使其成为支持下列场景的理想之选:

    1. 搜索、查看并可视化 Elasticsearch 中所索引的数据,并通过创建柱状图、饼状图、表格、直方图和地图对数据进行分析。仪表板视图能将这些可视化元素集中到一起,然后通过浏览器加以分享,以提供有关海量数据的实时分析视图,为下列用例提供支持:
      1. 日志处理和分析
      2. 基础设施指标和容器监测
      3. 应用程序性能监测 (APM)
      4. 地理空间数据分析和可视化
      5. 安全分析
      6. 业务分析
    2. 借助网络界面来监测和管理 Elastic Stack 实例并确保实例的安全。

    一、ELK日志分析系统介绍

    1、日志服务器

    将服务日志集中到指定设备上,这一类设备叫做日志服务器。

    • 优点:
      • 提高安全性
      • 集中化管理
    • 缺点
      • 对日志分析困难
    2、ELK日志分析系统的日志处理步骤
    • 将日志进行集中化管理
    • 将日志格式化(Logstash)并输出到Elasticsearch
    • 对格式化后的数据进行索引和存储(Elasticsearch)
    • 前端数据的展示(Kibana)
    3、Elasticsearch概述
    3.1 Elasticsearch特性

    接近实时(NRT)

    指索引会和数据处理的能力

    即从索引一个文档直到这个文档能够被搜索到仅有一个轻微的延迟(一般是1s)。

    集群(cluster)

    一个内部组件ES的架构(特性:ES具有集群机制,节点通过集群名称加入到集群时,同时在集群中的节点会有一个自己的唯一身份标识)

    一个集群就是由一个或多个节点组织在一起,它们共同持有你的整个的数据,并一起提供索引和搜索功能。

    其中一个节点为主节点,其可通过选举产生,并提供跨节点的联合索引和搜索的功能

    集群由一个唯一性的标识的名字,默认为Elasticsearch,集群的名字很重要!每个节点都是基于集群的名字加入到集群中的。因此,确保在不同环境中使用不同的集群名字。

    节点

    节点就是一台单一的服务器,是集群的一部分,存储数据并参与集群的索引和搜索功能。像集群一样,节点也是通过名字来标识的,默认是在节点启动时随机分配的字符名。

    节点名字也很重要,用于在集群中识别服务器对应的节点。

    节点可以通过指定集群名字加入集群中,默认情况下,每个系欸但被设置为加入到Elasticsearch集群。

    如果启动了多个节点,假设能自动发现对方,那么他们将会自动组件一个名为 Elasticsearch 的集群。

    索引

    索引(库)→索引类型(表)→索引的具体文档(记录)

    索引根据以上这个方式来进行数据定位。

    一个索引就是一个拥有几分相似特征的文档的集合

    一个索引由一个名字来变标识,每当我们需要对这个索引中的文档进行索引、搜索、更新和删除的时候,都需要使用到这个名字。

    相当于关系数据库中的库

    类型

    在一个索引中,你可以定义一种或多种类型

    一个类型是你的索引的一个逻辑上的分类/分区,其语义由你自定义

    类比与关系数据中的表

    文档

    一个文档是一个可被索引的基础信息单元

    类比关系数据库中的列

    分片

    在实际情况下,索引存储的数据可能超过单个节点的硬件限制,如一个巨大的文档需要存放,可能并不需要存放在单个节点的磁盘上,或者这样子从单个节点上搜索请求速度会非常慢。为了解决这个问题,Elasticsearch 提供将索引分层多个分片的功能

    当创建索引时,可以定义想要分片的数量,每个分片就是一个全功能的独立的索引,可以位于集群中任何节点上

    分片的两个最主要特点就是:

    水平分割扩展,增大存储量

    能够分布式并行跨分片操作,提供性能和吞吐量

    分布式分片的机制和搜索请求的文档如何汇总是由ES进行控制的,且对用户完全透明

    副本

    网络问题等很多方面的风险可能会接踵而来,为了健壮性,强烈建议要有一个故障切换机制,无论何种遇到何种故障,都能防止分片或节点不可用(单点故障)

    ES将索引分片复制一份或多份,称之为分片副本和副本

    核心是为容灾,不过也可以处理任务

    副本也有两个重要的特点:

    高可用性,以应对分片或节点故障,故此,分片副本要在不同的节点上

    高性能,增加吞吐量,搜索可以在所有的副本上执行

    总结

    每个索引可以被分成多个分片,且一个索引也可以被复制0次(即没有复制)或多次

    一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别

    分片和副本的数量可以在索引创建的时候指定,在索引创建之后,你可以在任何时候动态地改变副本的数量,但是你事后不能改变分片的数量

    默认情况下,ES 中的每个索引被分片5个主分片和每个主分片的1个副本,这意味着,如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个副本分片,这样的话每个索引总共就有10个分片

    4、Logstash概述
    • logstash作用:
      • 集中、转换和存储你的数据,是一个开源的服务器端数据处理管道,可以同时从多个数据源获取数据,并对其进行转换,然后将其发送到你最喜欢的“存储
    • logstash的架构
    • logstash的基本流程架构:input | filter | output 如需对数据进行额外处理,filter可省略。

    img

    Input(输入):采集各种样式,大小和相关来源数据,从各个服务器中收集数据。

    数据往往以各种各样的形式,或分散或集中地存在于很多系统中。Logstash 支持各种输入选择 ,可以在同一时间从众多常用来源捕捉事件。能够以连续的流式传输方式,轻松地从您的日志、指标、Web 应用、数据存储以及各种 AWS 服务采集数据。

    image-20220829165513611

    Filter(过滤器)

    用于在将event通过output发出之前对其实现某些处理功能。grok。
    grok:用于分析结构化文本数据。目前 是logstash中将非结构化数据日志数据转化为结构化的可查询数据

    image-20220829165755184

    Output(输出):将我们过滤出的数据保存到那些数据库和相关存储中

    image-20220829165806545

    总结

    inpust:必须,负责产生事件(Inputs generate events),常用:File、syslog、redis、beats(如:Filebeats)
    filters:可选,负责数据处理与转换(filters modify them),常用:grok、mutate、drop、clone、geoip
    outpus:必须,负责数据输出(outputs ship them elsewhere),常用:elasticsearch、file、graphite、statsd

    5、Kibana 介绍

    概述

    一个针对 Elasticsearch 的分析及提供友好、可视化的 Web 平台,开源免费!

    用于搜索、查看存储在 Elasticsearch 索引中的数据

    可以通过各种图表进行高级数据分析及展示,让海量数据更容易被理解

    它操作简单,基于浏览器的用户界面,可以快速创建仪表板(Dashboard)实时显示 ES 查询动态
    设置非常简单

    主要功能

    与 Elasticsearch 无缝之集成:ELK 初始是由 ES 收购了另外两家个技术(Logstash+Kibana),把其糅合在一起进行开发整合,形成了一个完整的技术

    整合数据,复杂数据分析:能够很好的处理海量数据,节省我们分析日志数据的时间,降低其复杂度

    让更多团队成员受益:有了这么一个公共的展示界面,只要有权限就都能进去查看,强大的数据可视化接口让各岗各业都能够从数据集合中收益

    接口灵活,分享更容易: API 可以很方便的被调用,并将可视化数据快速交流,方便查看

    配置简单,可视化多数据源:配合和启动非常简单,用户体验良好,可以对不止一种数据或日志类型进行展示,并且是精细化展示

    简单数据导出:可以很方便的导出感兴趣的数据,与其他数据集合并融合后快速建模分析,从而发现新结果

    二、部署ELK服务

    主机IP地址部署的主要服务
    apache192.168.10.11Logstash,apache-http
    node1192.168.10.12Elasticsearch、Kibana
    node2192.168.10.13Elasticsearch

    1、配置Elasticsearch环境

    systemctl stop firewalld
    systemctl disable firewalld
    setenforce 0
    #万恶之源,先关防火墙及安全机制
    
    hostnamectl set-hostname node1
    su -
    
    vim /etc/hosts
    192.168.10.12   node1
    192.168.10.13   node2
    #尾部添加
    
    java -version
    
    --JDK--
    cd /opt
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    image-20220829171946929

    image-20220829172001473

    2、安装ES

    //下载ES包
    //Elasticsearch包下载地址
    'https://www.elastic.co/cn/downloads/past-releases/elasticsearch-5-5-0'
    cd /opt
    //将软件包传至该目录下
    rpm -ivh elasticsearch-5.5.0.rpm 
    //加载系统服务
    systemctl daemon-reload
    systemctl enable elasticsearch.service
    
    //更改 ES 主要配置文件
    cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
    //备份
    
    vim /etc/elasticsearch/elasticsearch.yml
    //17行	cluster.name: my-elk-cluster							#集群名字
    //23行	node.name: node1										#节点名字
    //33行	path.data: /data/elk_data								#数据存放路径
    //37行	path.logs: /var/log/elasticsearch/						#日志存放路径
    //43行	bootstrap.memory_lock: false							#不在启动的时候锁定内存(前端缓存,与IOPS-性能测试方式,每秒读写次数相关)
    //55行	network.host: 0.0.0.0									#提供服务绑定的IP地址,0.0.0.0代表所有地址
    //59行	http.port: 9200											#侦听端口为9200
    //68行	discovery.zen.ping.unicast.hosts: ["node1", "node2"]	#集群发现通过单播实现
    
    
    grep -v "^#" /etc/elasticsearch/elasticsearch.yml
    //检查配置
    
    scp elasticsearch.yml root@192.168.10.13:/etc/elasticsearch/elasticsearch.yml
    //将配置好的文件用SCP传至node2,后续只用去改个节点名字即可
        
    //创建数据存放路径并授权
    mkdir -p /data/elk_data
    chown elasticsearch:elasticsearch /data/elk_data/
    
    //查看启动 ES 是否成功开启
    systemctl start elasticsearch.service
    netstat -antp | grep 9200
    //这里可能出现一次性检测不出来端口号的情况,多restart重启几次服务即可
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    image-20220829172157747

    image-20220829173223130

    image-20220829173342008

    image-20220829173514126

    node2与node1配置一样

    image-20220829173624849

    image-20220829173704933

    image-20220829173943733

    3、检查集群的健康和状态

    //检查群集健康情况
    //用宿主机浏览网页,打开 
        http://192.168.10.12:9200/_cluster/health?pretty
    	http://192.168.10.13:9200/_cluster/health?pretty
    
    • 1
    • 2
    • 3
    • 4

    image-20220829174227514

    //检查群集状态信息
    //用宿主机浏览网页,打开 
        http://192.168.10.12:9200/_cluster/state?pretty
    	http://192.168.10.13:9200/_cluster/state?pretty
    
    • 1
    • 2
    • 3
    • 4

    image-20220829174353022

    4、 安装 elasticsearch-head 插件

    上述查看集群的方式是不是有点不方便?

    我们可以通过安装 elasticsearch-head 插件来解决这个问题

    //编译安装 node 组件依赖包
    cd /opt
    //将软件包传至本目录下
    yum install -y gcc gcc-c++ make
    
    tar zxvf node-v8.2.1.tar.gz
    cd node-v8.2.1/
    ./configure 
    make -j 4 && make install
    //过程耗时较长!!建议同时编译安装node2,然后再去配置Apache
    
    //安装 phantomjs(前端框架)
    cd /usr/local/src/
    #将软件包传至本目录下
    tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2
    cd phantomjs-2.1.1-linux-x86_64/bin
    cp phantomjs /usr/local/bin
    //安装 elasticsearch-head(数据可视化工具)
    cd /usr/local/src/
    //将软件包传至本目录下
    tar zxvf elasticsearch-head.tar.gz
    
    cd elasticsearch-head/
    npm install
    
    //修改主配置文件
    
    cd ~
    vim /etc/elasticsearch/elasticsearch.yml
    //在尾部添加配置
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    //注释
    //1.开启跨域访问支持,默认为false
    //2.跨域访问允许的域名地址
    
    systemctl restart elasticsearch
    
    //启动 elasticsearch-head
    cd /usr/local/src/elasticsearch-head/
    npm run start &
    //切换到后台运行
    
    netstat -lnupt |grep 9100
    netstat -lnupt |grep 9200
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    image-20220829183032133

    image-20220829183046222

    1.在宿主机上打开浏览器,访问 http://192.168.10.12:9100/
    2.然后在 Elasticsearch 后面的栏目中摄入 http://192.168.10.12:9200,点击连接,查看群集颜色是否是健康的绿色
    3.访问 http://192.168.10.13:9100/,同上操作
    
    
    • 1
    • 2
    • 3
    • 4

    image-20220829183310529

    image-20220829183358356

    curl -XPUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"xcf","mesg":"hello world"}'
    #索引为index-demo,类型为test,可以看到成功创建
    
    
    • 1
    • 2
    • 3

    image-20220829183541290

    image-20220829184258002

    image-20220829184402735

    配apache服务器
    //安装httpd
    yum -y install httpd
    systemctl start httpd
    //安装java环境
    yum -y install java
    java –version
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    image-20220829180816784

    image-20220829180830280

    //安装logstash
    cd /opt
    rpm -ivh logstash-5.5.1.rpm
    systemctl start logstash.service
    systemctl enable logstash.service
    ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    image-20220829181016846

    测试 Logstash
    Logstash 命令常用选项

    -f:通过这个选项可以指定 Logstash 的配置文件,根据配置文件配置 Logstash 的输入和输出流。
    
    -e:从命令行中获取,输入、输出后面跟着字符串,该字符串可以被当作 Logstash 的配置(如果是空,则默认使用 stdin 作为输入,stdout 作为输出)。
    
    -t:测试配置文件是否正确,然后退出。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    定义输入输出流

    输入采用标准输入,输出采用标准输出(类似管道)
    指定数据输入端口,默认为9600~9700
    logstash -e ‘input { stdin{} } output { stdout{} }
    • 1
    • 2
    • 3

    image-20220829181438463

    //使用 rubydebug 显示详细输出,codec 为一种编解码器
    logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.10.12:9100"] } }'
    ...
    ...
    www.baidu.com		#输入内容
    www.google.com.cn	#输入内容
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    image-20220829184753688

    使用宿主机浏览 http://192.168.10.12:9100/ ,查看索引信息
    
    • 1

    image-20220829184903582

    image-20220829184933237

    image-20220829184956227

    配置kibana
    //logstasgh 配置文件
    #Logstash配置文件主要由三部分组成:input、output、filter(根据需要)
    
    chmod o+r /var/log/messages
    ll /var/log/messages
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    image-20220829185137015

    //配置文件中定义的是收集系统日志(system)
    vim /etc/logstash/conf.d/system.conf
    input {
    		file{
            path => "/var/log/messages"
            type => "system"
            start_position => "beginning"
    			}
    		}
    
    output {
            elasticsearch {
              hosts => ["192.168.10.12:9200"]
              index => "system-%{+YYYY.MM.dd}"
    					  }
           }
    
    systemctl restart logstash.service
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    image-20220829190037508

    //在 node1 主机安装 Kibana
    cd /usr/local/src/
    #将软件包传至本目录下
    rpm -ivh kibana-5.5.1-x86_64.rpm
    
    cd /etc/kibana/
    cp kibana.yml kibana.yml.bak
    
    vim kibana.yml
    //2行	server.port: 5601                					#kibana打开的端口
    //7行	server.host: "0.0.0.0"           					#kibana侦听的地址
    //21行	elasticsearch.url: "http://192.168.10.12:9200"		#和elasticsearch建立联系
    //30行	kibana.index: ".kibana"								#在elasticsearch中添加.kibana索引
    
    grep -v "#" /etc/kibana/kibana.yml | grep -v "^$"
        
    systemctl start kibana.service
    systemctl enable kibana.service
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    image-20220829190541356

    宿主机浏览 192.168.10.12:5601
    1.首次登录创建一个索引 名字:system-*  ##这是对接系统日志文件
    Index name or pattern   
    #下面输入ystem-*
    
    2.然后点最下面的出面的create 按钮创建
    
    3.然后点最左上角的Discover按钮,会发现system-*信息
    
    4.然后点下面的host旁边的add,会发现右面的图只有Time和host选项了,个比较友好
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    image-20220829191046810

    image-20220829191129399

    image-20220829191332558

    配置拉取httpd的日志

    vim /etc/logstash/conf.d/httpd_log.conf
    
    input {
           file{
            path => "/etc/httpd/logs/access_log"
            type => "access"
            start_position => "beginning"
            }
           file{
            path => "/etc/httpd/logs/error_log"
            type => "error"
            start_position => "beginning"
            }
            
          }
    output {
            if [type] == "access" {
            elasticsearch {
              hosts => ["192.168.10.12:9200"]
              index => "apache_access-%{+YYYY.MM.dd}"
              }
            }
            if [type] == "error" {
            elasticsearch {
              hosts => ["192.168.10.12:9200"]
              index => "apache_error-%{+YYYY.MM.dd}"
              }
            }
            }
    
    
    /usr/share/logstash/bin/logstash -f apache_log.conf
    
    
    -----
    1.宿主机浏览器,输入http://192.168.10.11,访问apache
    
    2.输入http://192.168.10.12:9100/,查看索引信息
    
    3.输入http://192.168.10.12:5601
    点击左下角有个management选项
    index  patterns
    create index pattern
    分别创建"apache_error-*""apache_access-*"的索引
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    image-20220829192155993

    image-20220829192706551

    => “apache_access-%{+YYYY.MM.dd}”
    }
    }
    if [type] == “error” {
    elasticsearch {
    hosts => [“192.168.10.12:9200”]
    index => “apache_error-%{+YYYY.MM.dd}”
    }
    }
    }

    /usr/share/logstash/bin/logstash -f apache_log.conf


    1.宿主机浏览器,输入http://192.168.10.11,访问apache

    2.输入http://192.168.10.12:9100/,查看索引信息

    3.输入http://192.168.10.12:5601
    点击左下角有个management选项
    index patterns
    create index pattern
    分别创建"apache_error-"和"apache_access-"的索引

    
    [外链图片转存中...(img-52LFxJHi-1663501276090)]
    
    [外链图片转存中...(img-G8txCxsV-1663501276090)]
    
    ![image-20220829192740165](https://img-blog.csdnimg.cn/img_convert/4d3aaf5ec198bab553b51a2fa1c80bc3.png)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    爬虫常用笔记总结
    ESP8266-Arduino编程实例-HDC1080温度湿度传感器驱动
    java简单实现AIDL进程通信
    面向Java开发者的ChatGPT提示词工程(9)
    VC++中 ADO操作
    一个命令就可启用的微信机器人WhoChat
    锐捷交换机系统安装与升级
    Android Kotlin 高阶详解
    Python数据分析与机器学习29-支持向量机(SVM)
    深入了解CAS(Compare and Swap):Java并发编程的核心
  • 原文地址:https://blog.csdn.net/weixin_46514551/article/details/126921992