如果一个索引分片多达一百,再加上每个分片数据量大的情况下ES查询速度会慢,这种情况可以根据业务情况考虑使用_routing优化。

_routing 路由

当索引一个文档的时候,文档会被存储在一个主分片上。在存储时一般都会有多个主分片。Elasticsearch 如何知道一个文档应该放置在哪个分片呢?其实ES默认会有一个routing的概念,并根据shard = hash(routing) % number_of_primary_shards 计算决定每个doc应该存储在哪个分片上。

借助_routing进行批量写入优化

ES写入性能本身就不是很强,特别是当用户采用bulk批量写入时,ES默认采用_id作为单个文档写入的routing,路由打散分片。这样一个bulk请求将会被均匀拆分打散为分片数量的子写入请求,发送给每个分片执行写入,协调节点需要等待所有分片写入完毕才会返回给客户端。当分片数过多时,就容易出现长尾子请求,即有可能部分子请求因节点故障或OldGC、网络抖动等延迟响应,导致整个bulk请求响应缓慢而堆积,最终导致节点写入队列打满出现写入拒绝。另一方面,拆分过多的子请求无法提升数据节点写入吞吐,无法充分利用 CPU。

创建索引时指定index.bulk_routing.enabled 参数为true即可实现定向路由。

通过 routing 的方式可以实现一个 bulk 只写入到一个分片,降低网络开销、提升数据节点 CPU 使用率、避免长尾分片影响整个 bulk 请求。

提升查询效率

如果不使用_routing时,执行查询时ElasticSearch内部流程是:

1.请求到达协调节点后,协调节点

推荐链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: