前言
- 一个索引数据量太大,分片存储在多个es节点上
- 一个文档只会存储在一个主分片上
一、数据路由
如上所述,一个文档最终落在哪一个主分片上,就是数据路由要解决的问题。
1 路由算法
shard = hash(routing) % 主分片数量 步骤:
- 对一个文档进行crud时,会带一个路由值 routing number。默认为文档_id
- 存储1号document,对路由值进行hash计算为2,则存放在2%3=2,即P2分片上。相同的路由值,对其进行哈希计算,其结果也一定是相同的。
2 路由值 routing number
路由值默认为文档id,也可以手动指定
PUT /test_index/_doc/15?routing=num
{
"num": 0,
"tags": []
}
优点:可以定制一类文档数据存储到一个分片中 缺点:设计不好,会造成数据倾斜
二、文档更新内部机制
更新:增删改
- 客户端选择一个node发送请求过去,这个node就是coordinating node(协调节点)
- coordinating node,对document进行路由,将请求转发给对应的node(有primary shard)
- 实际的node上的primary shard处理请求,然后将数据同步到replica node。
- coordinating node,如果发现primary node和所有replica node都搞定之后,就返回响应结果给客户端。
三、文档查询内部机制
1、客户端发送请求到任意一个node,成为coordinate node
2、coordinate node对document进行路由,将请求转发到对应的node,此时会使用round-robin随机轮询算法,在primary shard以及其所有replica中随机选择一个,让读请求负载均衡
3、接收请求的node返回document给coordinate node
4、coordinate node返回document给客户端
5、特殊情况:document如果还在建立索引过程中,可能只有primary shard有,任何一个replica shard都没有,此时可能会导致无法读取到document,但是document完成索引建立之后,primary shard和replica shard就都有了。