ES之文档存储

84 阅读2分钟

前言

  • 一个索引数据量太大,分片存储在多个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就都有了。