暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

31_Elasticsearch原理_数据分片

lin在路上 2020-05-23
310

了解了倒排索引之后,这边来讲下文档怎么存储到分片上

大纲

  • 文档会存储在具体的某个主分片和副本分片上

    • 例如:文档1,会存储在P0和R0分片上

  • 文档和分片的映射算法

    • 确保文档能均匀分布在所用分片上

      • 随机/Round Robin。当需要查询文档1,但分片数很多,需要多次查询才可以查到文档1

    • 潜在算法

      • 维护文档到分片的映射关系,当文档数据量大的时候,维护成本高

      • 实时计算(✔),通过文档1,自动算出需要去那个分片上获取文档。

      • 充分利用硬件资源,避免部分机器空闲,部分机器繁忙

文档到分片的路由算法

  • shard = hash(_routing) % number_of_primary_shards

    • hash算法确保文档均匀分散到分片中

    • 默认的_routing值是文档id

    • 可以自行指定routing数值,例如相同国家的商品,都分配到指定的shard

    • 设置Index Settings后,Primary数将不能随意修改,否则将导致路由算法紊乱

插入文档指定_routing

 PUT my_index
 {
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
 }
 #创建主分片为3的索引
 
 PUT my_index/_doc/1?routing=1
 {
  "xm":"张三",
  "xb":"男"
 }
 PUT my_index/_doc/2?routing=1
 {
  "xm":"张三",
  "xb":"男"
 }
 PUT my_index/_doc/3?routing=1
 {
  "xm":"张三",
  "xb":"男"
 }
 #创建3个文档,id从1~3,routing都为1
 
 通过Cerebro查看各主分片shard stats可以发现3个文档都在编号为2的主节点上
复制

文档增删改的处理流程

增删改的请求一定作用在主分片上

  • 客户端发起一个PUT请求,该请求将被协调节点(coordinating node)接受,并根据路由信息计算该文档存储在哪个主分片

  • 假设通过计算发现该文档将被存储在node2上的P0节点,则该请求将被转发到node2节点

  • P0根据请求信息进行操作(注意修改需要先删除再添加),操作完毕后将信息同步到自己的副本节点R0上

  • P0和R0将通知协调节点(coordinating node),任务完成情况

  • 协调节点(coordinating node)响应客户端最终处理情况

文档查的请求流程

注意:document如果还在建立索引过程中,可能只有primary shard有,任何一个replica shard都没有,此时请求如果作用到replica shard上可能会导致无法读取到document信息。但是document完成索引建立之后,primary shard和replica shard就都有了

  • 客户端发送读请求到协调节点(coordinating node)

  • 协调节点(coordinating node)根据请求信息对document进行路由计算,将请求转发到对应的节点。此时会使用随机轮询(round-robin)算法,在主节点及其对应的副本中随机选择一个,让读请求负载均衡

  • 接受到请求的节点将处理结果返回给协调节点(coordinating node)

  • 协调节点(coordinating node)将最终的结果反馈给客户



文章转载自lin在路上,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论