ELK 企业级日志分析系统

284 阅读12分钟

ELK 概述

日志服务器

  • 提高安全性
  • 集中存放日志
  • 缺陷
    • 对日志的分析困难

image.png

收集日志的选择

  • 中小规模的集群:脚本、rsyslog
  • 大规模集群:ELK

ELK 简介

ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。

ELK各组件

ElasticSearch

  • 是基于Lucene(一个全文检索引擎的架构)开发的分布式存储检索引擎,用来存储各类日志。
  • Elasticsearch 是用 Java 开发的,可通过 RESTful Web 接口,让用户可以通过浏览器与Elasticsearch 通信。
  • Elasticsearch是一个实时的、分布式的可扩展的搜索引擎,允许进行全文、结构化搜索,它通常用于索引和搜索大容量的日志数据,也可用于搜索许多不同类型的文档。

Logstash

  • 作为数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置,一般会发送给 Elasticsearch。
  • Logstash 由 Ruby 语言编写,运行在 Java 虚拟机(JVM)上,是一款强大的数据处理工具, 可以实现数据传输、格式处理、格式化输出。Logstash 具有强大的插件功能,常用于日志处理。

过滤模块是logstash的核心功能

Kiabana

  • Kibana 通常与 Elasticsearch 一起部署,Kibana 是 Elasticsearch 的一个功能强大的数据可视化 Dashboard,Kibana 提供图形化的 web 界面来浏览 Elasticsearch 日志数据,可以用来汇总、分析和搜索重要数据。

日志处理步骤

  1. 将日志进行集中化管理
  2. 将日志格式化(Logstash)并输出到Elasticsearch
  3. 对格式化后的数据进行索引和存储(Elasticsearch)
  4. 前端数据的展示(Kibana)

可添加的其它组件

Filebeat

  • 轻量级的开源日志文件数据搜集器。通常在需要采集数据的客户端安装 Filebeat,并指定目录与日志格式,Filebeat 就能快速收集数据,并发送给 logstash 进行解析,或是直接发给 Elasticsearch 存储,性能上相比运行于 JVM 上的 logstash 优势明显,是对它的替代。常应用于 EFLK 架构当中。(如果要使用过滤功能的话,Filebeat不能完全替代logstash,Filebeat没有过滤功能,收集数据后需要发送给 logstash 进行处理)

filebeat 结合 logstash 带来好处:

  1. 通过 Logstash 具有基于磁盘的自适应缓冲系统,该系统将吸收传入的吞吐量,从而减轻 Elasticsearch 持续写入数据的压力。
  2. 从其他数据源(例如数据库,S3对象存储或消息传递队列)中提取。
  3. 将数据发送到多个目的地,例如S3,HDFS(Hadoop分布式文件系统)或写入文件。
  4. 使用条件数据流逻辑组成更复杂的处理管道。

缓存/消息队列(redis、kafka、RabbitMQ等)

  • 可以对高并发日志数据进行流量削峰和缓冲,这样的缓冲可以一定程度的保护数据不丢失,还可以对整个架构进行应用解耦。

Fluentd

  • 是一个流行的开源数据收集器。由于 logstash 太重量级的缺点,Logstash 性能低、资源消耗比较多等问题,随后就有 Fluentd 的出现。相比较 logstash,Fluentd 更易用、资源消耗更少、性能更高,在数据处理上更高效可靠,受到企业欢迎,成为 logstash 的一种替代方案,常应用于 EFK 架构当中。在 Kubernetes 集群中也常使用 EFK 作为日志数据收集的方案。
  • 在 Kubernetes 集群中一般是通过 DaemonSet 来运行 Fluentd,以便它在每个 Kubernetes 工作节点上都可以运行一个 Pod。 它通过获取容器日志文件、过滤和转换日志数据,然后将数据传递到 Elasticsearch 集群,在该集群中对其进行索引和存储。

为什么要使用 ELK

日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。

往往单台机器的日志我们使用grep、awk等工具就能基本实现简单分析,但是当日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用 grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。

一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。

image.png

完整日志系统基本特征

  • 收集:  能够采集多种来源的日志数据。
  • 传输:  能够稳定的把日志数据解析过滤并传输到存储系统。
  • 存储:  存储日志数据。
  • 分析:  支持 UI 分析。
  • 警告:  能够提供错误报告,监控机制。

ELK 的工作原理

  1. 在所有需要收集日志的服务器上部署Logstash;或者先将日志进行集中化管理在日志服务器上,在日志服务器上部署 Logstash。
  2. Logstash 收集日志,将日志格式化并输出到 Elasticsearch 群集中。
  3. Elasticsearch 对格式化后的数据进行索引和存储。
  4. Kibana 从 ES 群集中查询数据生成图表,并进行前端数据的展示。

