欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Elastic Stack:ELK

程序员文章站 2022-03-06 18:27:21
文章目录一、ELK日志分析系统简介一、ELK日志分析系统简介1.1Elasticsearch定义Elasticsearch是一个分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据。Elasticsearch 在Apache Lucene的基础上开发而成,由Elasticsearch N.V.(即现在的Elastic)于2010年首次发布。Elasticsearch以其简单的REST风格API、分布式特性、速度和可扩展性而闻名,是Elastic Stac...

一、存储系统分类

1.1 非结构化存储

定义:指不定长或无固定格式的数据,如邮件,word文档等

1.1.1 常见使用设备

①Block:需要分区,格式化,不支持多个节点挂载使用。rbd(Ceph)
②Filesystem:NFS,HDFS(hadoop Filesystem),FastDFS(轻量级,适用于存储图片),输出的API已经是文件了,支持多个节点挂载使用

1.2 半结构化存储

定义:非关系模型的、有基本固定结构模式的数据,例如日志文件、XML文档、JSON文档、Email等
流派:

K/V存储  :redis,TiKV(原生K/V存储系统)

Document存储:MongoDB,CahceDB,ElastcSearch:每个数据项自带的字段和值,可以后期添加字段和值,还可以嵌套值,---> 文档(Document)

Colume Family存储:HBase (Hadoop Database)

GraphDB:图式存储:Neo4j

1.3 结构化存储

定义:指具有固定格式或有限长度的数据,如数据库,元数据等

特点:

① TiDB: 是一个分布式 NewSQL 数据库。它支持水平弹性扩展、ACID 事务、标准 SQL、MySQL 语法和 MySQL 协议,具有数据强一致的高可用特性,是一个不仅适合 OLTP 场景还适OLAP 场景的混合数据库

②shema要求严格

二、 ELK日志分析系统组成

2.3.1 ElasticSearch

ElasticSearch定义: Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。

2.3.2 Logstash和Filebeat

Logstash定义: 集中、转换和存储数据

Filebeat定义: 轻量型日志采集器;从安全设备、云、容器、主机还是 OT 进行数据收集,Filebeat 都会提供一种轻量型方法,用于转发和汇总日志与文件

Filebeat是Beats中的一个组件,以下是Beats的介绍以及组件组件构成:

介绍: beats组件是一系列用于采集数据的轻量级代理程序,用于从服务端收集日志、网络、监控数据,并最终汇总到elasticsearch。beats组件收集的数据即可以直接上报给elasticsearch,也可以通过logstash中转处理后上报给elasticsearc。

beats根据功能划分有多种组件:

PacketBeat:用于分析和收集服务器的网络包数据;

Heartbeat:主要是检测服务或主机是否正常运行或存活,Heartbeat 能够通过 ICMP、TCP 和 HTTP 进行 ping 检测;

FileBeat:主要用于转发和集中日志数据。Filebeat作为代理安装在服务器上,监视您指定的日志文件或位置,收集日志事件,并将它们转发到ElasticSearch或Logstash进行索引;

MetricBeat:定期收集操作系统、软件或服务的指标数据,支持收集的module非常多,常用的有docker、kafka、mysql、nginx、redis、zookeeper等等

Packetbeat:是一款轻量型网络数据包分析器,Packetbeat的工作原理是捕获应用程序服务器之间的网络流量,解码应用程序层协议(HTTP,MySQL,Redis等)

Auditbeat 允许您在 Linux、macOS 和 Windows 平台上仔细监控任何您感兴趣的文件目录。文件改变会被实时发送到 Elasticsearch,每条消息都包含元数据和文件内容的加密哈希信息,以便后续进一步分析;

Topbeat:搜集系统,进程和文件系统级别的CPU和内存使用情况,已经被Metricbeat取代;

WinlogBeat:用于收集windows系统的event log;

2.3.3 Kibana

定义: Kibana 是为 Elasticsearch设计的开源分析和可视化平台

三、ELK日志分析系统简介

Elastic Stack:ELK
搜索组件和索引组件的关系和过程逻辑:

上图中以index为分界线,分为两个部分,上面半部分为搜索组件,下面半部分为索引组件

1.搜索组件(Search component):面向客户端;用户输入搜索关键词,帮助用户查询索引中的索引数据并向用户返回结果;

1.1 user:用户

1.2 Search User interface :用户搜索界面(API接口),通常会使用 http restful风格 ,使用curl命令即可发起请求

1.3 Bulid Query:将用户的搜索 转化为搜索查询语句,由build query 构建成为查询语句,搜索时提供关键词即可

1.4 Run Query:构建查询在index的接口之上完成查询结果

1.5 Render Results:展示查询结果

2.索引组件:(index component):

