Elasticsearch慢查询日志显示命中6分片异常问题求助
这是个很值得深究的问题,结合你描述的现象——慢日志显示total_shards[6]但你的索引明明只有2主2副,而且直接用curl发起查询时显示的是正确的2个分片,我梳理了几个最可能的原因:
查询其实涉及了多个索引(不是你以为的单个)
这是最常见的情况。可能你的应用代码里的查询用了索引通配符(比如my-index*)、索引别名,或者不小心写了多个索引名称,而这些索引加起来的主分片总数正好是6。比如3个各有2主分片的索引,加起来就是6个主分片,慢日志里的total_shards统计的就是所有目标索引的主分片总数。而你用curl测试时只指定了单个索引,所以显示的是正确的2个分片。你对索引副本配置的理解可能有偏差
你提到“2个主分片和2个副本分片”,如果实际是每个主分片配有2个副本,那总分片数(主+副)就是2 + 2*2 = 6。不过要注意,ES的搜索请求只会从每个主分片的副本组(主+2副)里选一个来执行,所以实际执行的分片数还是2,但个别ES版本的慢日志里total_shards可能会统计该索引的所有分片(主+所有副本)的总数?不过这个可能性比较低,因为官方文档里total_shards在慢日志里通常指的是查询需要访问的主分片总数。慢日志的
total_shards统计逻辑有特殊情况
极少数情况下,某些ES版本的慢日志total_shards可能包含了查询阶段临时涉及的分片(而非最终实际执行的分片),但这种情况非常少见,优先排查前面两种情况更靠谱。
建议你先去慢日志里找到对应的完整查询语句,确认它指定的索引目标到底是什么,和你curl测试时用的索引做个对比。如果发现是跨了多个索引,那total_shards[6]的问题就迎刃而解了;如果确实是单个索引,再用GET /your-index/_settings命令查看索引的分片配置,确认number_of_shards(主分片数)是不是真的是2。
内容的提问来源于stack exchange,提问作者Amit

