ELK日志系统:Filebeat+Eleticsearch 简述

 ELK日志系统:Filebeat+Eleticsearch 简述

我正在参加「掘金·启航计划」

前言

最近接了个活,升级维护公司某项目日志系统。

“我是前端,为什么让我接?”

“之前维护这套系统的人也是前端,他要离职”

“为什么要交接给我”

"你优秀(实在没人愿意接了,你来的时间短,听话)"

交接的时候我才知道,就是因为让升级日志系统,这位同事才要离职......

没办法,接了,只能硬着头皮搞了。

这套日志系统是基于ELK的,那么,ELK是什么?

ELK

“ELK”是三个开源项目的首字母缩写,这三个项目分别是:ElasticsearchLogstashKibana。简单来说就是收集、存储、展示,这是ELK的主要构成部分,但并不是全部。我们来看看他们分别的作用是什么:

  • Elasticsearch 是一个搜索分析引擎。
  • Logstash 是服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送到诸如 Elasticsearch 等“存储库”中。
  • Kibana 则可以让用户在 Elasticsearch 中使用图形和图表对数据进行可视化

图片1.png

图片2.png

一个ELK系统的所有流程大概是这样:Beats(数据采集器)采集数据, Logstash获取、处理数据,存储在Elasticsearch中,Kibana再进行展示。

项目原因,我们这里仅使用Beats(filebeat)+ Elasticsearch。

Filebeat

FIlebeat隶属于Beats,Beats集合了多种用途的数据采集器,均采用Go语言编写,根据待采集数据的类型大家可以自行决定使用哪种采集器,这里我们采集日志,使用Filebeat。

Filebeat是一个轻量级的本地文件的日志数据采集器(真的很轻)。可监控日志目录或特定日志文件,并将它们转发给Elasticsearch或Logstatsh进行索引、kafka等。带有内部模块(auditd,Apache,Nginx,System和MySQL),可通过一个指定命令来简化通用日志格式的收集,解析和可视化。

img

Filebeat下载解压即用,无需安装。

elastic官网下载即可:www.elastic.co/cn/download…

工作原理

Filebeat涉及两个组件:查找器prospector(input)和采集器harvester,来读取文件并将事件数据发送到指定的输出。

启动Filebeat时,它会启动一个或多个查找器,查看你为日志文件指定的本地路径。对于查找器所在的每个日志文件都启动采集器。每个采集器都会为新内容读取单个日志文件,并将新日志数据发送到flibbeat,filebeat会聚合事件并将数据发送到你为Filebeat配置的输出。

图片3.png

当发送数据到Logstash或Elasticsearch时,Filebeat使用一个反压力敏感(backpressure-sensitive)的协议来解析高负荷的数据量。当数据处理繁忙时,Filebeat放慢它的读取速度,压力解除时,Filebeat会恢复到原来的速度,继续传输数据。

来看下filebeat常用配置:

# 文件输入

filebeat.inputs:

 # 文件输入类型

 - type: log

  # 开启加载配置

  enabled: true

  # 文件位置

  paths:

  - /var/log/nginx/access.log

  # 自定义参数

  fields:

   type: nginx_access # 类型是nginx_access,和上面fields.type是一致的

 

# 输出至elasticsearch

output.elasticsearch:

 # 连接ES集群的用户名

 username: test-filebeat

 # 连接ES集群的密码

 password: "${test-filebeat密码}"

# elasticsearch集群

 hosts: ["http://192.168.x.x:8800",

    "http://192.168.y.y:8800",

    "http://192.168.z.z:8800"]

 

 # 索引配置

 indices:

  # 索引名

  - index: "nginx_access_%{+yyy.MM}"

   # 当类型是nginx_access时使用此索引

   when.equals:

    fields.type: "nginx_access"

 

# 关闭自带模板

setup.template.enabled: false

 

# 开启日志记录

logging.to_files: true

# 日志等级

logging.level: info

# 日志文件

logging.files:

 # 日志位置

 path: /opt/logs/filebeat/

 # 日志名称

 name: filebeat

 # 日志轮转期限,必须要2~1024

 keepfiles: 7

 # 日志轮转权限

 permissions: 0600
复制代码

对于filebeat配置来说,最重要的就是它的inputsoutput,当然还有enabled: true,不配置为true其他配置不会生效。

filebeat.inputs表示日志来源:可配置paths为某一具体文件路径,匹配某种格式的日志。此外,paths还可以指向某类配置文件,把日志的相关配置写入这个配置文件中。

output表示日志的输出对象,可输出至:Console、Elasticsearch、Logstash、Kafaka、Redis、File等。

启动命令:

./filebeat -e -c filebeat.yml(前台启动,日志相关会打印控制台,退出即停止。不加-e为后台启动)