总结:logstash作为日志搜集器,从数据源采集数据,并对数据进行过滤,格式化处理,然后交由Elasticsearch存储,kibana对日志进行可视化处理。

image.png

ELK集群部署操作

image.png

准备工作

  • node01节点:192.168.44.20(ES,2核4G)
  • node02节点:192.168.44.30(ES,2核4G)
  • Apache节点:192.168.44.40(Logstash、Kibana、Apache,2核4G)

修改主机名 image.png image.png image.png

上传软件压缩包 image.png image.png image.png

ELK Elasticsearch 集群部署(在Node1、Node2节点上操作)

配置jdk

设置JAVA环境,如果没有安装,yum -y install java image.png

部署 Elasticsearch 软件

  1. node1部署 Elasticsearch 软件
    • 安装elasticsearch—rpm包,备份配置文件 image.png image.png

    • 在/etc/hosts文件中添加映射关系 image.png

    • 修改 Elasticsearch主配置文件( : 后面要有空格,不然会报错)

      • 三类节点说明
        • master 主节点:elasticsearch.yml中
          node.master: true
          node.data: false
          • 主要功能:维护元数据,管理集群节点状态;不负责数据写入和查询。
          • 配置要点:内存可以相对小一些,但是机器一定要稳定,最好是独占的机器。
        • data 数据节点:elasticsearch.yml中
          node.master: false
          node.data: true
          • 主要功能:负责数据的写入与查询,压力大。
          • 配置要点:大内存,最好是独占的机器。
        • client 客户端节点:elasticsearch.yml中
          node.master: false
          node.data: false
          • 主要功能:负责任务分发和结果汇聚,分担数据节点压力。
          • 配置要点:大内存,最好是独占的机器
        • mixed 混合节点(不建议):elasticsearch.yml中
          node.master: true
          node.data: true
          • 主要功能:综合上述三个节点的功能。
          • 配置要点:大内存,最好是独占的机器。
      • 配置比例举例
节点类型机器数量内存大小其他
master316GB机器必须稳定
data12(客户端节点3至4倍)31GB
client5(可以不设置客户端节点,但是查多可以设置以分担数据节点压力)31GB

image.png image.png image.png image.png

  1. node2节点部署 Elasticsearch 软件 image.png image.png image.png

  2. node1和node2节点进行 es 性能调优参数

    • 修改/etc/security/limits.conf image.png

    • 修改文件描述符默认值/etc/systemd/system.conf image.png

    • 需reboot重启生效或者su生效 image.png

  3. 优化elasticsearch用户拥有的内存权限/etc/sysctl.conf

    • 由于ES构建基于lucene, 而lucene设计强大之处在于lucene能够很好的利用操作系统内存来缓存索引数据,以提供快速的查询性能。
    • lucene的索引文件segements是存储在单文件中的,并且不可变,对于OS来说,能够很友好地将索引文件保持在cache中,以便快速访问;
    • 因此,我们很有必要将一半的物理内存留给lucene ; 另一半的物理内存留给ES(JVM heap )。所以, 在ES内存设置方面,可以遵循以下原则:
      1. 当机器内存小于64G时,遵循通用的原则,50%给ES,50%留给操作系统,供lucene使用
      2. 当机器内存大于64G时,遵循原则:建议分配给ES分配 4~32G 的内存即可,其它内存留给操作系统,供lucene使

image.png image.png

  1. 启动elasticsearch是否成功开启 image.png

  2. 查看节点信息 image.png image.png image.png image.png

使用上述方式查看群集的状态对用户并不友好,可以通过安装 Elasticsearch-head 插件,可以更方便地管理群集。

安装 Elasticsearch-head 插件

Elasticsearch 在 5.0 版本后,Elasticsearch-head 插件需要作为独立服务进行安装,需要使用npm工具(NodeJS的包管理工具)安装。

安装 Elasticsearch-head 需要提前安装好依赖软件 node 和 phantomjs。

  • node:是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
  • phantomjs:是一个基于 webkit 的JavaScriptAPI,可以理解为一个隐形的浏览器,任何基于 webkit 浏览器做的事情,它都可以做到。
  1. 两个node节点编译安装 node

    • 安装所需依赖包 image.png

    • 上传软件包 node-v8.2.1.tar.gz 到/opt,并解压 image.png

    • 进行编译安装 image.png image.png

  2. 两个node节点安装 phantomjs

    • 上传软件包 phantomjs-2.1.1-linux-x86_64.tar.bz2 到 image.png
  3. 安装 Elasticsearch-head 数据可视化工具

    • 上传软件包 elasticsearch-head-master.zip 到/opt image.png image.png
  4. 修改 Elasticsearch 主配置文件 image.png image.png

  5. 启动 elasticsearch-head 服务

    • 必须在解压后的 elasticsearch-head 目录下启动服务,进程会读取该目录下的 gruntfile.js 文件,否则可能启动失败。 image.png

    • elasticsearch-head 监听的端口是 9100 image.png

  6. 通过 Elasticsearch-head 查看 Elasticsearch 信息

    • 通过浏览器访问 http://192.168.44.20:9100/ 地址并连接群集。如果看到群集健康值为 green 绿色,代表群集很健康。 image.png image.png
  7. 插入索引

    • 通过命令插入一个测试索引,索引为 index-demo,类型为 test。 image.png image.png image.png image.png image.png image.png

    • 删除索引 image.png image.png

