【HBZ分享】ElasticSearch读写数据的原理 以及 路由策略原理-【短而精悍,易于理解】

ElasticSearch分布式工作原理,是如何进行读写数据的

1. 简单介绍ES
首先es是分布式的,只要我们启动相应数量的节点,并且这些节点分配相同的cluster.name,那他们就对属于同一个集群了,创建索引的时候,只需要指定对应的主分片数 和 副分片数量即可,剩下的交给es自己去做就可以了。但我们也需要知道es的原理

2. 节点交互原理:
【HBZ分享】ElasticSearch读写数据的原理 以及 路由策略原理-【短而精悍,易于理解】_第1张图片
请先注意:master节点并不是负责写操作的,而负责写操作的是【主分片】,即P0 或 P1。这一点和MYSQL是有区别的,MYSQL的master是负责写操作的。也就是说在ES中路由策略选中的主分片落在哪个节点上,那么该文档就会在该节点写入,并同步到对应的副分片。路由策略原理请看后面的ES路由原理

从上图来看,主分片P0,P1分别落在NODE1 和 NODE3上,这也就说明文档的写入一定是从NODE1 或 NODE3开始写入的,绝对不会从NODE2写入,因为NODE2这个节点并不存在主分片。那么究竟是从P0 还是 P1写入,这个要看路由策略最终会选择哪个主分片。

我们举一个实际例子:现在我们向NODE1 发送了新增文档请求,而路由策略最终选择了主分片-P0,那么在这整个过程ES都做了哪些操作呢?请看下图
【HBZ分享】ElasticSearch读写数据的原理 以及 路由策略原理-【短而精悍,易于理解】_第2张图片
1. 发送请求到NODE1上
2. 节点通过文档的路由算法确定该文档应属于【主分片-P0】, 而P0在NODE3节点上,因此该请求会转发到NODE3上面
3. 当P0主分片写入成功后,请求会转发到NODE1, NODE2节点中的R0-副分片上,因为R0是P0的副分片。一旦副分片也添加完毕并报告成功,此时NODE3会向NODE1报告成功,最终NODE1会向客户端报告成功,此次文档添加彻底完毕。

3. 读取文档
(1). 客户端向NODE1发送读取文档请求
(2). 在读取请求时,NODE1会通过轮询所有副本分片的方式来达到负载均衡,因为读是可以从副分片读的,所以当读取压力很大时,就可以增多副分片来实现优化减压。


ES文档的路由原理(就是一个公式)

1. 前言
当我们添加一个文档时,该文档应该存储到哪个主分片中,这时ES文档的路由就派上用场了。

2. 路由算法
首先存储到哪个主分片,这肯定不是随机的,是根据下面的公式

  • shard = hash(routing) % 主分片个数*

routing: 是个可变值,默认是文档的id,当然你也可以设置自定义值。routing通过hash函数,生成一个数字,然后和主分片个数取模,最终得到该文档应该存储到哪个主分片

至此我们应该知道了为什么创建索引的时候,确定了主分片数量后就永远不能改变主分片的数量了。就是因为路由算法。如果可以任意改变主分片的个数,那么同一个id对不同个数的主分片hash取模,获取的结果必然不同,造成的后果就是旧的数据就会出现存在但是查不到的情况。所以主分片个数一旦设定完就不能更改。

你可能感兴趣的:(elasticsearch,搜索引擎,big,data)