启动成功后,会将日志相关信息一直打印在控制台。

采集器

采集器负责读取单个文件的内容。读取每个文件,并将内容发送到制定输出(output),每个文件启动一个采集器, 负责打开和关闭文件,因此,在运行时,文件保持打开状态。 如果文件在读取时被删除或重命名,Filebeat将继续读取文件,在采集器关闭之前,磁盘上的空间被保留。默认情况下,Filebeat将文件保持打开状态,直到达到采集结束。结束采集状态会有以下结果

  • 如果在采集器仍在读取文件时文件被删除,则关闭文件句柄,释放底层资源。
  • 文件的采集只会在scan_frequency过后重新开始。
  • 如果在采集器关闭的情况下移动或移除文件,则不会继续处理文件。

要控制采集器何时关闭,请使用close_ *配置选项

查找器

查找器负责管理采集器并找到所有要读取的文件来源。如果输入类型为日志,查找器会查找路径匹配的所有文件,并为每个文件启动一个采集器。每个查找器都在自己的线程中运行。

Filebeat目前支持两种查找类型:log和stdin。每个查找器类型可以定义多次。日志查找器检查每个文件来查看采集器是否需要启动,是否已经运行,或者该文件是否可以被忽略(ignore_older)。

只有在查找器关闭后,文件的大小发生了变化,才会读取到新行。

和Logstash的区别

logstashfilebeat
使用Java编写使用Go语言
对机器性能要求更高部署简单,更轻量,占用资源更少
具有强大的分析、过滤功能过滤相对较简单
出现更早,插件丰富生态相对不够丰富
elastic公司开发,采集日志elastic公司开发,采集日志

Eleticsearch

Elasticsearch是一个开源的分布式、RESTful风格的搜索和数据分析引擎,它的底层是开源库Apache Lucene。Elasticsearch使用 Java 编写,内部采用 Lucene做索引与搜索,简化了Lucene使用时的繁复性。Elasticsearch的目标是使全文检索变得更简单,简单来说,就是对Lucene 做了一层封装,它提供了一套简单一致的 RESTful API 来帮助我们实现存储和检索。

Elasticsearch的特点

  • 可以作为一个大型分布式集群使用,配置数十台、输百台服务器,处理PB级数据,用于大型项目;也可以运行在单机上,用于小型项目;
  • Elasticsearch不是独立的全新技术,是全居检索、数据分析以及分布式技术等的结合;
  • 对用户来说,非常简单,开箱即用;作为中小型的应用,直接花较少的时间部署一下ES,就可以作为生产环境的系统来使用了;
  • 数据库本身的功能面对很多领域是不够用的,Elasticsearch可以作为传统数据库的一个补充,提供全文检索、同义词处理、相关排名、数据分析等扩展功能。

Elasticsearch的安装与访问

Elasticsearch用Java编写,其正常运行需要依赖于Java虚拟机,因此需要先安装JDK,配置环境变量,具体方法可百度,这里就不作赘述。

Elasticsearch可通过官方选择具体版本安装:www.elastic.co/cn/download…

运行命令:

Linux:运行 bin目录下的elasticsearch;

Windows:运行 bin目录下的elasticsearch.bat;

运行成功后访问 http://localhost:9200/即可。

image-20221029175052925.png

Elasticsearch有三种访问方式:

  • 通过向Elasticsearch REST API提交HTTP请求来直接与集群交互;
  • 安装运行Kibana,并通过Dev控制台提交请求;
  • 使用curl指令与集群交互(windows可下载curl for Windows);

Elasticsearch的基本概念

索引(Index)

索引就相当于关系型数据库里的库,它是某种相似特性的文档的集合,也就是说不同的文档会放在不同的索引。

  • 索引的名称必须全部是小写;
  • 在单个集群中,可以定义任意多个索引;
  • 索引具有mapping和setting的概念,mapping用来定义文档字段的类型,setting用来定义不同数据的分布。

文档(Document)

Elasticsearch是面向文档的,也就是说文档是所有可搜索数据的最小单元。ES的文档就像MySql中的一条记录,只是ES的文档会被序列化成json格式,保存在Elasticsearch中;

这个json对象是由字段组成,字段就相当于Mysql的列,每个字段都有自己的类型(字符串、数值、布尔、二进制、日期范围类型);

当我们创建文档时,如果不指定字段的类型,Elasticsearch会帮我们自动匹配类型;每个文档都有一个ID,类似MySql的主键,咱们可以自己指定,也可以让Elasticsearch自动生成;

文档的json格式支持数组/嵌套,在一个索引(数据库)或类型(表)里面,你可以存储任意多的文档。虽然在实际存储上,文档存在于某个索引里,但是文档必须被赋予一个索引下的类型才可以。

