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日志分析系统简介
搜索组件和索引组件的关系和过程逻辑:
上图中以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 搜索引擎工作的过程
爬取内容、进行分词、建立反向索引(倒排索引)
爬取内容:网页爬取数据,所谓的爬虫;
进行分词:对爬取到数据进行切片;
????注意:数据中没有意义的字,例如“的、而 、和…”,这些词本身是没有意义的,认为是停顿词,所以这些词没必要建立索引的。
倒排索引:根据分词搜索爬取的完整内容
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 总结:
- ElasticSearch 在Lucene的基础上进行封装,实现了分布式搜索引擎;
- ElasticSearch中数据存在索引、类型和文档的概念,相当于MySQL中的数据库、表、行;
- ElasticSearch 本身就是集群高可用应用,所以也存在master-slave架构,实现数据的分片和备份;
- 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
本文地址:https://blog.csdn.net/weixin_50620220/article/details/111937364