ELK 学习笔记
很多人不知道ELK是什么,先说一下ELK指什么,E表示Elasticsearch,L表示Logstash,K表示Kibana
在发展的过程中,又有了Beats的加入,这个时候就不再使用ELK去命名,而是Elastic Stack
先简单介绍一下他们的作用分别是什么,这样我们才能知道为什么要学习这些技术
- Elasticsearch:分布式搜索引擎,还有存储数据
- Logstash:收集日志,分析和处理日志
- Kibana:提供web页面,展示数据分析的结果
- Beats:数据采集,它出现之前,都是Logstash进行日志收集
总结:通过Beats收集数据,直接发送到elasticsearch或者先发送到ogstash经过处理后再发送给elasticsearch,最终通过Kibana进行数据可视化。
1. Elasticsearch
1.1 简介
- Elasticsearch是一个开源的高扩展的分布式全文检索引擎,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。
- Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的RESTful API来隐藏Lucene的复杂性,从而让全文搜索变得简单。
- Lucene只是一个库。想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的。所以Elasticsearch是最佳的选择
1.2 相关概念
1.2.1 分片
- 一个索引可以存储超出单个节点硬件限制的大量数据。比如,一个具有 10 亿文档数据的索引占据 1TB 的磁盘空间,而任一节点都可能没有这样大的磁盘空间。或者单个节点处理搜索请求,响应太慢。为了解决这个问题,Elasticsearch 提供了将索引划分成多份的能力,每一份就称之为分片。
- 当创建一个索引的时候,你可以指定分片的数量,一旦指定,就不可以再进行修改(原因是路由计算…)
1.2.2 副本
- 副本是一个分片的精确复制,每个分片可以有零个或多个副本。
- 当主分片丢失或不可用时,集群会将副本提升为新的主分片。
1.3 核心概念
- Index:关系型数据库中的数据库
- Type:关系型数据库中的表
- 1个数据库可以有多个表,等价于1个索引下可以有多个类型
- Document:关系型数据库中的行 ,文档以JSON格式来表示
- 1个表中可以有多行,等价于1个类型中可以有多个文档
1.4 面试题汇总(不断更新)
-
问题1:路由计算,当索引一个文档的时候,elasticsearch如何知道文档存储在哪个分片中?当我们创建文档的时候,elasticsearch如何决定将这个文档存储到哪个分片上呢?
- 创建的时候肯定不是随机的,如果是随机的,我读的时候去哪找呢
- 计算公式:
s
h
a
r
d
=
h
a
s
h
(
r
o
u
t
i
n
g
)
%
n
u
m
b
e
r
_
o
f
_
p
r
i
m
a
r
y
_
s
h
a
r
d
s
shard = hash(routing) \% {number\_of\_primary\_shards}
shard=hash(routing)%number_of_primary_shards
- r o u t i n g routing routing是一个可变值,默认是文档的_id,也可以设置成一个自定义的值(可以在调用文档API的时候指定)
-
问题2:倒排索引?
- 倒排索引就是关键词到文档 ID 的映射。
- 在搜索引擎中,每个文档都有一个对应的文档 ID,文档内容被表示为一系列关键词的集合。例如,文档 1 经过分词,提取了 20 个关键词,每个关键词都会记录它在文档中出现的次数和出现位置。
-
问题3:es写数据和读数据的工作原理是什么啊?
-
写数据:
- 客户端向 Node 1 发送新建、索引或者删除请求。
- 节点使用文档的 _id 确定文档属于分片 0 。请求会被转发到 Node 3,因为分片 0 的主分片目前被分配在 Node 3 上。
- Node 3 在主分片上面执行请求。如果成功了,它将请求并行转发到 Node 1 和 Node 2 的副本分片上。一旦所有的副本分片都报告成功, Node 3 将向协调节点报告成功,协调节点向客户端报告成功。
-
读数据:
- 客户端向 Node 1 发送获取请求。
- 节点使用文档的 _id 来确定文档属于分片 0 。分片 0 的副本分片存在于所有的三个节点上。 在这种情况下,它将请求转发到 Node 2 (轮询)。
- Node 2 将文档返回给 Node1 ,然后将文档返回给客户端。
-
2. Logstash
2.1 简介
- 它是开源的服务器端数据处理管道,能够同时从多个来源采集数据,转换数据,然后将数据发送给ES。
- 之所以不再使用logstash去采集数据,一部分原因是logstash速度太慢
2.2 安装
# 1.解压安装包
tar -zxvf logstash...tar.gz
# 2.运行测试案例 输入什么就输出什么
bin/logstash -e 'input { stdin { } } output { stdout { } }'
2.3 参数配置详解
input { # 输入
stdin { ... } # 标准输入
}
filter { # 过滤,对数据进行分割、截取等处理
...
}
output { # 输出
stdout { ... } # 标准输出
}
2.4 读取自定义日志文件
日志结构: 2021-05-26 22:22:22|ERROR|读取数据出错|参数id=1002
# vim pipeline.conf
input {
file {
path => "/logstash/logs/app.log"
start_position => "beginning"
}
}
filter {
mutate {
split => {"message"=>"|"}
}
}
# 输出到控制台
output {
stdout { codec => rubydebug }
}
# 输出到ES中
output {
elasticsearch {
hosts => [主机号1:9200, 主机号2:9200, 主机号3:9200]
}
}
#启动
./bin/logstash -f ./pipeline.conf
#写日志到文件
echo "2021-05-26 22:22:22|ERROR|读取数据出错|参数id=1002" >> app.log
3. Kibana
3.1 简介
- 它是一款开源的数据分析和可视化平台。同时我们可以使用Kibana对ES的数据进行搜索、查看以及交互的操作。
3.2 安装以及配置
# 1.解压安装包
tar -zxvf kibana....tar.gz
# 2.修改配置文件
vim config/kibana.yml
server.host: "192.168.15.104"
elasticsearch.url: "http://192.168.15.104:9200"
# 3.启动
./bin/kibana
# 4.通过浏览器访问
http://hadoop102:5601/app/kibana
3.3 安装metricbeat仪表盘
metricbeat是轻量级指标采集器,用于从系统和服务中收集指标
fillebeat是轻量级日志采集器,用于转发和汇总日志文件
# 1.修改metricbeat配置
setup.kibana: host:
"192.168.15.104:5601"
# 2.安装仪表盘到Kibana【保证Kibana已启动】
./metricbeat setup --dashboards
3.4 Dev Tools
- 开发者工具,为开发者的调试提供了便捷工具使用。
post index1/type1/id1
{
"id":1001,
"name":"sl",
"age":22
}
get index1/type1/id1
4. 综合案例
-
使用java生成日志文件(实际生产环境就是真实的系统),通过Filebeat去采集数据,发送给Logstash,经过处理后,将数据发送给Elasticsearch,最后Kibana去读取Elasticsearch中要分析的数据,制作仪表盘进行数据展示。
-
简单介绍一下其中的配置:
-
Filebeat
vi dashboard.yml # 监控日志文件 filebeat.inputs: - type: log enabled: true paths: - /itcast/logs/*.log # 配置elasticsearch分片数 setup.template.settings: index.number_of_shards: 3 # 输出到logstash output.logstash: hosts: ["主机号:端口号"] # 启动 ./filebeat -e -c dashboard.yml
-
Logstash
vi dashboard.conf # 监听上述对应的端口号 input { beats { port => "端口号" } } # 过滤器 filter { mutate { split => {"message"=>"|"} } mutate { add_field => { "userId" => "%{message[1]}" "visit" => "%{message[2]}" "date" => "%{message[3]}" } } mutate { convert => { "userId" => "integer" "userId" => "string" "userId" => "string" } } } # 输出到ES output { elasticsearch { hosts => [主机号1:9200, 主机号2:9200, 主机号3:9200] } } #启动 ./bin/logstash -f dashboard.conf
-
kibana:
- 制作仪表盘就是玩儿~~~~
-