当前位置: 首页 > news >正文

Elasticsearch 的 Routing 策略详解

Elasticsearch 的 Routing 策略详解:原理、类型与最佳实践

一、背景:为什么需要 Routing

在 Elasticsearch 中,索引(Index)是一个逻辑概念,底层由多个分片(Shard)组成,每个分片是一个独立的 Lucene 引擎,存储和索引部分数据。
当我们写入文档时,ES 需要通过某种策略决定它应该落在哪个
主分片(Primary Shard)
。这个决定过程,就是 Routing

Routing 的意义:

  • 数据分布:避免所有数据集中到单个分片导致热点,确保负载均衡。
  • 查询性能:让相关数据落在同一分片,减少跨分片查询。
  • 扩展能力:通过合理 routing,让集群更易于水平扩展。

二、Routing 的核心原理

ES 按如下公式将文档映射到分片:

shard_num = hash(routing_value) % number_of_primary_shards
  • routing_value:路由字段的值。
    • 默认情况下是文档的 _id
    • 可以通过 API 显式指定 (?routing=xxx)。
  • hash():ES 使用 Murmur3 哈希函数,将 routing 值转换成一个整数。
  • number_of_primary_shards:该索引的主分片数(创建时设定,不能更改)。

📌 路由一致性:相同 routing 值的文档一定会落到同一个主分片。


三、Routing 策略类型

1. 默认 Routing(基于 _id 哈希)

  • 不传 routing 参数,ES 会使用文档 _id 作为 routing 值。
  • 数据分布较为均匀(哈希分布),写入压力较均衡。
  • 缺点:查询一个业务字段(如用户 ID)时,数据可能分散在多个分片,导致跨分片查询。

适用场景

  • 单条文档 CRUD 操作。
  • 没有明显的数据分组需求。

2. 自定义 Routing 值

  • 写入或查询时显式指定 routing 参数,将同一类数据(如 user_id)写入同一个分片。
  • 优点:相同 routing 值的数据一定在同一分片,单分片查询性能高
  • 缺点:某个 routing 值过于热门会造成热点分片。
POST /my_index/_doc?routing=user123
{"user": "user123","msg": "hello"
}GET /my_index/_search?routing=user123
{"query": {"match": {"user": "user123"}}
}

适用场景

  • 多租户系统:routing=tenant_id。
  • 用户数据查询:routing=user_id。

3. 父子文档 Routing

在 ES 中,如果使用 join(parent-child) 关系:

  • 父文档和子文档必须设置相同 routing 值。
  • 保证它们存储在同一分片,否则 join 查询会跨分片。

适用场景

  • 有强关联的文档,需要 join 查询。
  • 电商商品 + 商品评论模型(商品ID为 routing)。

4. 多 Routing 值查询

查询时可以指定多个 routing 值,ES 只会命中这些 routing 值对应的分片:

GET /my_index/_search?routing=user123,user456
{"query": {"match_all": {}}
}

适用场景

  • 批量查询特定用户/租户数据。
  • 限定跨分片的范围,不扫全分片。

5. 多索引 + 独立 Routing

  • 在多索引查询中,每个索引可以有自己的 routing 规则。
  • ES 会分别计算每个索引对应的分片范围,然后查询合并结果。

四、Routing 策略的选择建议

选择 routing 策略时的关键因素

  1. 查询模式:是随机单条查询,还是基于某个业务字段批量查?
  2. 数据分布:是否可能产生热点分片?
  3. 扩展性:主分片数一旦设置,不能修改;routing 分布要提前规划。
  4. 关联性:是否需要保证某些数据一定在同一分片(父子文档、业务关联)。
场景推荐 routing说明
单条文档 CRUD默认 _id负载均衡好
多租户数据tenant_id保证租户数据单分片命中
用户数据查询频繁user_id避免跨分片
父子关联存储父ID保证关联数据同分片
高频单字段统计字段ID批量分析单分片数据

五、Routing 的注意事项

  • 热点分片问题:某些 routing 值的数据量特别大,会导致分片压力不均(读写热点)。
  • 分片数不可改:在创建索引时必须预估好分片数。
  • 与副本分片的关系:routing 决定落在哪个主分片,副本是由 allocation 策略分配的。
  • 查询优化:routing 在查询阶段可以减少分片数量,提高检索性能。

六、总结

Elasticsearch 的 routing 就是一个文档到分片的映射机制
默认情况下使用 _id,保证数据均匀分布;在需要让同类数据集中存储和查询时,可以自定义 routing 值。
使用策略时,要权衡查询效率分片负载均衡,避免热点分片,同时要考虑分片数量的不可变性。


参考资料

  • Elasticsearch Routing 官方文档
  • Scaling Elasticsearch with Proper Shard Design

http://www.dtcms.com/a/564703.html

相关文章:

  • GIT命令常用方法
  • Python计算题类相关实战
  • 常用es sql
  • 网站系统管理员烟台专业网站推广
  • 理论及算法_时间抽取论文
  • React中useContext的基本使用和原理解析
  • 重庆网站建设公司是什么意思可信赖的做网站
  • 【js逆向案例四】小红书
  • Next.js路由系统
  • 6、webgl 基本概念 + 四边形纹理
  • 【weblogic】XML反序列化漏洞
  • 20-控制流多次异步
  • Python Seaborn详解:让数据可视化更简单、更美观的利器
  • 基于c 的网站开发河北邢台路桥建设公司网站
  • VivaCut 4.4.0 | 专业的视频剪辑编辑制作工具,有非常多的特效,可替代剪映
  • CY5-α-酮戊二酸,(CY5-α-Ketoglutarate, CY5-α-KG)
  • Matlab模拟对流方程迎风格式验证
  • LeetCode 面试经典 150_二叉树_相同的树(68_100_C++_简单)(DFS)
  • LeetCode算法日记 - Day 91: 最长数对链
  • 潍坊哪个网站建设公司好wordpress刷新才显示
  • 在 Hive 中NULL的理解
  • 如何让UE5的插件Ultra Dynamic Sky的光照对齐真实时间?
  • 【问题解决】用pnpm创建的 Vue3项目找不到 .eslintrc.js文件 及 后续的eslint配置的解决办法
  • Kubernetes Pod 基本原理:全面详解
  • 有关于cnb自动化的脚本补全
  • Hive三大连接操作全解析
  • css3新增过渡
  • Hive 中的 COALESCE 函数作用
  • 网站建设内部下单流程图赣州的免费网站建设
  • 广东顺德网站建设instagram wordpress