路由
每次创建一个document的时候,这个document会放到那个shard哩?
路由算法: shard=hash(routing)%number_of_primary_shards
解释:每次增删改查一个document的时候,都会带过来一个routing number,这个值默认就是_id,即 routing=_id
算出这个routing的hansh值,然后和primary shard的总数求余,算出的值,就是这个document的存放的位置(存放至某个primay shard)。
这个routing的值,默认是_id,但我们也可以手动指定
例如发送求的时候
PUT /index/type/id?routing=user_id
primay shard数量不可变的原因就是因为这个路由算法
hash(routing)%number_of_primary_shards 一般是不等于 hash(routing)%(number_of_primary_shards+n)
增删改
增删改的请求只能由primary shard处理的
增加一个document举例
- 客户端会选择一个node(节点)发送请求,这个node就是coordinate node(协调节点)
- coordinate node,对document进行路由(假设计算出的prmary shard 在第n个node),将请求转发到对应的node的primary shard上处理(假设为node A)
- node A 上的primary shard 处理这个请求,然后再将数据同步到replica shard
- coordinae node,如果发现primary node 和所有replica node都搞定之后,就返回响应结果给客户端
查询
- 客户端发送请求到任意一个node,这个node就是coordinatenode
- coordinate node对document进行路由,将请求转发到对应的node,此时会使用round-robin随机轮询算法,在paimary shard以及所有replica中随机选择一个,让读请求负载均衡
- 接收到请求的node返回document给coordinate node
- coordinate node返回document给客户端
特殊情况:document如果还在建立索引的过程中,可能只有primary shard有此document,任何一个replica都没有,此时会导致无法读取document(返回未找到),但是document完成索引后,primary shard和replica就都有了