透过现象看本质——聊一聊ELK

前言

​ 本文将从日志分析引入ELK,带着疑问了解、熟知、实践、领会ELK的原理与魅力。

引入

​ 想必做过专业运维的工程师都明白也非常清楚日志分析的重要性——发现问题的所在,解决问题的根源与基础。

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

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

​ 因此,开源实时的日志分析ELK平台应运而生了。

什么是ELK?

​ 笔者也不知道是为什么,一些朋友看到陌生的英文单词,尤其是缩写,就感觉这个玩意儿非常高bigger,甚至会不敢与接触它。其实这样的认识并不正确。就好比ELK,熟悉的人就不说了,没听过的就会有些好奇与疑惑。

​ ELK其实是三个单词的开头字母,分别是Elastic Search 、Logstash以及Kibana。而ELK就是由这三个开源工具组成的(以及Beats)。官方网站:Elastic官网

ELK三者联系概览(ELK工作流程)

【APPServer集群】→→【logstash Agent 采集器】→→【ElasticSearch Cluster】→→【Kibana Server】→→【Browser】

Logstash收集AppServer产生的Log数据文件,并存放到ElasticSearch集群中,而Kibana则从ES集群中查询数据生成图表,再返回给Browser。简单来说,进行日志处理分析,一般需要经过以下几个步骤:

  1. 将日志进行集中化管理(beats)
  2. 将日志格式化(logstash)
  3. 对格式化后的数据进行索引和存储(elasticsearch)
  4. 前端数据的展示(可视化展现)(kibana)

ELK主要组件梳理

Elasticsearch介绍

Elasticsearch的概念

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

​ Elastic Stack 是适用于数据采集、充实、存储、分析和可视化的一组开源工具。人们通常将 Elastic Stack 称为 ELK Stack(代指 Elasticsearch、Logstash 和 Kibana),目前 Elastic Stack 包括一系列丰富的轻量型数据采集代理,这些代理统称为 Beats,可用来向 Elasticsearch 发送数据。

Elasticsearch的作用

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

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

Elasticsearch 的工作原理是什么?

​ 原始数据会从多个来源如:日志、系统指标和网络应用程序(也就是上面所说的三种日志)输入到 Elasticsearch 中。数据采集(是由Logstash agent采集数据的,下文会讲述什么是Logstash)指在 Elasticsearch 中进行索引(下面会讲述什么是elasticsearch的索引)之前解析、标准化并充实这些原始数据的过程。这些数据在 Elasticsearch 中索引完成之后,用户便可针对他们的数据运行复杂的查询,并使用聚合来检索自身数据的复杂汇总。在 Kibana 中,用户可以基于自己的数据创建强大的可视化,分享仪表板,并对 Elastic Stack 进行管理。

Elasticsearch 索引是什么?(索引、类型、文档)

​ Elasticsearch 索引指相互关联的文档集合。Elasticsearch 会以 JSON 文档(可以与xml比较)的形式存储数据。每个文档都会在一组(字段或属性的名称)和它们对应的值(字符串、数字、布尔值、日期、数值组、地理位置或其他类型的数据)之间建立联系。

​ Elasticsearch 使用的是一种名为倒排索引的数据结构,这一结构的设计可以允许十分快速地进行全文本搜索。倒排索引会列出在所有文档中出现的每个特有词汇,并且可以找到包含每个词汇的全部文档。

​ 在索引过程中,Elasticsearch 会存储文档并构建倒排索引,这样用户便可以近实时地对文档数据进行搜索。索引过程是在索引 API 中启动的,通过此 API 您既可向特定索引中添加 JSON 文档,也可更改特定索引中的 JSON 文档。

​ 在一个索引中,可以定义一种或多种类型。类型可以作为索引的一个逻辑上的分区,通常会为具有一组共同字段的文档定义一个类型。文档则是一个可以被索引的基础信息单元。文档以JSON(Javascript Object Notation)格式来表示,而JSON是一个到处存在的互联网数据交互格式。

JSON格式文档举例

{
    "name": "中国",
    "province": [{
        "name": "黑龙江",
        "cities": {
            "city": ["哈尔滨", "大庆"]
        }
    }, {
        "name": "广东",
        "cities": {
            "city": ["广州", "深圳", "珠海"]
        }
    },, {
        "name": "新疆",
        "cities": {
            "city": ["乌鲁木齐"]
        }
    }]
}

​ 当然在Elasticsearch中还有一些要点,例如分片(shard)、副本(replica)、路由(routing)等等。这里简述一下分片和副本。

分片:

