所有分类
  • 所有分类
  • 未分类

ES-分片的路由原理

简介

本文介绍往ElasticSearch的索引中写入一条数据时,是如何路由到分片中的。

原理概述

索引一条数据(一个文档)时,这条数据会被存储到一个主分片中。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个分片,每个分片都在另一个节点上有一个副本。 

  1. 客户端向节点1(协调节点)发送写请求,通过路由计算公式得到值为 1,则当前数据应被写到主分片(1(主)) 上。
  2. 节点1将请求转发到主分片(1(主))所在的节点(节点2),节点2接受请求并写入到磁盘。
  3. 并发将数据复制到副本分片(1(副))上,其中通过乐观并发控制数据的冲突。
  4. 一旦所有的副本分片都报告成功,则节点2将向协调节点(节点1)报告成功
  5. 协调节点(节点1)向客户端报告成功。

0

评论0

请先

显示验证码
没有账号?注册  忘记密码?

社交账号快速登录