原文网址:ElasticSearch--分片的路由原理_IT利刃出鞘的博客-CSDN博客
本文介绍往ElasticSearch的索引中写入一条数据时,是如何路由到分片中的。
粉丝福利:有很多粉丝私信问我有没有Java的面试及PDF书籍等资料,我整理了一下,包含:真实面试题汇总、简历模板、PDF书籍、PPT模板等。这些是我自己也在用的资料,面试题是面试官问到我的问题的整理,其他资料也是我自用的,真正实用、靠谱。资料可以从这里免费获取:资料地址
索引一条数据(一个文档)时,这条数据会被存储到一个主分片中。Elasticsearch 如何知道一条应该存放到哪个分片中呢?
首先这肯定不会是随机的,否则将来要获取文档的时候我们就不知道从何处寻找了。实际上,这个过程是根据下面这个公式决定的:
shard = hash(routing) % number_of_primary_shards
Routing 是一个可变值,默认是文档的_id,也可以设置成一个自定义的值。Routing 通过 Hash 函数生成一个数字,然后这个数字再除以 number_of_primary_shards (主分片的数量)后得到余数。这个余数在 0 到 number_of_primary_shards-1 之间,它就是我们所寻求的文档所在分片的位置。
这就是为什么创建好索引后就无法改变分片数量。因为如果数量变化了,所有之前路由的值都会无效,文档也再也找不到了。
在 ES 集群中,每个节点通过上面的计算公式都知道集群中的文档的存放位置,所以每个节点都有处理读写请求的能力。在一个写请求被发送到某个节点后,该节点即为协调节点,协调节点会根据路由公式计算出需要写到哪个分片上,再将请求转发到该分片的主分片节点上。
ES 为了提高写入的能力这个过程是并发写的,同时为了解决并发写的过程中数据冲突的问题,ES 通过乐观锁的方式控制,每个文档都有一个 _version (版本)号,当文档被修改时版本号递增。一旦所有的副本分片都报告写成功才会向协调节点报告成功,协调节点向客户端报告成功。

如上图所示,每个节点有5个分片,每个分片都在另一个节点上有一个副本。