美文网首页
关于ES-routing(路由)

关于ES-routing(路由)

作者: 一个菜鸟JAVA | 来源:发表于2019-07-27 17:20 被阅读0次

思考

在ES中,我们可以给索引设置分片.但是有一个问题是,设置了n个分片,当我插入数据时,我插入的数据应该落在哪个分片里面呢?
实际上,ES数据时落在哪个分片上,不是随机选取的.而是通过routing机制来实现的.

如何计算数据应该落在哪个shard

官方提供的公式如下:

shard_num = hash(_routing) % num_primary_shards
  • _routing代表提供路由的字段.默认情况下,为文档的ID

  • num_primary_shards代表的为primary shard的个数,这个在每个索引类型创建之前就被设置了.可以手动设置,也可以让ES默认设置.因为ES版本不同,设置的默认值也不同.该值在第一次创建索引类型被设置完成之后,是无法无法修改的,这一点很重要,后面会说为什么该值被设置之后无法修改.

  • shard_num代表数据落在的shard的编号.

ES在决定document落在哪个分片上时,首先用路由字段通过hash()函数计算一个数字,然后拿这个数字和primary shard求余,获得的结果值在0~(primary_shard - 1)之间,这也解释了,为什么primary shard被设置之后无法修改.

解决自定义路由数据分布不均

由于自定义路由,很可能导致索引分布不均,导致大量数据集中在某一个shard上.为了解决这个问题,我们可以通过设置routing_partition_size来解决自定义路由不均的问题.该值的设置同样也是在创建索引的时候就被设置.路由的公式变为下面这个:

shard_num = (hash(_routing) + hash(_id) % routing_partition_size) % num_primary_shards

从上面的值公式可以看出,会使用_id字段再做一次计算,这样让文档的分布更加均匀.

官方文档

相关文章

  • 关于ES-routing(路由)

    思考 在ES中,我们可以给索引设置分片.但是有一个问题是,设置了n个分片,当我插入数据时,我插入的数据应该落在哪个...

  • 子路由

    如,我们在关于页面里面有关于电影,关于书籍等页面,那么我们就可以在关于这个路由中创建两个子路由写法就是在关于路由中...

  • 关于路由

    如果你仔细观察日常所用服务的某些 URL 格式,会发现很多地址中都包含可变部分。例 如, 你 的 Facebook...

  • React - router的使用 && 结合react-red

    web端使用路由安装的是 react-router-dom 在组件中使用路由,我们先设置2个路由,分别是首页、关于...

  • 关于vue--路由(公众号开发总结)

    关于路由 在router.js中引入vue和vue-router 路由模式 前端路由就是一个前端不同页面的状态管理...

  • Vue_Router底层封装

    Vue_Router底层封装 关于Vue中的路由,做了底层的哈希路由的封装。基础路由相对容易,其中不足之处,慢慢再...

  • Angular CLI 常用终端操作命令

    CLI常用命令 关于CLI配置端口 关于CLI生成路由 CLI以多种方式支持路由: 初始化创建项目时,自动添加了 ...

  • Perfect(swift) 搭建服务器之路由(Route)规

    路由 关于什么是路由?这里先贴一官网地址https://www.perfect.org/docs/routing_...

  • Python day38_Flask入门

    关于路由 路由传参 有时我们需要将同一类 URL 映射到同一个视图函数处理。这时我们可以使用路由传参: 路由传递的...

  • 关于前端路由

    什么是路由 简单来说路由就是用来跟后端服务器进行交互的一种方式,通过不同的路径,来请求不同的资源(if...els...

网友评论

      本文标题:关于ES-routing(路由)

      本文链接:https://www.haomeiwen.com/subject/rsberctx.html