2.1 Acquire Content:获取数据;注意这里获取到数据要将数据进行ETL处理,ETL是指数据导入方式:抽取(export)、转换文档格式(transfrom)、转入(load)

2.1.1 数据的来源

①私网内的数据
②爬虫:互联网爬来的所有数据

2.2Build Document :建立成为文档

2.3 Analyze Document :文档分析,主要是切词的过程

????注意:
浅绿色: 搜索组件应该有的内容,是用户自行开发出来的

深绿色: ES底层Luence自带的功能

3.1Elasticsearch定义

Elasticsearch是一个分布式的开源搜索和分析引擎,适用于所有类型的数据,包括文本、数字、地理空间、结构化和非结构化数据。Elasticsearch在Apache Lucene的基础上开发而成,由Elasticsearch N.V.(即现在的Elastic)于2010年首次发布。Elasticsearch以其简单的REST风格API、分布式特性、速度和可扩展性而闻名,是Elastic Stack的核心组件; Elastic Stack 是适用于数据采集、充实、存储、分析和可视化的一组开源工具。人们通常将Elastic Stack称为ELK Stack(代指Elasticsearch、Logstash和Kibana),目前Elastic Stack 包括一系列丰富的轻量型数据采集代理,这些代理统称为Beats,可用来向Elasticsearch 发送数据。

3.2 Elasticsearch的用途

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

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

3.3ElasticSearch的原理

3.3.1 搜索引擎工作的过程

爬取内容、进行分词、建立反向索引(倒排索引)

爬取内容:网页爬取数据,所谓的爬虫;

进行分词:对爬取到数据进行切片;
????注意:数据中没有意义的字,例如“的、而 、和…”,这些词本身是没有意义的,认为是停顿词,所以这些词没必要建立索引的。

倒排索引:根据分词搜索爬取的完整内容

Elastic Stack:ELK
Elastic Stack:ELK
Elastic Stack:ELKMap:映射

input document:读入文档

Noemalization:全部统一化(同义词替换、统一大小写…)

Reduce:折叠

Key-alue pairs:键值对:每个词出现文档的编号

final reverse index:倒排索引,数据缩减

3.3.2 ElasticSearch 来源

ElasticSearch的之前是一个叫做Lucene的库,必要懂一些搜索引擎原理的人才会使用,所有有人基于Lucene进行封装,就成了今天我们看到的ElasticSearch。
ElasticSearch对搜索引擎的操作都封装成了restful的api,通过http的请求就能进行搜索操作。

#获取指定主机上的test索引中_doc类型中的1文档
curl -XGET '127.0.0.1:9200/test/_doc/1?pretty=true'

3.3.3 ElasticSearch 基本概念

索引、类型、文档
为了方便理解与MySQL数据库中的库、表、行对应i起来
Elastic Stack:ELK

3.3.4 存储ElasticSearch数据

比如一首诗,有诗题、作者、朝代、字数、诗内容等字段,那么首先,我们可以建立一个名叫 Poems 的索引,然后创建一个名叫 Poem 的类型,类型是通过 Mapping 来定义每个字段的类型。

比如诗题、作者、朝代都是 Keyword 类型,诗内容是 Text 类型,而字数是 Integer 类型,最后就是把数据组织成 Json 格式存放进去了。

索引
poems

类型
"poem": {
    "properties": {
        "title": {
            "type":"keyword",
},
        "author":{
   			 "type": "keyword",
},
		"dynasty": {
		    "type": "keyword"
},
		"words": {
  		   "type": "integer"
},
		"content": {
 		   "type": "text"
   }
  }
}

文档
{
	"title":"静夜思",
	"author":"李白",
	"dynasty":"唐",
	"words":"20",
    "content":"床前明月光,疑是地上霜。举头望明月,低头思故乡。"
}

????注意:keyword与text的区别


keyword 直接直接建立反向索引
test 先分词 后建立反向索引

3.4 ElasticSearch 分布式原理

为了确保分布式环境的高可用,ElasticSearch也会对数据进行切分,同时会保存多个副本。

Elastic Stack:ELK

3.4 ElasticSearch数据同步

在 Elasticsearch 中,节点是对等的,节点间会通过自己的一些规则选取集群的 Master,Master 会负责集群状态信息的改变,并同步给其他节点
Elastic Stack:ELK
????注意:只有建立索引和类型需要经过 Master,数据的写入有一个简单的 Routing 规则,可以 Route 到集群中的任意节点,所以数据写入压力是分散在整个集群的。

ElasticSearch 总结:

  1. ElasticSearch 在Lucene的基础上进行封装,实现了分布式搜索引擎;
  2. ElasticSearch中数据存在索引、类型和文档的概念,相当于MySQL中的数据库、表、行;
  3. ElasticSearch 本身就是集群高可用应用,所以也存在master-slave架构,实现数据的分片和备份;
  4. ElasticSearch 的典型应用就是ELK的日志分析系统。

