查询指定Elasticsearch节点:直连与preferred参数效果是否一致
问题答复
核心结论
你直接把查询请求发到xx.xx.xx.18这个data节点,没法保证整个查询全在这个节点本地执行。带preference参数也不是指定查询节点的唯一方式,但它是官方给出的标准查询路由控制方案。
具体逻辑说明
- 你把请求发到哪个ES节点,那个节点默认就当本次请求的协调节点:它收到请求之后不会直接强制在本地跑完全部查询,而是会根据你查的索引的分片分布情况,把子请求转发到存了对应分片的节点(主分片、副本分片都可以,默认轮询选择),等收齐所有分片返回的结果,汇总处理完再给你返回响应。
- 拿你举的
http://xx.xx.xx.18:9200/product/_count请求举例:如果product索引的部分分片(不管是主分片还是副本分片)实际存在xx.xx.xx.17那个master节点上,同时18节点本地没有这些分片的副本,那18节点收到请求之后,照样会给17节点发对应分片的查询子请求,不会全在本地完成查询。 - ES默认选分片的逻辑不会优先用协调节点本地存的分片,要是你想让查询尽量在你发请求的这个节点本地跑,可以在请求里加preference参数,把值设成
_local,这时候协调节点会优先找本地存的分片副本来执行查询,只有本地没有对应分片副本的时候,才会把请求转发到别的节点。 - 除了preference参数之外,你也可以靠自定义路由规则、调整分片副本分布的方法间接控制查询请求落到哪个节点,但这些方法都不是通用标准实现,只适合特定定制场景,通用性很差。
内容的提问来源于stack exchange,提问作者asela kotagama
相关产品推荐
相关产品推荐