类型(type)

类型就相当于关系型数据库里的表,我们知道MySql里一个库下可以有很多表,最原始的时候ES也是这样,一个索引下可以有很多类型,但是从6.0版本开始,type已经被逐渐废弃,但是这时候一个索引仍然可以设置多个类型,一直到7.0版本开始,一个索引就只能创建一个类型了。

节点(node)

一个节点就是一个ES实例节点的名称可以通过配置文件配置,或者在启动的时候使用-E node.name=xxx 指定,默认是随机分配的。建议自己指定,因为节点名称对于管理目的很重要,可以通过节点名称确定网络中的哪些服务器对应于ES集群中的哪些节点;

ES的节点类型主要分为如下几种:

Master Eligible节点:每个节点启动后,默认就是Master Eligible节点,可以通过设置node.master: false 来禁止。Master Eligible可以参加选主流程,并成为Master节点(当第一个节点启动后,它会将自己选为Master节点);每个节点都保存了集群的状态,只有Master节点才能修改集群的状态信息。

Data节点:可以保存数据的节点。主要负责保存分片数据,利于数据扩展。

Coordinating 节点:负责接收客户端请求,将请求发送到合适的节点,最终把结果汇集到一起。

每个节点默认都起到了Coordinating node的职责。一般在开发环境中一个节点可以承担多个角色,但是在生产环境中,还是设置单一的角色比较好,因为有助于提高性能。

集群(cluster)

多个节点可以构成一个集群,集群名称相同,表示他们是一个集群。

分片(shard)

ES里面的索引可能存储大量数据,这些数据可能会超出单个节点的硬件限制。

为了解决这个问题,ES提供了将索引细分为多个碎片的功能,这就是分片。这里咱们可以简单去理解,在创建索引时,只需要咱们定义所需的碎片数量就可以了,其实每个分片都可以看作是一个完全功能性和独立的索引,可以托管在集群中的任何节点上。

elasticsearch-head-master

elasticsearch-head-master是一个elasticsearch的可视化工具,他是开源的,可以在github上下载(github.com/mobz/elasti…

下载后直接在浏览器打开入口文件即可(需要有node)

image-20221029181852694.png

ip改成elasticsearch对应ip即可,可查看集器状态、索引等等;

最重要的是,我们可以根据elasticsearch-head-master来观察elasticsearch的集群、节点、分片等信息。其中集群状态是最重要的(my-application),它有四种状态:

  • 绿色——最健康的状态,代表所有的主分片和副本分片都可用;
  • 黄色——所有的主分片可用,但是部分副本分片不可用;
  • 红色——部分主分片不可用。
  • 灰色:未连接到elasticsearch服务

爬坑记录

  • Filebeat和Elasticsearch的版本尽量保存一致,否则可能会有莫名其妙的错误;

  • Filebeat启动时尽量前台启动,可以查看报错打印,确保无误后,再后台启动。

  • Filebeat启动控制台无反应:

    可能是日志级别需要调整,将日志级别降低,或不设置(默认为info)

    # Sets log level. The default log level is info.
    ​
    # Available log levels are: error, warning, info, debug
    ​
    logging.level: debug
    复制代码
  • Elasticsearch创建索引时,发现出现 Unassigned 问题

    es默认分片的副本数 (number_of_replicas )为1,多副本会变成 Unassigned 状态,可以手动将出现该问题的索引副本数设置为0:

    curl -XPUT 'http://localhost:9200/当前索引/_settings' -H 'Content-Type: application/json' -d ' 
    {
        "index" : {
            "number_of_replicas" : 0
        }
    } '
    ​
    复制代码
  • 不要随意index生产模板,更不要重复配置

  • 删除索引方法

    curl -X DELETE "localhost:9200/索引名?pretty"

    可添加*匹配或使用all。

  • 日志无法生成索引或者Elasticsearch查询不到时,检查符合filebeat采集规则的日志是否存在,是否附合采集日志等级,是否有权限。

    持续爬坑中,有新的会补充.....

其他方案

ELK日志流程可以有多种方案,不同组件可自由组合,大家可以根据自身业务配置:

  • Logstash(采集、处理)—> ElasticSearch (存储)—>Kibana (展示)
  • Logstash(采集)—> Logstash(聚合、处理)—> ElasticSearch (存储)—>Kibana (展示)
  • Filebeat(采集、处理)—> ElasticSearch (存储)—>Kibana (展示)
  • Filebeat(采集)—> Logstash(聚合、处理)—> ElasticSearch (存储)—>Kibana (展示)
  • Filebeat(采集)—> Kafka/Redis(消峰) —> Logstash(聚合、处理)—> ElasticSearch (存储)—>Kibana (展示)
分类:
前端