-
探索Elasticsearch的核心个问题
Elasticsearch
- Elasticsearch 索引的精髓:一切设计都是为了提高搜索的性能。
1、分片(Shards)
- 分片背景 :
- 一个索引可以存储超出单个节点硬件限制的数据。比如,一个具有 10 亿文档数据的索引占据 1TB 的磁盘空间,而任一节点都可能没有这样大的磁盘空间。或者单个节点处理搜索请求,响应太慢。
- 为此目的,Elasticsearch将索引划分成多份,每一份就称之为
分片
。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上
- 解决方式 :
- 1、水平分割 / 扩展你的内容容量。
- 2、在分片之上进行分布式的、并行的操作,进而提高性能/吞吐量。
- 注意:
Elasticsearch 7.xx版本之后,创建索引库的分片数默认为1片
2、副本(Replicas)
- 副本背景 :
- 在一个网络 / 云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。
- 为此目的,Elasticsearch 允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片(副本)。
- 两个重要原因 :
- 1、在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意:到复制分片从不与原/主要(original/primary)分片置于同一节点上是非常重要的。
- 2、扩展你的搜索量/吞吐量,因为搜索可以在所有的副本上并行运行。
3、路由计算
- 问题:当索引一个文档的时候,文档会被存储到一个主分片中。 Elasticsearch 如何知道一个文档应该存放到哪个分片中呢?当我们创建文档时,它如何决定这个文档应当被存储在分片1 还是分片 2 中呢 ?
- 解答:根据公式计算分片位置
shard = hash(routing)%number_of_primary_shards
- routing 是一个可变值,默认是文档的 _id ,也可以设置成一个自定义的值。
- routing 通过hash 函数生成一个数字,然后这个数字再除以 number_of_primary_shards (主分片的数量)后得到余数 。
- 这个分布在 0 到 number_of_primary_shards-1 之间的余数,就是我们所寻求的文档所在分片的位置。
4、主分片数量问题
- 问题:在创建索引的时候就确定好主分片的数量 并且永远不会改变这个数量,为什么?
- 解答:
- 1、因为如果数量变化了,那么所有之前路由的值都会无效,文档也再也找不到了。
- 2、所有的文档 API( get 、 index 、 delete 、 bulk 、 update 以及 mget )都接受一个叫做 routing 的路由参数 ,通过这个参数我们可以自定义文档到分片的映射。
- 3、一个自定义的路由参数可以用来确保所有相关的文档(
例如所有属于同一个用户的文档
)都被存储到同一个分片中
5、Es读/写数据的流程
5.1、Es写数据的流程
- 首先明确:
新建
、索引
和删除
请求都是写 操作, 必须在主分片上面完成之后才能被复制到相关的副本分片

- 新建,索引和删除文档所需要的步骤顺序:
- 1、 客户端向 Node 1 发送新建、索引或者删除请求。
- 2、 节点使用文档的 _id 确定文档属于分片 0 。请求会被转发到Node 3,因为分片0的主分片目前被分配在Node 3 上。
- 3、 Node 3 在主分片上面执行请求。如果成功了,它将请求并行转发到 Node 1 和 Node 2 的副本分片上。一旦所有的副本分片都报告成功, Node 3 将向协调节点报告成功,协调节点向客户端报告成功
5.2、Es写数据的一致性问题(consistency)
- 在默认设置下,即使仅试图执行一个_写_操作之前,主分片都会要求 必须要有
规定数量
(quorum)(或者换种说法,也即必须要有大多数)的分片副本处于活跃可用状态,才会去执行_写_操作(其中分片副本可以是主分片或者副本分片)。 - 这是为了避免在发生网络分区故障(network partition)的时候进行_写_操作,进而导致数据不一致
规定数量
计算公式:int( (primary + number_of_replicas) / 2 ) + 1
- consistency 参数的值可以设为 one (只要主分片状态 ok 就允许执行_写_操作),all(必须要主分片和所有副本分片的状态没问题才允许执行_写_操作), 或quorum 。默认值为 quorum , 即大多数的分片副本状态没问题就允许执行_写_操作。
规定数量
的计算公式中 number_of_replicas 指的是在索引设置中的设定副本分片数,而不是指当前处理活动状态的副本分片数。- 如果你的索引设置中指定了当前索引拥有三个副本分片,那规定数量的计算结果计算公式应该为如下:
int( (primary + 3 replicas) / 2 ) + 1 = 3
(1+3) (4/2) (2+1)=3至少需要3个节点才能正常写操作
如果此时你只启动两个节点,那么处于活跃状态的分片副本数量就达不到规定数量,也因此您将无法索引和删除任何文档。
-
相关阅读:
2022 CLion 中的Cygwin 配置(最全,最良心版)
java程序通过监听端口获取电力104报文并解析104报文
Mybatis generator实战:自动生成POJO类完整解决方案
计算机毕业设计(附源码)python在线学习系统
vue或webpack加载highcharts与highcharts-3d
Android学习-下拉刷新、轮播图
Kubernetes是什么?以及基础功能介绍(基础之精通)1
地表温度LST计算教程
动态规划三:区间动态规划(19182+11078+洛谷P4170+力扣877)
如何处理系统漏洞
-
原文地址:https://blog.csdn.net/pymxb1991/article/details/126157725