​ 在实际的生产环境下,索引存储的数据可能超过单个节点的硬件限制。这就意味着将这种大量数据存储在单个节点上不太适合,一方面硬件资源不一定可以满足,另一方面则是即使存储在单个节点上其安全性以及搜索效率都不可保证。

​ 因此,为了解决诸如此类的问题,Elasticsearch提供将索引分成多个分片的功能。当在创建索引时,可以定义想要分片的数量。每个分片就是一个全功能的独立索引,可以位于集群中任何节点上。

分片可以进行水平分割扩展,增大存储量;支持分布式并行跨分片操作,提高性能和吞吐量。

副本:

​ 网络问题等等其它问题可以在任何时候不期而至,为了健壮性,强烈建议要有一个故障切换机制,无论何种故障以防止分片或者节点不可用。 为此,Elasticsearch让我们将索引分片复制一份或多份,称之为副本。

副本随着而来的优势在于高可用性以及吞吐量的作用。

总结:为什么使用Elasticsearch?

  1. 搜索速度快,延时非常低
  2. 具备分布式的本质特征,提高安全性能
  3. 包含一系列广泛功能:可扩展、弹性伸缩、数据汇总和索引生命周期管理等
  4. Elastic Stack简化了数据采集、可视化和报告过程

​ 通过与 Beats 和 Logstash 进行集成,用户能够在向 Elasticsearch 中索引数据之前轻松地处理数据。同时,Kibana 不仅可针对 Elasticsearch 数据提供实时可视化,同时还提供 UI 以便用户快速访问应用程序性能监测 (APM)、日志和基础设施指标等数据。

Logstash介绍

​ Logstash由 JRuby 语言编写,基于消息(message-based)的简单架构,并运行在Java虚拟机(JVM)上(对jvm虚拟机有所了解最好)。Logstash不同于分离的代理端(agent)或主机端(server),LogStash可配置单一的代理端(agent)与其它开源软件结合,以实现不同的功能。

Logstash主要工作

  1. Collect:数据输入
  2. Enrich:数据处理,如过滤,改写
  3. Transport:数据输出

​ Logstash可用来对数据进行聚合和处理,并将数据发送到 Elasticsearch。Logstash 是一个开源的服务器端数据处理管道,允许您在将数据索引到 Elasticsearch 之前同时从多个来源采集数据,并对数据进行对应处理。

Logstash主要组件

●Shipper:日志收集者 。负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来。通常,远程代理端(agent)只需要运行这个组件即可;

●Indexer:日志存储者。负责接收日志并写入到本地文件。

●Broker:日志Hub。负责连接多个Shipper和多个Indexer

●Search and Storage:允许对事件进行搜索和存储;

●Web Interface:基于Web的展示界面

由于Logstash支持所有组件在其架构中可以独立部署,因此可以提供更好的集群扩展性。

Logstash主机分类

  • 代理主机:作为事件的传递者(shipper),将各种日志数据发送至中心主机,只运行agent程序;
  • 中心主机:可运行包括中间转发器(Broker)、索引器(Indexer)、搜索和存储器(Search and Storage)、Web界面端(Web Interface)在内的各个组件,以实现对日志数据的接收、处理和存储。

Kibana介绍

​ Kibana是一个针对Elasticsearch的开源分析及可视化平台,用来搜索、查看交互存储在Elasticsearch索引中的数据。

​ 使用Kibana,可以通过各种图表进行高级数据分析及展示。Kibana让海量数据更容易理解。它操作简单,基于浏览器的用户界面可以快速创建仪表板(dashboard)实时显示Elasticsearch查询动态。设置Kibana非常简单。无需编写代码,几分钟内就可以完成Kibana安装并启动Elasticsearch索引监测。

Kibana主要作用:

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

为何使用 Kibana?

**Kibana 是 Elasticsearch 的官方界面。**Elasticsearch 用户在发掘数据洞见并对 Elastic Stack 运行状况进行主动管理时,均认为 Kibana 是效果最佳的界面。

**Kibana 可以解决很多用例。**Elastic 在可视化界面创新领域投入了巨大精力。用户可以利用 Kibana 的内置功能来完成下列用例:APM、安全分析、业务分析、运行状态监测、地理空间分析,等等。

**Kibana 拥有强大的支持社区。**作为一个开源界面,Kibana 的采用率很高,而且社区在开发过程中也做出了很大贡献。虽然 Kibana 用户的经验水平参差不齐,但是我们的文档、说明和社区支持能够满足用户在专业知识方面的广泛需求。Elastic 同时还提供培训和个性化支持来帮助用户完成部署并运行。

总结

​ 本文通过日志引入什么是ELK,介绍其主要组件的感念和作用。

​ PS:下篇文章将给出如何部署配置ELK日志分析系统的案例