zoukankan      html  css  js  c++  java
  • ELK学习总结(二)

    一、需求背景
    业务发展越来越庞大,服务器越来越多
    各种访问日志、应用日志、错误日志量越来越多,导致运维人员无法很好的去管理日志
    开发人员排查问题,需要到服务器上查日志,不方便
    运营人员需要一些数据,需要我们运维到服务器上分析日志
    二、为什么要用到ELK
    一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大也就是日志量多而复杂的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。大型系统通常都是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。一个完整的集中式日志系统,需要包含以下几个主要特点:

    收集-能够采集多种来源的日志数据
    传输-能够稳定的把日志数据传输到中央系统
    存储-如何存储日志数据
    分析-可以支持 UI 分析
    警告-能够提供错误报告,监控机制
    而ELK则提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用。是目前主流的一种日志系统。

    三、ELK简介
    ELK是三个开源软件的缩写,分别为:Elasticsearch 、 Logstash以及Kibana , 它们都是开源软件。不过现在还新增了一个Beats,它是一个轻量级的日志收集处理工具(Agent),Beats占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具,目前由于原本的ELK Stack成员中加入了 Beats 工具所以已改名为Elastic Stack。

    Elastic Stack包含:

    Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。详细可参考Elasticsearch权威指南
    Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
    Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
    Beats在这里是一个轻量级日志采集器,其实Beats家族有6个成员,早期的ELK架构中使用Logstash收集、解析日志,但是Logstash对内存、cpu、io等资源消耗比较高。相比 Logstash,Beats所占系统的CPU和内存几乎可以忽略不计
    ELK Stack (5.0版本之后)--> Elastic Stack == (ELK Stack + Beats)。目前Beats包含六种工具:

    Packetbeat: 网络数据(收集网络流量数据)
    Metricbeat: 指标 (收集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)
    Filebeat: 日志文件(收集文件数据)
    Winlogbeat: windows事件日志(收集 Windows 事件日志数据)
    Auditbeat:审计数据 (收集审计日志)
    Heartbeat:运行时间监控 (收集系统运行时的数据)
    关于x-pack工具:

    x-pack对Elastic Stack提供了安全、警报、监控、报表、图表于一身的扩展包,是收费的,所以本文不涉及x-pack的安装
    四、ELK架构图


    这是最简单的一种ELK架构方式。优点是搭建简单,易于上手。缺点是Logstash耗资源较大,运行占用CPU和内存高。另外没有消息队列缓存,存在数据丢失隐患。此架构由Logstash分布于各个节点上搜集相关日志、数据,并经过分析、过滤后发送给远端服务器上的Elasticsearch进行存储。Elasticsearch将数据以分片的形式压缩存储并提供多种API供用户查询,操作。用户亦可以更直观的通过配置Kibana Web方便的对日志查询,并根据数据生成报表。

    此种架构引入了消息队列机制,位于各个节点上的Logstash Agent先将数据/日志传递给Kafka(或者Redis),并将队列中消息或数据间接传递给Logstash,Logstash过滤、分析后将数据传递给Elasticsearch存储。最后由Kibana将日志和数据呈现给用户。因为引入了Kafka(或者Redis),所以即使远端Logstash server因故障停止运行,数据将会先被存储下来,从而避免数据丢失。

    此种架构将收集端logstash替换为beats,更灵活,消耗资源更少,扩展性更强。同时可配置Logstash 和Elasticsearch 集群用于支持大集群系统的运维日志数据监控和查询。

    五、Filebeat工作原理
    Filebeat由两个主要组件组成:prospectors 和 harvesters。这两个组件协同工作将文件变动发送到指定的输出中。

    Harvester(收割机):负责读取单个文件内容。每个文件会启动一个Harvester,每个Harvester会逐行读取各个文件,并将文件内容发送到制定输出中。Harvester负责打开和关闭文件,意味在Harvester运行的时候,文件描述符处于打开状态,如果文件在收集中被重命名或者被删除,Filebeat会继续读取此文件。所以在Harvester关闭之前,磁盘不会被释放。默认情况filebeat会保持文件打开的状态,直到达到close_inactive(如果此选项开启,filebeat会在指定时间内将不再更新的文件句柄关闭,时间从harvester读取最后一行的时间开始计时。若文件句柄被关闭后,文件发生变化,则会启动一个新的harvester。关闭文件句柄的时间不取决于文件的修改时间,若此参数配置不当,则可能发生日志不实时的情况,由scan_frequency参数决定,默认10s。Harvester使用内部时间戳来记录文件最后被收集的时间。例如:设置5m,则在Harvester读取文件的最后一行之后,开始倒计时5分钟,若5分钟内文件无变化,则关闭文件句柄。默认5m)。

    Prospector(勘测者):负责管理Harvester并找到所有读取源。

    filebeat.prospectors:
    - input_type: log
      paths:
        - /apps/logs/*/info.log
    Prospector会找到/apps/logs/*目录下的所有info.log文件,并为每个文件启动一个Harvester。Prospector会检查每个文件,看Harvester是否已经启动,是否需要启动,或者文件是否可以忽略。若Harvester关闭,只有在文件大小发生变化的时候Prospector才会执行检查。只能检测本地的文件。

    Filebeat如何记录文件状态:

    将文件状态记录在文件中(默认在/var/lib/filebeat/registry)。此状态可以记住Harvester收集文件的偏移量。若连接不上输出设备,如ES等,filebeat会记录发送前的最后一行,并再可以连接的时候继续发送。Filebeat在运行的时候,Prospector状态会被记录在内存中。Filebeat重启的时候,利用registry记录的状态来进行重建,用来还原到重启之前的状态。每个Prospector会为每个找到的文件记录一个状态,对于每个文件,Filebeat存储唯一标识符以检测文件是否先前被收集。

    Filebeat如何保证事件至少被输出一次:

    Filebeat之所以能保证事件至少被传递到配置的输出一次,没有数据丢失,是因为filebeat将每个事件的传递状态保存在文件中。在未得到输出方确认时,filebeat会尝试一直发送,直到得到回应。若filebeat在传输过程中被关闭,则不会再关闭之前确认所有时事件。任何在filebeat关闭之前为确认的时间,都会在filebeat重启之后重新发送。这可确保至少发送一次,但有可能会重复。可通过设置shutdown_timeout参数来设置关闭之前的等待事件回应的时间(默认禁用)。

    六、Logstash工作原理
    Logstash事件处理有三个阶段:inputs → filters → outputs。是一个接收,处理,转发日志的工具。支持系统日志,webserver日志,错误日志,应用日志,总之包括所有可以抛出来的日志类型。

    Input:输入数据到logstash。

    一些常用的输入为:
    file:从文件系统的文件中读取,类似于tail -f命令

    syslog:在514端口上监听系统日志消息,并根据RFC3164标准进行解析

    redis:从redis service中读取

    beats:从filebeat中读取

    Filters:数据中间处理,对数据进行操作。

    一些常用的过滤器为:
    grok:解析任意文本数据,Grok 是 Logstash 最重要的插件。它的主要作用就是将文本格式的字符串,转换成为具体的结构化的数据,配合正则表达式使用。内置120多个解析语法。官方提供的grok表达式:https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns,grok在线调试:https://grokdebug.herokuapp.com/。此外kibana上也提供了grok调试器。

    mutate:对字段进行转换。例如对字段进行删除、替换、修改、重命名等。

    drop:丢弃一部分events不进行处理。

    clone:拷贝 event,这个过程中也可以添加或移除字段。

    geoip:添加地理信息(为前台kibana图形化展示使用)

    Outputs:outputs是logstash处理管道的最末端组件。

    一个event可以在处理过程中经过多重输出,但是一旦所有的outputs都执行结束,这个event也就完成生命周期。

    一些常见的outputs为:

    elasticsearch:可以高效的保存数据,并且能够方便和简单的进行查询。

    file:将event数据保存到文件中。

    graphite:将event数据发送到图形化组件中,一个很流行的开源存储图形化展示的组件。

    Codecs:codecs 是基于数据流的过滤器,它可以作为input,output的一部分配置。

    Codecs可以帮助你轻松的分割发送过来已经被序列化的数据。

    一些常见的codecs:

    json:使用json格式对数据进行编码/解码。

    multiline:将汇多个事件中数据汇总为一个单一的行。比如:java异常信息和堆栈信息。

    Logstash举例:

    日志格式

    2019-07-04 14:07:19.916  INFO 7 --- [o-9090-exec-843]o.a.imocker.controller.ApiController: [ApiMockRequest]api:/brScorecashon/nlfc/jsonTonlfcService.do, method:POST
    自定义pattern

    LOG_TIMESTAMP 20%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{HOUR}:?%{MINUTE}(?::?%{SECOND})
    LOG_LEVEL ERROR|DEBUG| INFO| WARN
    LOG_THREAD [.*?]
    LOG_MSG_SPLIT [s]*:
    LOG_MSG [sS]*
    logstash.conf

    input {
      beats {
        port => 5044
        client_inactivity_timeout => 36000
      }
    }

    filter {
      grok {
        patterns_dir => "/usr/share/logstash/config/patterns"
        match => {"message" => "%{LOG_TIMESTAMP:log_date} %{LOG_LEVEL:log_level} %{INT:pid} --- %{LOG_THREAD:log_thread} %{JAVACLASS:java_class} %{LOG_MSG_SPLIT} %{LOG_MSG:log_msg}"}
      }
      date {
        match => ["log_date", "yyyy-MM-dd HH:mm:ss.SSS"]
        target => "@timestamp"
        timezone => "+08:00"
      }
      mutate {
        strip => ["log_level"]
        rename => {"[host][name]" => "host"}
      }
    }

    output {
      elasticsearch {
        hosts => ["http://192.168.66.41:9201","http://192.168.66.41:9202","http://192.168.66.41:9203"]
        index => "imocker-%{+YYYY.MM.dd}"
      }
      stdout {
        codec => rubydebug
      }
    }
    七、Kibana
    Kibana是一个开源的分析和可视化平台,设计用于和Elasticsearch一起工作。你可以用Kibana来搜索,查看,并和存储在Elasticsearch索引中的数据进行交互。你可以轻松地执行高级数据分析,并且以各种图标、表格和地图的形式可视化数据。Kibana使得理解大量数据变得很容易。它简单的、基于浏览器的界面使你能够快速创建和共享动态仪表板,实时显示Elasticsearch查询的变化。Kibana是一个Web应用程序,你可以通过5601来访问它。例如: http://192.168.66.41:5601。我们在正式使用Kibana之前,需要先匹配我们Elasticsearch中的索引库,因为我们的Elasticsearch有可能会有很多索引库,Kibana为了性能因素,是不会事先把所有的索引库都导进来的,我们需要用那个索引就导哪个索引。按照如下步骤操作:Management >> Index Patterns >> Create Index Patterns 然后我们可以看到如下界面:

    在index pattern输入框中输入索引库,可以使用模糊查询的方式匹配,比如我们准备导入imocker日志数据,输入“imocker-*”,当匹配成功后,输入框下方会出现一个成功的提示,并且右边会出来一个Next step按钮,点击该按钮进入下一步操作,然后点击Create index pattern 完成匹配:

    然后Kibana需要我们选择一个时间字段,因为什么这3个索引是按照时间关联的,我们选择的时间字段是@timestamp。
    那现在我们已经把这3个类型的测试数据匹配到Kibana中了,接下来就可以使用Kibana了。

    Discover

    你可以从Discover页面交互式的探索你的数据。你可以访问与所选择的索引默认匹配的每个索引中的每个文档。你可以提交查询请求,过滤搜索结构,并查看文档数据。你也可以看到匹配查询请求的文档数量,以及字段值统计信息。如果你选择的索引模式配置了time字段,则文档随时间的分布将显示在页面顶部的直方图中。

    Script Fields

    TODO

    监控报警

    kaae, sentinl, elastalert


    ————————————————
    版权声明:本文为CSDN博主「一杯甜酒」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/u012562943/article/details/101060053

  • 相关阅读:
    Ubuntu系统中安装Macaca过程记录
    Nightwatch——自动化测试(端对端e2e)
    junit 5 官方用户手册
    junit 5 与 testNG 使用对比
    认知体系——从“知道自己不知道”到“知道自己知道”的进化
    测试入门教程
    web UI 自动化变革龙测问世
    [黑苹果硬件] 实用黑苹果配置推荐
    windows使用vbs打开谷歌浏览器登录网页
    Note++ 的快捷
  • 原文地址:https://www.cnblogs.com/cmbk/p/11864250.html
Copyright © 2011-2022 走看看