ES 分片路由

分片路由

ES 在创建新文档时候时如何选择具体存储在哪个分片上?这就是一个文档分片路由的机制。ES 使用路由值(routing)的哈希散列进行分片的路由:index_of_shards = hash(routing) % num_of_shards

ES 查询请求过程

假设在一个多分片的 ES 进行查询,会有以下几个步骤:

  1. 请求被某个节点接受
  2. 接受请求的节点将该请求广播到所有节点
  3. 每个分片进行搜索,并返回
  4. 各个分片的结果在一个节点合并,排序,返回响应

利用路由值进行搜索优化

在默认情况下路由值等于文档的编号:routing=_id,这样可以让文档均匀的散列在所有分片上。但是在很多查询的时候 ES 无法确定查询的文档所在分片,所有会向所有分片进行广播。指定路由值可以避免广播请求,一定程度上减少资源消耗和增加效率,在请求时跟上 routing 参数即可:

1
GET /index/type/_search?routing=123123

指定 routing 的这个时候请求指向的分片事实上是确定的!这样的请求通常是查询的文档已经通过同样的路由值被添加了!否则这样的查询是无效的。

路由值是可以指定多个的,中间使用逗号 , 隔开。

显式路由指定的弊端

通常各个分片上的数据是均匀分布的(默认使用 id 进行哈希),但是如果大量使用显式路由指定文档,容易造成数据偏移在某些节点上。所以使用时需要对数据有足够了解。


参考:

  • 《从Lucene到Elasticsearch全文检索实战》 姚攀
码路加油
显示评论