# Elastic Stack
The Elastic stack, 包括 Elasticsearch、Kibana、Beats 和 Logstash (也称为 ELK Stack)。
Elaticsearch:
简称为 ES, ES 是一个开源的高扩展的分布式全文搜索引擎,是整个 E1astic stack 技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理 PB 级别的数据
Kibana:
是一个免费且开放的用户界面,能够让您对 Elasticsearch 数据进行可视化,并让您在 elastic stack 中进行导航。
您可以进行各种操作,从跟踪查询负载,到理解请求如何流经您的整个应用,都能轻松完成。
Beats:
是一个免费且开放的平台,集合了多种单一用途数据采集器。它们从成百上千或成千上万台机器和系统向 Logstash 或 Elasticsearch 发送数据
Logstash:
是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的 “存储库 " 中。

数据流走向:源数据层 (nginx,tomcat)—> 数据采集层 (filebeat)—> 数据存储层 (Elasticsearch)

数据流走向:源数据层 (nginx,tomcat)—> 数据采集 / 转换层 (Logstash)—> 数据存储层 (Elasticsearch)。

数据流走向:源数据层 (nginx,tomcat)—> 数据采集 (filebeat)–> 转换层 (Logstash)—> 数据存储层 (ElasticSearch)。

数据流走向:源数据层 (nginx,tomcat)—> 数据采集 (filebeat)—> 数据缓存层 (kafka)—> 转换层 (Logstash)—> 数 据存储层 (ElasticSearch)。

# ElasticSearch 和 solr 的选择
Lucene 的优缺点:
优点:
可以被认为是迄今为止最先进,性能最好的,功能最全的搜索引整库 (框架)。
缺点:
(1) 只能在 Java 项目中使用,并且要以 jar 包的方式直接集成在项目中;
(2) 使用很复杂,你需要深入了解检索的相关知识来创建索引和搜索索引代码;
(3) 不支持集群环境,索引数据不同步 (不支持大型项目);
(4) 扩展性差,索引库和应用所在同一个服务器,当索引数据过大时,效率逐渐降低;
值得注意的是,上述的 Lucene 框架中的缺点,Elasticsearch 全部都能解决。
Elasticsearch 是一个实时的分布式搜索和分析引擎。它可以帮助你用前所未有的速度去处理大规模数据
ES 可以用于全文搜索,结构化搜索以及分析,当然你也可以将这三者进行组合,
https://www.elastic.co/cn/customers/success-stories

Solr 是 Apache ucene 项目的开源企业搜索平台。其主要功能包括全文检索、命中标示、分面搜索、动态聚类、数据库集成,以及富文本 (如 Word、PDF) 的处理。
So1r 是高度可扩展的,并提供了分布式搜索和索引复制。So1r 是最流行的企业级搜索引擎,Solr4 还增加了 NoSQL 支持。
Elasticsearch (下面简称 "ES") 与 Solr 的比较:
(1) So1r 利用 2ookeeper 进行分布式管理,而 ES 自身带有分布式协调管理功能;(2) Solr 支持更多格式 (JSON、XML、CSV) 的数据,而 ES 仅支持 JSON 文件格式;(3) Solr 官方提供的功能更多,而 ES 本身更注重于核心功能,高级功能多有第三方插件提供;(4) So1r 在 " 传统搜索”(已有数据) 中表现好于 ES,但在处理 “实时搜索”(实时建立索引) 应用时效率明显低于 ES (5) Solr 是传统搜索应用的有力解决方案,但 Elasticsearch 更适用于新兴的实时搜索应用。
# 部署
# 单点部署 es
1 | hostnamectl set-hostname elk101 |
# 集群部署 es
1 | yum install elasticsearch-7.17.3-x86_64.rpm -y |
# 安装 kibana
1 | wget "https://artifacts.elastic.co/downloads/kibana/kibana-7.17.3-x86_64.rpm" |

# 安装 filebeat
1 | wget "https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.17.3-x86_64.rpm" |

1 | [root@elk101 ~]$ ll /var/lib/filebeat/registry/filebeat/ |
filebeat 对接 es
1 | filebeat.inputs: |

创建索引


筛选字段

新建索引模板

filebeat-indices
1 | filebeat.inputs: |

egrep -v “#|$” /etc/kibana/kibana.yml
分片:一个分片只能在一个节点。分片里面存放的是文档。多分片适用于集群情况
每个文档通过 id 标识
路由计算:hash (文档 id) % 主分片数 = 分片编号
分片数量设置后不可以修改。副本数量可以修改

机架感知:防止一个机柜故障导致副本无法访问
1 | filebeat.inputs: |

