简介
Elastic Stack可用于集群、多应用的日志分析。
Elastic Stack包含Elasticsearch、Kibana、Logstash、Beats。
Elasticsearch负责存储、索引、查询、分析文档。一条日志可以看成一个文档。
Kibana是Elasticsearch的客户端,可以查询文档,将文档的分析结果可视化。
Logstash可以将一个数据源传输到另一个数据源,传输的过程中,可以对数据清洗、加工和整理。通过配置输入插件,可以支持不同的数据源,比如Beats、Kafka。通过配置过滤器,可以支持不同过滤形式,比如解析文本、增加字段。通过配置输出插件,可以支持不同的目标数据源,比如Elasticsearch、MongoDB。
Beats负责采集数据,采集日志的组件是FileBeats。
日志通过FileBeats采集,传输给Logstash,在生产环境中,Logstash会把消息中间件配置成事件队列,达到削峰填谷的目的。Logstash对日志加工后,交给Elasticsearch生成索引。通过Kibana可以查询和分析文档。
Elasticsearch
概念
- 全文检索
数据检索:从一系列数据中,根据一个或多个数据特征找到特定的数据。
数据分类:结构化数据,比如Mysql的表,半结构化数据,比如JSON、XML,非结构化数据,比如文章、邮件、图片、视频。
全文检索:结构化的数据可以用关系数据库检索,而半结构化、非结构化数据的检索称为全文检索。
- 倒排索引
forward index:关系数据库的索引一般是主键,也是记录id,记录id指向记录。
inverted index:全文检索是从文档内容中提取关键字,对关键字建立索引,索引指向文档id。
Elasticsearch权威指南-倒排索引
- 映射
文档插入索引,需要由映射关系来定义。
一个索引可以包含多个映射类型,但是Elasticsearch7.0开始,一个索引只包含一个映射类型(_doc),也就是只包含一种文档。
Elasticsearch权威指南-多个映射类型的问题
查询
查询分成Query和Filter,Query查询出的文档会按相关度排序,Filter查询出的文档相关度都相同。
Elasticsearch中的数据类型和其他数据库差不多,但是字符串类型比较特别。字符串类型包括text和keyword两种类型,text类型会经过分词,分成多个词项,然后编入索引,keyword类型是整个文本编入索引,不分词。text类型用于词项搜索,keyword类型用于聚合统计。比如"我爱中国"定义成text类型,经过分词可以分成3个词项“我”、“爱”、”中国“,当搜索”我“这个词项,可以查询到”我爱中国“这个字符串。如果"我爱中国"定义成keyword类型,只有搜索"我爱中国"时,才能查到”我爱中国“这个字符串。但是定义成text类型的"我爱中国"并没有在索引中保存整个文本,索引不能用于聚合统计,而keyword类型的"我爱中国"则可以。如果一个字段既希望能基于词项搜索,有希望基于全文统计,那就需要定义多类型,自身定义成一种类型,通过子字段定义成其他类型。
- 精确查询
使用关键字term,必须完全匹配文本。
GET /my_index/_search
{
"query" : {
"term" : {
"title" : "我爱中国"
}
}
}
Elasticsearch权威指南
- 匹配查询
使用关键字match,查询串会先经过分词,匹配索引中的分词文本。
GET /my_index/_search
{
"query": {
"match": {
"title": "我"
}
}
}
Elasticsearch权威指南
- 组合查询
使用关键字bool,组合多个条件,支持与、或、非。
GET /my_index/_search
{
"query" : {
"bool" : {
"must" : [
{ "term" : {"price" : 20}},
{ "term" : {"title" : "我爱中国"}}
]
}
}
}
Elasticsearch权威指南
聚合
常用的聚合是桶型聚合和指标聚合。
对于一条SQL:select avg(age) from student group by grade,group by grade对应Elasticsearch桶型聚合,avg(age)对应Elasticsearch指标聚合。采用Elasticsearch的语法:
GET /student/_search
{
"aggs": {
"grades": {
"terms": {
"field": "grade"
}
},
"aggs": {
"avg_age": {
"avg": { "field": "price" }
}
}
}
}
这种语法结构和SQL不同的是,可以嵌套多层聚合。桶型聚合下面嵌套指标聚合,指标聚合下面又可以嵌套桶型聚合。
Kibana
功能:Management-Dev Tools
开发工具界面可用于执行elasticsearch的操作,比如在增删改查文档。
Elasticsearch7.0增删改查文档
Elasticsearch2.x增删改查文档
官方的《Elasticsearch权威指南》基于Elasticsearch2.x编写,需要注意的是7.0版本中不推荐一个索引下定义多个mapping,mapping统一为_doc。
功能:Analytics-Discover
文档发现功能可以用来搜索“索引模式”中的文档。
首先需要定义索引模式。索引模式是一组相关的索引,比如日志通常会按天建立索引,当我们要搜索这种日志时,就需要包含每一天的索引,通常是定义一个带通配符*的索引模式,匹配所有日期的索引。索引模式的定义在Management - Stack Management / Index patterns。
然后进入搜索界面Analytics-Discover。选择一个索引模式,输入查询条件。如果查询条件比较简单,使用KQL,如果查询条件比较复杂,可以切换成Lucene,使用Elasticsearch的搜索语法。当然在搜索之前,通常需要通过logstash对日志做预处理,解析成多字段。
功能:Analytics-Dashboard
一个Dashboard由多个控件和图表构成,控件控制查询条件,图表展示聚合结果。
图表在Analytics-Visualize Library中定义,图表的形式可以分为表格、二维坐标图、圆形和弧形和热度图。
FileBeat
配置功能
- 指定采集日志的目录
- 为日志增加标识信息
- 输出到logstash
配置示例
- filebeat.yml
# ============================== Filebeat inputs ===============================
filebeat.inputs:
- type: log
enabled: true
# 读取日志的目录
paths:
- D:/myapp/data/logs/logger*.log
# 日志标识
tags: ["myapp"]
# 读取日志编码
encoding: 'GBK'
# 异常日志需要合并多行日志
# multiline:
# pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
# negate: true
# match: after
# ============================== Filebeat modules ==============================
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
# ---------------------------- Logstash Output ----------------------------
output.logstash:
hosts: ["localhost:5044"]
重新收集日志
- 在Kibana中删除生成的索引,Management - Stack Management / Index Management。
- 清空FileBeats日志收集记录,目录为${FileBeats_HOME}/data。
- 重新运行FileBeats。
Logstash
配置功能
- 通过json解析日志
- 输出到elasticsearch
- 定义索引的生命周期管理,索引滚动时的别名
配置示例
- config/logstash.conf
input {
beats {
port => 5044
}
}
# 日志的文本记录在message字段,解析后的Json存储在doc字段,删除源字段message
filter {
json {
source => message
target => doc
remove_field => ["message"]
}
}
output {
if "myapp" in [tags] {
elasticsearch {
hosts => ["http://localhost:9200"]
ilm_enabled => "true"
ilm_policy => "myapp_policy"
ilm_rollover_alias => "myapp"
}
}
}
- kibana配置索引生命周期策略
在Management - Stack Management / Index Lifecycle Management中配置索引生命周期策略,关闭Hot phase的Rollover,增加Delete phase,7天后删除索引。配置参考资料
参考资料
《Elasticsearch权威指南》
《Elastic Stack应用宝典》