3.5 Logstash

3.5.1 Logstash的简介

logstash是一个数据分析软件,主要目的是分析log日志。整一套软件可以当作一个MVC模型,logstash是controller层,Elasticsearch是一个model层,kibana是view层。首先将数据传给logstash,它将数据进行过滤和格式化(转成JSON格式),然后传给Elasticsearch进行存储、建搜索的索引,kibana提供前端的页面再进行搜索和图表可视化,它是调用Elasticsearch的接口返回的数据进行可视化。

3.5.1 Logstash的架构

Logstash事件处理管道有三个阶段:输入(input)→过滤器(filter)→输出(output),输入生成事件,过滤器修改它们,然后输出将它们发送到其他地方。输入和输出支持编解码器,使你能够在数据进入或离开管道时对其进行编码或解码,而无需使用单独的过滤器。

Elastic Stack:ELK

3.5.1.1 Input输入

将数据收录到Logstash中,一些比较常用的输入是:

**- file:**从文件系统上的文件进行读取,类似于UNIX命令tail -5f file.txt
- syslog: 在端口514上监听syslog消息并根据RFC3164格式进行解析
- redis: 从redis服务器读取数据,同时使用Redis通道和Redis列表,Redis通常被用作集中式Logstash安装中的“broker”,它将从远程Logstash “shipper”中的Logstash事件排队
- beats: 处理Beats发送的事件
- stdin: 模块是用于标准输入,就是从标准输入读取数据

范例:从标准输入读取数据

[10:15:42 root@localhost conf.d]#vim  ./test4.conf  
input {
    stdin {
        add_field => {"key" => "value"}
        codec => "plain"
        tags => ["add"]
        type => "std"                                              
    }
}
output {
    stdout {
        codec => rubydebug
    }
}

[10:16:28 root@localhost conf.d]#/usr/share/logstash/bin/logstash -f ./test4.conf 
lulu  #手动输入
{
          "host" => "localhost.localdomain",
    "@timestamp" => 2020-12-31T02:19:18.620Z,
          "type" => "std",
           "key" => "value",
          "tags" => [
        [0] "add"
    ],
       "message" => "lulu",
      "@version" => "1"
}

3.5.1.2 filter过滤器

过滤器是Logstash管道中的中间处理设备,如果事件过滤器的条件,你可以将过滤器与条件语句组合在一起,对其执行操作,一些常用的过滤器包括:

- grok: 解析和构造任意文本,Grok是目前Logstash中解析非结构化日志数据到结构化和可查询数据的最佳方式,内置有120种模式
- mutate: 对事件字段执行一般的转换,你可以重命名、删除、替换和修改事件中的字段
- drop: 完全删除事件,例如debug事件
- clone: 复制事件,可能添加或删除字段
- geoip: 添加关于IP地址地理位置的信息

范例:GeoIP插件

GeoIP 是最常见的免费 IP 地址归类查询库,同时也有收费版可以采购。GeoIP 库可以根据 IP 地址提供对应的地域信息,包括国别,省市,经纬度等,对于可视化地图和区域统计

[20:59:10 root@localhost ~]#cd /etc/logstash/conf.d/

[20:59:29 root@localhost conf.d]#cat test3.conf 
input {
    stdin {
        type => "std"
    }
}
filter {
    geoip {
        source => "message"
    }
}
output{stdout{codec=>rubydebug}}

[21:08:52 root@localhost ~]#/usr/share/logstash/bin/logstash -f  /etc/logstash/conf.d/test3.conf 
183.60.92.253 #手动输入IP地址进行分析
{
         "geoip" => {
          "country_name" => "China",
              "location" => {
            "lon" => 113.25,
            "lat" => 23.1167
        },
         "country_code2" => "CN",
         "country_code3" => "CN",
              "latitude" => 23.1167,   #纬度
                    "ip" => "183.60.92.253",
        "continent_code" => "AS",
           "region_name" => "Guangdong",
           "region_code" => "GD",
             "longitude" => 113.25,   #经度
              "timezone" => "Asia/Shanghai"
    },
          "host" => "localhost.localdomain",
      "@version" => "1",
          "type" => "std",
       "message" => "183.60.92.253",
    "@timestamp" => 2020-12-30T13:06:41.614Z
}

范例:grok插件

#logstach中自带grok插件
logstash拥有丰富的filter插件,它们扩展了进入过滤器的原始数据,进行复杂的逻辑处理,甚至可以无中生有的添加新的 logstash 事件到后续的流程中去!Grok 是 Logstash 最重要的插件之一。也是迄今为止使蹩脚的、无结构的日志结构化和可查询的最好方式。Grok在解析 syslog logs、apache and other webserver logs、mysql logs等任意格式的文件上表现完美。