集群有红黄绿三种颜色
红色:集群的主分片未正常工作
黄色:集群的部分副本分片未正常使用
绿色:集群的主分片和副本分片可以访问
主分片和副本分片的区别
主分片可以读写
副本分片只读
推荐 10 分片 2 副本

索引模式用于在 kibana.discover 中展示数据
索引模板:用于按照模板创建一系列索引。删除索引模板不会删除索引

filebeat 收集 nginx 日志
1 | yum install nginx -y |
# 通过日志筛选某个字段
1.accesslog 直接变为 json 格式
1 | log_format log_json '{ "@timestamp": "$time_local", ' |

2. 借助 module 处理 (filebeat)
1 | filebeat.config.modules: |


3. 引入 logstash
# 收集 tomcat 日志
1 | filebeat -e -c /root/es-filebeat/nginx-module.yaml modules enable tomcat |
1 | filebeat.inputs: |

kql - kibana query language

# 收集 tomcat 错误日志
1 | filebeat.inputs: |

# 收集 es 错误日志
1 | filebeat.inputs: |

# 日志过滤
1 | filebeat.inputs: |
不包含的结果是 offset 已经过了这行,但是 output 没有这行
黑名单优先级更高
# 收集 nginx 所有日志
1 | filebeat.inputs: |
# filestream 收集日志
1 | [root@elk101 ~/es-filebeat]$ cat /var/log/nginx/access.log |
1 | filebeat.inputs: |

input 源最好 少于 4 个
实例太多可以采用:拆分实例 / 日志聚合
运行多个实例的 filebeat 需要手工指定数据路径 --path.data=/tmp/filebeat 。运行实例后,会在文件夹生成一个 lock 文件,阻止其他 fileabeat 实例使用
# 日志聚合
rsyslog 收集系统日志
1 | yum install rsyslog -y |
# input.tcp
用于路由器 / 交换机等无法安装 linux 程序场景
1 | filebeat.inputs: |
telnet 1.1.1.1 8888
nc 1.1.1.1 8888
# output.file
1 | output.file: |
# output.redis
1 | yum install epel* -y |
1 | echo 11111 | nc 192.168.13.101 9000 |
# Logstash

1 | wget "https://artifacts.elastic.co/downloads/logstash/logstash-7.17.3-x86_64.rpm" |

