分布式专题-11、ELK-ES
1. 什么是 elasticsearch
elasticsearch 是一个开源的分布式搜索引擎,可以用来实现搜索、日志统计、分析、系统监控等功能,底层是基于 lucene 来实现的。
Lucene 是一个 Java 语言的搜索引擎类库,是 Apache 公司的顶级项目。
1.1. 特性
- 第一、采用 Master-slave 架构,实现数据的分片和备份
- 第二、使用 Java 编写,并对 Lucene 进行封装,隐藏了 Lucene 的复杂性
- 第三、能胜任上百个服务节点的扩展,并支持 PB 级别的结构化或者非结构化数据
- 第四、ES 提供的 Restful API,不仅简化了 ES 的操作,还支持任何语言的客户端提供 API 接口,另外 Restful API 的风格还实现了 CURD 操作、创建索引,删除索引等功能。
1.2. 什么是 elastic stack(ELK)
- 是以 elasticsearch 为核心的技术栈,包括 beats、Logstash、kibana、elasticsearch
2. 倒排索引
倒排索引的概念是基于 MySQL 这样的正向索引而言的。
2.1. 正向索引
那么什么是正向索引呢?例如给下表(tb_goods)中的 id 创建索引:
如果是根据 id 查询,那么直接走索引,查询速度非常快。
但如果是基于 title 做模糊查询,只能是逐行扫描数据,流程如下:
1)用户搜索数据,条件是 title 符合 "%手机%"
2)逐行获取数据,比如 id 为 1 的数据
3)判断数据中的 title 是否符合用户搜索条件
4)如果符合则放入结果集,不符合则丢弃。回到步骤 1
逐行扫描,也就是全表扫描,随着数据量增加,其查询效率也会越来越低。当数据量达到数百万时,就是一场灾难。
2.2. 倒排索引
倒排索引中有两个非常重要的概念:
- 文档(
Document
):用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息 - 词条(
Term
):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。例如:我是中国人,就可以分为:我、是、中国人、中国、国人这样的几个词条
2.2.1. 创建倒排索引
创建倒排索引 是对正向索引的一种特殊处理,流程如下:
❕ ^km4l5x
- 将每一个文档的数据利用算法分词,得到一个个词条
- 创建表,每行数据包括词条、词条所在文档 id、位置等信息
- 因为词条唯一性,可以给词条创建索引,例如hash 表结构索引
2.2.2. 使用倒排索引
倒排索引的 搜索流程 如下(以搜索 “ 华为手机 “ 为例):
1)用户输入条件 "华为手机"
进行搜索。
2)对用户输入内容 分词,得到词条:华为
、手机
。
3)拿着词条在倒排索引中查找,可以得到包含词条的文档 id:1、2、3。
4)拿着文档 id 到正向索引中查找具体文档。
如图:
2.2.3. 为什么快
虽然要先查询倒排索引,再查询正向索引,但是无论是词条、还是文档 id 都建立了索引,查询速度非常快!无需全表扫描。
2.3. 正向和倒排
那么为什么一个叫做正向索引,一个叫做倒排索引呢?
- 正向索引 是最传统的,根据 id 索引的方式。但根据词条查询时,必须先逐条获取每个文档,然后判断文档中是否包含所需要的词条,是 根据文档找词条的过程。
- 而 倒排索引 则相反,是先找到用户要搜索的词条,根据词条得到保护词条的文档的 id,然后根据 id 获取文档。是 根据词条找文档的过程。
正向索引:
- 优点:
- 可以给多个字段创建索引
- 根据索引字段搜索、排序速度非常快
- 缺点:
- 根据非索引字段,或者索引字段中的部分词条查找时,只能全表扫描。
倒排索引:
❕ ^3zq0wh
- 优点:
- 根据词条搜索、模糊搜索时,速度非常快
- 缺点:
- 只能给词条创建索引,而不是字段
- 无法根据字段做排序
3. 相关概念
3.1. 文档和字段
elasticsearch 是面向**文档(Document)存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为 json 格式后存储在 elasticsearch 中:
而 Json 文档中往往包含很多的 字段(Field),类似于数据库中的列。
3.2. 索引和映射
索引(Index),就是相同类型的文档的集合。
例如:
- 所有用户文档,就可以组织在一起,称为用户的索引;
- 所有商品的文档,可以组织在一起,称为商品的索引;
- 所有订单的文档,可以组织在一起,称为订单的索引;
因此,我们可以把索引当做是数据库中的表。
数据库的表会有约束信息,用来定义表的结构、字段的名称、类型等信息。因此,索引库中就有 映射(mapping),是索引中文档的字段约束信息,类似表的结构约束。
3.3. MySQL 与 Elasticsearch
我们统一的把 mysql 与 elasticsearch 的概念做一下对比:
是不是说,我们学习了 elasticsearch 就不再需要 mysql 了呢?
并不是如此,两者各自有自己的擅长支出:
- Mysql:擅长事务类型操作,可以确保数据的安全和一致性
- Elasticsearch:擅长海量数据的搜索、分析、计算
因此在企业中,往往是两者结合使用:
- 对安全性要求较高的写操作,使用 mysql 实现
- 对查询性能要求较高的搜索需求,使用 elasticsearch 实现
- 两者再基于某种方式,实现数据的同步,保证一致性
MongoDB 与Elasticsearcharch
https://www.cnblogs.com/xuzhujack/p/15798610.html
4. 使用方法
5. ES 集群⭐️🔴
5.1. 选主算法
https://juejin.cn/post/7051761366591340574
在 7.x 版本前后,Elasticsearch 采用了不同的选主算法。7.x 之前基于 Bully 算法选主,之后基于 Raft 算法。
6. 面试题
6.1. 谈谈对 ES 的理解
ES 全称是 Elastic Search,它是一个建立在全文搜索引擎库 Lucene 基础上的开源搜索和分析引擎。ES 它本身具 有分布式存储、检索速度快的特性。所以,我们经常会用它来实现全文检索的功能。 Elastic 官网对 ES 的定义已经不再是 ElasticSearch 这一个组件,而是指 Elastic Stack 生态。
而 Elastic Stack 主要包括 ElasticSearch、Logstash、Kibana,这三个经典组合也称之为 ELK。ElasticSearch 主 要用来做数据存储、Logstash 主要用来做数据采集,Kibana 主要用来做数据可视化展示。
6.2. 为什么这么快⭐️🔴
1、ES 是基于 Lucene 开发的一个全文搜索引擎,一方面 Lucene 是擅长管理大量的索引数据;另外一方面,它会对数据进行分词以后再保存索引。这样,能够去提升数据的检索效率。
2、ES 采用了倒排索引。所谓倒排索引就是通过属性值来确定数据记录位置的索引,从而避免全表扫描的问题。
3、ES 存储数据采用了分片机制。
4、ES 扩展性很好,支持通过水平扩展的方式来动态增加节点,从而提升 ES 的处理性能。能够支持上百台服务器节点的扩展,并且支持 TB 级别的结构化数据和非结构化数据
5、ES 内部提供的数据汇总和索引生命周期管理的功能,更加便于高效地存储和检索数据
7. 实战经验
- es 里面复杂的关联查询尽量别用,一旦用了性能都不太好。最好是先在 Java 系统 里就完成关联,将关联好的数据直接写入 ES 中
- 避免一些太复杂的操作,比如 join/nested/parent-child 搜索,不然容易出现性 能问题。
- 避免深分页查询,ES 集群的分页查询支持 from 和 size 参数,查询的时候,每个 分片必须构造一个长度为 from+size 的优先队列,然后回传到网关节点,网关节 点再对这些优先队列进行排序找到正确的 size 文档。当 from 足够大的时候,就算 不发生 OOM,也会影响到 CPU 和带宽等,从而影响到整个集群的性能。
8. 参考与感谢
8.1. 黑马
8.1.1. 视频
8.1.2. 资料
1 |
|