-
何为document路由?
就是当增删改查一个document的时候,es应该到哪个shard中去查找
-
路由算法:
目标shard=hash(routing number)%number_of_primary_shards
routing number默认为document的_id,也可以在发送请求的时候,手动指定一个,比如:PUT /index/type/id?routing=user_id。手动指定是很有用的,可以指定document路由的shard,有利于后续进行应用级别的负载均衡等
number_of_primary_shards:primary shards的数量
举个例子:一个index有3个primary shards,document id为5,者目标shard=hash(5)%3
-
为啥primary shards数量不可以更改?
如果可以更改的话,更改前后的目标shard会不一致,造成数据的混乱及丢失
-
document增删改内部步骤(coordinate node,协调节点)
- 应用程序随机找到一个处理node处理,那么此node被称为coordinate node,协调节点
- 协调节点计算出目标primary shard后,转发到目标primary shard操作
- 目标primary shard操作完成后,自动同步到replica shards上
- 目标primary shard把结果转发给协调节点
- 协调节点把结果转发给应用程序
-
document查内部步骤(coordinate node,协调节点)
query phase阶段:
- 客户client端随机找到一个处理node处理,那么此node被称为coordinate node,协调节点
- 协调节点计算出目标primary shard后,会根据负载均衡算法(round-robin,随机轮询算法)转发到目标primary shard或者其replica shard上进行操作。如果primary shard还没有完成建立索引过程,而转发到replica shard上时,会返回找不到这个document。
- 目标primary shard或者其replica shard把相关结果转发给协调节点
fetch phase阶段:
- 协调节点构完priority queue之后(简单理解为根据分数进行排序操作),发送mget请求去所有shard上获取对应的document
- 名个shard将document返回给协调节点
- 协调节点把结果转发给客户client端
-
document写一致性
当发生增删改操作时(写操作),可以加上consistency参数,用来指定写操作条件,如 PUT index/type/id?consistency=one
其值如下:
- one:只要有一个primary shard可用,就可以执行操作
- all:必须所有的primary shard和replica shard都可用,才可以执行操作
- quorum:默认,只有当number_of_replicas>1时才生效,所有的shard中大部分是可用的,才执行操作。公式如下:
int((primary+number_of_replicas)/2)+1
当quorum不齐全的时候,wait,默认1分钟,然后timeout,100(毫秒),30s(秒),也可以加上timeout参数,如PUT index/type/id?timeout=30