Elasticsearch文档分片

document shared路由概念

一个 document 会被分成多片,每片都在一个 shared 中,所以说,一个 document,只能存在于一个 shared 中。当客户端创建 document 的时候,es 此时就需要决定说,这个 document 是放在这个 index 的哪个 shared 上。
这个过程,就称之为 document routing,数据路由。

路由算法

算法

shard = hash(routing) % number_of_primary_shards

说明

  • 一个 index 有 3 个primary shard,P0,P1,P2
  • 每次增删改查一个 document 的时候,都会带过来一个 routing number,默认就是这个 document 的 _id(可能是手动指定,也可能是自动生成) routing = _id,假设 _id=1。
  • 会将这个 routing 值,传入一个 hash 函数中,产出一个 routing 值的 hash 值,hash(routing) = 21。
  • 然后将 hash 函数产出的值对这个 index 的 primary shard 的数量求余数,21 % 3 = 0 就决定了,这个 document 就放在 P0 上。
  • 决定一个 document在哪个 shard 上,最重要的一个值就是 routing 值,默认是 _id,也可以手动指定,相同的 routing 值,每次过来,从 hash 函数中,产出的 hash 值一定是相同的。
  • 无论 hash 值是几,无论是什么数字,对 number_of_primary_shards 求余数,结果一定是在 0 ~ number_of_primary_shards-1 之间这个范围内的。

_id or custom routing value

默认的 routing 就是 _id,也可以在发送请求的时候,手动指定一个 routing value,比如说 put /index/_doc/id?routing=user_id

手动指定 routing value 是很有用的,可以保证说,某一类 document 一定被路由到一个 shard 上去,那么在后续进行应用级别的负载均衡,以及提升批量读取的性能的时候,是很有帮助的 primary shard 数量不可变的谜底。