Teng's blog Teng's blog
首页
Java
H5前端
GitHub (opens new window)
首页
Java
H5前端
GitHub (opens new window)
  • 认知

  • 入门

  • 环境

  • 进阶

    • 核心概念
    • 系统架构
    • 单节点集群
    • 故障转移
    • 水平扩容
    • 应对故障
    • 路由计算
      • 计算公式
    • 分片控制
    • 写操作流程
    • 数据读流程
    • 更新操作流程
    • 批量操作流程
    • 倒排索引
    • 文档搜索
    • 文档刷新-刷写-合并
    • 文档分析-分词器
    • 文档控制
    • 文档展示-kibana
  • 框架集成

  • 优化

  • 面试题

  • Database-Elasticsearch
  • 进阶
Shetengteng
2022-01-29

路由计算

# 计算公式

当索引一个文档的时候,文档会被存储到一个主分片中。 Elasticsearch 如何知道一个文档应该存放到哪个分片中呢?当创建文档时,它如何决定这个文档应当被存储在分片 1 还是分片 2 中呢?

这个过程是根据下面这个公式决定的:

shard = hash(routing) % number_of_primary_shards
1

routing 是一个可变值,默认是文档的 _id,可设置成一个自定义的值 routing 通过hash 函数生成一个数字,然后这个数字再除以 number_of_primary_shards (主分片的数量)后得到余数 。这个分布在 0 到 number_of_primary_shards-1 之间的余数,就是文档所在分片的位置

所有的文档API ( get , index, delete, bulk , update,mget )都接受一个叫做routing 的路由参数,通过这个参数可以自定义文档到分片的映射;一个自定义的路由参数可用来确保所有相关的文档(如所有属于同一个用户的文档)都被存储到同一个分片中

为什么创建索引时确定好主分片的数量并且不能改变主分片数量?

如果数量变化了,那么所有之前路由的值都会无效,文档也再也找不到了

Last Updated: 2022/04/10, 13:57:31
应对故障
分片控制

← 应对故障 分片控制→

Theme by Vdoing | Copyright © 2021-2022 Shetengteng | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式