# stdin && stdout
1 | input { |
# input - file
1 | input { |
# input - tcp
1 | input { |

# input - http
1 | input { |

# input - redis
filebeat 配合 logstash 使用

1 | filebeat.inputs: |
logstash 从 redis 取数据的时候是使用的 pop 方式,读完就删
# filebeat — logstash
1 | logstash: |
# output - redis
1 | input { |
# output - file
1 | input { |
# output - es
1 | input { |

索引模板可以自定义
# if
1 | input { |

# 多实例 logstash
1 | logstash -f xxx.conf --path.data /tmp/haha |
# filter
# gork
Grok 是将非结构化日志数据解析为结构化和可查询的好方法
基于正则匹配任意文本格式,尤其是解析任意文本并对其进行结构化。
1 | input { |
1 | input { |
remove_field 移除一些字段
1 | input { |
add_field
1 | input { |


# date
1 | filebeat.inputs: |

# geoip
1 | input { |
# useragent
1 | { "@timestamp": "20/Feb/2024:17:01:44 +0800", "remote_addr": "192.168.13.1", "referer": "-", "request": "GET /jajaj HTTP/1.1", "status": 404, "bytes": 153, "http_user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:122.0) Gecko/20100101 Firefox/122.0", "x_forwarded": "-", "request_time": "0.000" } |
# mutate
1 | input { |
1 | input { |

# kibana
试用 kibana 样例

# dashborad
# pv
page view 页面访问量,在一定的统计周期内,用户每次刷新网页就会被计算
1. 创建 Visualize 库
创建基于聚合 -> 新建指标 -> 选择索引

# IP

# 带宽

# 统计访问页面

# dashboard




# 二进制部署
# 单节点 elasticsearch
1 | yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel.x86_64 -y |
1 | jps # 查看java相关进程信息 |
1 | [Unit] |
# 集群 es
1 | vim /root/elasticsearch-7.17.3/config/elasticsearch.yml |
# kibana
1 | wget "https://artifacts.elastic.co/downloads/kibana/kibana-7.17.3-linux-x86_64.tar.gz" |
1 | cat /root/kibana-7.17.3-linux-x86_64/bin/kibana.sh |
1 | [Unit] |
# logstash
1 | wget https://artifacts.elastic.co/downloads/logstash/logstash-7.17.3-linux-x86_64.tar.gz |
# filebeat
1 | wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.17.3-linux-x86_64.tar.gz |
# es-head
1 |
|
# ES rest 风格 api
1 | json 语法 |
1 | es |
# 索引




1 | # 查询索引 |
1 | # 创建mapping,将字段指定为自定义类型 |
# 分词器
1 | GET http://192.168.13.101:9200/_analyze |
1 | # 自定义分词器 |

集群的每个节点都需要安装分词器
1 | { |
1 | # 查看索引模板 |
# DSL
Elasticsearch 提供了基于 JSON 的完整 Query DSL (Domain Specific Language) 来定义查询。
# 全文类型检索
1 | # match查询 |
# 完全匹配
1 |
|
# 全量查询
1 | POST http://10.0.0.103:9200/oldboyedu-shopping/_search |
# 分页查询
1 |
|
1 | POST http://192.168.13.101:9200/shopping/_search |
# 查询包含指定字段文档
1 | POST http://192.168.13.101:9200/shopping/_search |
# 语法高亮
1 |
|
# 字段排序
1 | POST http://192.168.13.101:9200/shopping/_search |
# 多条件查询
1 | POST http://10.0.0.103:9200/oldboyedu-shopping/_search |
# 范围查询
1 | POST http: //10.0.0.103:9200/oldboyedu-shopping/_search |
# 精确匹配
1 | POST http://10.0.0.103:9200/oldboyedu-shopping/_search |
# 多词搜索
1 | POST http: //10.0.0.103:9200/oldboyedu-shopping/_search |
# 权重
1 | POST http: //10.0.0.103:9200/oldboyedu-shopping/_search |
# 聚合
1 | POST http: //10.0.0.103:9200/oldboyedu-shopping/_search # 统计每个品牌的数量。 |
# es 集群迁移
1 | wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.23.tar.gz |
1 | # 同集群迁移 |
# logstash 实现集群迁移
1 | input { |
# es 健康 api
1 | # 集群状态 |
# 集群更新设置
1 | 如果您使用多种方法配置相同的设置,Elasticsearch会按以下优先顺序应用这些设置 |
# 集群 state
1 | GET http://192.168.13.101:9200/_cluster/state |
# 集群 stats 统计信息
1 | GET http://192.168.13.101:9200/_cluster/stats |
# 集群分片分配情况
1 | 集群分配解释API的目的是为集群中的分片分配提供解释。 |
# reroute api
1 | reroute 命令允许手动更改集群中各个分片的分配。例如,可以将分片从一个节点显式移动到另一个节点,可以取消分配,并且可以将未分 |
# 集群角色
1 | node.role |





# 乐观锁
1 | POST http://1.1.1.1:9200/index_exp/_doc/10001/?version=3&versin_type=external |
# tls
1 | bin/elasticsearch-certutil ca |
https://www.jianshu.com/p/d13b6074b545
注意文件所属着和所属组,证书一定要在 config 下面

1 | [root@elk101 ~/elasticsearch-7.17.3]$ vim /root/kibana-7.17.3-linux-x86_64/config/kibana.yml |

# RBAC


1 | input { |
1 | filebeat.inputs: |
# kafka
filebeat 一般在靠近数据源测,易扩展
为了解决 logstash 的性能瓶颈,有三种解决方案
垂直扩容 - 升级单节点硬件设备 价钱昂贵,可能存在单点故障,容易达到硬件上限
水平扩容 - 加机器 - 缺点:高峰时期服务器利用率低
增加 MQ
消息队列:
使用消息队列解耦,缓冲数据,数据削峰
消息队列是在消息传输过程中保存消息的容器,多用于分布式系统之间进行通信。
劣势:
可靠性降低
系统复杂度提高


# 工作模式
1 | 点对点模式: |


# 部署 kafka
1 | # 部署zookeerper集群 |
# 基本概念
1 | broker server: |

# 集群
1 | mkdir /data/kakfa |
# kafka topic
1 | kafka-topics.sh --bootstrap-server 192.168.13.101:9092 --list |
1 | # 修改副本数量 |
# 消费者组
1 | kafka-consumer-groups.sh --bootstrap-server 192.168.13.101:9092 --list |
# 同一个集群部署不同版本 kafka
1 | wget "https://archive.apache.org/dist/kafka/0.8.0/kafka_2.8.0-0.8.0.tar.gz" --no-check-certificate |
# znode 基础操作
1 | # 查看 / 下所有子znode列表 |
# offset
kafka 最早 offset 放在 zk 上,后来放在了 broker 上,一个叫做_consumer_Offset 的 topic 中
早器 <0.9 后期> 0.9
当消费者组数量增多时,对 zk 写入有较大压力
1 | < 0.9 |
# kafka 监控组件 eagle
1 | kafka-server-stop.sh |
# kafka 压测
1 | [root@elk101 /tmp/kafka-logs]$ mkdir /tmp/kafka-test |