关于ES-routing(路由)

2019-07-27  本文已影响0人  一个菜鸟JAVA

思考

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

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

官方提供的公式如下:

shard_num = hash(_routing) % num_primary_shards

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字段再做一次计算,这样让文档的分布更加均匀.

官方文档

上一篇下一篇

猜你喜欢

热点阅读