Elastic Stack:ELK

一、存储系统分类

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日志分析系统简介

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 搜索引擎工作的过程

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

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

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

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述Map:映射

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起来
在这里插入图片描述

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也会对数据进行切分,同时会保存多个副本。

在这里插入图片描述

3.4 ElasticSearch数据同步

在 Elasticsearch 中,节点是对等的,节点间会通过自己的一些规则选取集群的 Master,Master 会负责集群状态信息的改变,并同步给其他节点
在这里插入图片描述
🙄注意:只有建立索引和类型需要经过 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),输入生成事件,过滤器修改它们,然后输出将它们发送到其他地方。输入和输出支持编解码器,使你能够在数据进入或离开管道时对其进行编码或解码,而无需使用单独的过滤器。

在这里插入图片描述

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 集群架构

在这里插入图片描述

3.7 kibana

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章