CS-Notes 学习笔记
Java 后端 · MySQL

ES 的分片是怎样路由的?主分片数为什么创建后不能修改?

先自己想一想,再看参考要点

参考要点

  • 写入文档时按 shard = hash(_routing) % 主分片数 决定主分片,hash 是 Murmur3,_routing 默认是 _id(9.4 之前创建的索引先对 number_of_routing_shards 取模再除以倍数,同样依赖主分片数)
  • 修改主分片数会让已有文档算出的分片变化,按 ID 就找不到了,所以不能直接修改,扩容用 _split 拆成整数倍(要先设为只读)或 _reindex 到新索引再切换别名,_shrink 减少到因数
  • 按用户查订单时可以用 user_id 作为路由值,查询只打到一个分片,但读写都要带同样的路由值,用户数据量差别大时会数据倾斜
  • 官方建议每个分片 10 GB~50 GB
  • 写入先到主分片,再并行复制给同步副本集合中的副本,都成功才返回,搜索发给每个分片的任意一个副本,先 query 拿排序值和 ID,再 fetch 取文档
  • 脑裂靠超过半数的 master 候选节点投票避免,7.0 之前要手动配置 minimum_master_nodes
在学习站中自测这道题

学习站:先用面试题自评定级,按水平和面试日期排出每天的计划,自评过的题按间隔复习。免费、无需注册,记录只保存在自己的浏览器中。