ELK Logstash 部署(在 Apache 节点上操作)

  1. 安装Apahce服务(httpd) image.png

  2. 安装Java环境 image.png

  3. 安装logstash

    • 上传软件包 logstash-6.7.2.rpm 到/opt目录下 image.png image.png image.png
  4. 测试 Logstash
    Logstash 命令常用选项

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

image.png

  • 定义输入和输出流
    • 输入采用标准输入,输出采用标准输出(类似管道) image.png image.png image.png

    • 使用 rubydebug 输出详细格式显示,codec 为一种编解码器 image.png

    • 使用 Logstash 将信息写入 Elasticsearch 中,结果不在标准输出显示,而是发送至 Elasticsearch 中,可浏览器访问 http://192.168.44.20:9100/ 查看索引信息和数据浏览。 image.png image.png image.png image.png

  1. 定义 logstash配置文件 image.png
  • Logstash 配置文件基本由三部分组成:input、output 以及 filter(可选,根据需要选择使用)。

    • input:表示从数据源采集数据,常见的数据源如Kafka、日志文件等
    • filter:表示数据处理层,包括对数据进行格式化处理、数据类型转换、数据过滤等,支持正则表达式
    • output:表示将Logstash收集的数据经由过滤器处理之后输出到Elasticsearch。
  • 修改 Logstash 配置文件,让其收集系统日志/var/log/messages,并将其输出到 elasticsearch 中。 image.png

  • 定义 logstash配置文件 image.png image.png

  • 浏览器访问 http://192.168.44.20:9100/ 查看索引信息 image.png image.png

ELK Kiabana 部署(在 apache 节点上操作)

  1. 安装 Kiabana

    • 上传软件包 kibana-5.5.1-x86_64.rpm 到/opt目录 image.png
  2. 设置 Kibana 的主配置文件 image.png image.png image.png image.png

  3. 创建日志文件,启动 Kibana 服务 image.png

  4. 验证 Kibana

    • 浏览器访问apache端 http://192.168.44.40:5601 ,第一次进入点右边(explore on my own) image.png

    • 第一次登录需要添加一个 Elasticsearch 索引 image.png image.png image.png image.png

数据展示可以分类显示,在“Available Fields”中的“host”,然后单击 “add”按钮,可以看到按照“host”筛选后的结果

image.png

将 Apache 服务器的日志(访问的、错误的)添加到 Elasticsearch 并通过 Kibana 显示

  • 定义 logstash 关于apache日志配置文件 /etc/logstash/conf.d/apache_log.conf image.png

  • 读取启动该配置文件 image.png image.png

  • 浏览器访问 http://192.168.44.20:9100 查看索引是否创建 image.png

浏览器访问

访问http://192.168.44.40:5601
登录 Kibana,单击“Index Pattern -> Create Index Pattern”按钮添加索引, 在索引名中输入之前配置的 Output 前缀 apache_access-*,并单击“Create”按钮。在用相同的方法添加 apache_error-*索引。
选择“Discover”选项卡,在中间下拉列表中选择刚添加的 apache_access-* 、apache_error-* 索引, 可以查看相应的图表及日志信息。

image.png

image.png

总结

ELK工作原理

  • Logstash:由Logstash收集日志数据,并对日志数据进行过滤、格式化输出到ES
  • ES(ElasticSearch):存储 Logstash 处理后的数据,并创建索引,提供全文检索功能
  • Kibana:接入ES,并对ES中的数据进行WEB图表展示

Elasticsearch三类节点说明

  • master 主节点:
    • 主要功能:维护元数据,管理集群节点状态;不负责数据写入和查询。
    • 配置要点:内存可以相对小一些,但是机器一定要稳定,最好是独占的机器。
  • data 数据节点:
    • 主要功能:负责数据的写入与查询,压力大。
    • 配置要点:大内存,最好是独占的机器。
  • client 客户端节点:
    • 主要功能:负责任务分发和结果汇聚,分担数据节点压力。
    • 配置要点:大内存,最好是独占的机器