[19:40:42 root@localhost ~]#cd /etc/logstash/conf.d/

#在test2.conf中插入grok插件
[19:41:25 root@localhost conf.d]#vim test2.conf 
input {
    stdin {}
}

filter {
    grok {
        match => {
            "message" => "%{COMBINEDAPACHELOG}  
        }
        remove_field => "message"  #移除message字段信息
    }
} 

output {
    stdout {
        codec => rubydebug
    }
}

[19:49:03 root@localhost conf.d]#/usr/share/logstash/bin/logstash -f  ./test2.conf
10.0.0.18 - - [29/Dec/2020:17:47:56 +0800] "GET /test1.html HTTP/1.1" 200 11 "-" "curl/7.61.1" "-"  #手动输入nginx访问信息,因为该文件加入了grok插件,所以将每个字段详细分解
{
      "timestamp" => "29/Dec/2020:17:47:56 +0800",
          "agent" => "\"curl/7.61.1\"",
          "bytes" => "11",
           "auth" => "-",
       "clientip" => "10.0.0.18",
           "host" => "localhost.localdomain",
           "verb" => "GET",
     "@timestamp" => 2020-12-29T11:50:18.000Z,
    "httpversion" => "1.1",
       "@version" => "1",
          "ident" => "-",
       "response" => "200",
       "referrer" => "\"-\"",
        "request" => "/test1.html"
}

3.5.1.3 Output 输出

输出是Logstash管道的最后阶段,事件可以通过多种方式输出,一旦所有的输出处理完成,事件就结束了。

- elasticsearch: 发送事件数据到Elasticsearch,如果你打算以一种高效、方便、易于查询的格式保存数据,那么使用Elasticsearch是可行的。
- file: 将事件数据写入磁盘上的文件
- graphite: 将事件数据发送到graphite,这是一种流行的用于存储和绘制指标的开源工具。
- statsd: 发送事件到statsd,“监听统计信息(如计数器和计时器)、通过UDP发送聚合并将聚合发送到一个或多个可插拔后端服务”的服务
- stdout: 标准输出

范例:将日志统一收集到指定文件种


[10:37:13 root@localhost ~]#cat /etc/logstash/conf.d/test6.conf 
input {
    stdin{
        type => "std"
    }
}

output {
    file {
        path => "/tmp/%{+yyyy}-%{+MM}-%{+dd}-%{host}.log"
        codec => line{format => "%{message}"}
    }
}

[10:40:20 root@localhost conf.d]#/usr/share/logstash/bin/logstash -f ./test6.conf  
...
i love linux  #手动输入
[INFO ] 2020-12-31 10:38:35.822 [[main]>worker0] file - Closing file /tmp/2020-12-31-localhost.localdomain.log     #手动输入的内容收集到 /tmp/2020-12-31-localhost.localdomain.log 文件中

#日志文件内容验证
[10:38:37 root@localhost ~]#cat /tmp/2020-12-31-localhost.localdomain.log
i love linux

3.5.1.3 Codecs 编解码器

Codecs可以作为输入或输出的一部分进行操作,Codecs使用户能够轻松地将消息的传输与序列化过程分开, 形成input | decode | filter | encode | output 的数据流,流行的codecs包括json、msgpack和plain(text)

范例:

默认情况下,logstash只支持纯文本形式的输入,然后在过滤器filter种将数据加工成指定格式。现在可以在input指定数据类型,全部是因为有了codecs的设置。

[10:07:54 root@localhost ~]#cat  /etc/logstash/conf.d/test4.conf  
input {
    stdin {
        add_field => {"key" => "value" }
        codec => "json"
        type => "std"
    
    }

}
output {
    stdout {
        codec => rubydebug
    }
}

[09:54:45 root@localhost ~]#/usr/share/logstash/bin/logstash -f 
...
/etc/logstash/conf.d/test4.conf 
{"name":"lulu"}  #手动输入json格式的键值对
{
          "name" => "lulu",
          "host" => "localhost.localdomain",
    "@timestamp" => 2020-12-31T02:06:20.998Z,
           "key" => "value",
      "@version" => "1",
          "type" => "std"
}

3.6 Filebeat

3.6.1 Filebeat的工作流程

当开启Filebeat程序的时候,它会启动一个或多个探测器去指定的日志目录或文件,对于探测器找出每一个日志文件,Filebeat会启动收集进程,每一个收集进程读取一个日志文件内容,然后将这些日志发送到后台处理程序,后台处理程序会集合这些事件,最后将集合后的数据发送到output指定的目的地。

3.6.2 基于 Filebeat 的 ELK 集群架构

Elastic Stack:ELK

3.7 kibana

Elastic Stack:ELK

本文地址:https://blog.csdn.net/weixin_50620220/article/details/111937364