📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

配置项作用 #

action.search.shard_count.limit 配置项限制单次搜索请求最多可以查询的分片数量。该限制旨在防止针对过多分片的大规模搜索请求导致协调节点 CPU 或内存资源耗尽。

配置项类型 #

该配置项为动态配置,可以在运行时通过集群更新 API 进行修改,无需重启节点。

默认值 #

Long.MAX_VALUE(9223372036854775807,实际上无限制)

是否必需 #

可选配置项

取值范围 #

1 ~ Long.MAX_VALUE

配置原理 #

当搜索请求发起时,系统会计算该请求涉及的分片总数(包括本地集群和远程集群的所有分片)。如果分片数量超过此限制,搜索请求将被拒绝并返回错误。

错误信息 #

当超出限制时,系统会返回以下错误信息:

IllegalArgumentException: Trying to query [分片数量] shards, which is over the limit of [限制值].
This limit exists because querying many shards at the same time can make the job of the coordinating node very CPU and/or memory intensive.
It is usually a better idea to have a smaller number of larger shards.
Update [action.search.shard_count.limit] to a greater value if you really want to query that many shards at the same time.

使用示例 #

# 限制单次搜索最多查询 1000 个分片
action.search.shard_count.limit: 1000

# 设置为无限制(默认值)
action.search.shard_count.limit: 9223372036854775807

推荐设置建议 #

生产环境建议:根据集群规模和硬件配置设置合理的限制值

推荐配置

# 中小型集群(单次搜索建议不超过 500 个分片)
action.search.shard_count.limit: 500

# 大型集群(单次搜索建议不超过 1000 个分片)
action.search.shard_count.limit: 1000

设置理由:

  1. 保护协调节点:防止过大的搜索请求耗尽协调节点的 CPU 和内存资源
  2. 提高集群稳定性:避免因个别大查询导致整个集群性能下降
  3. 促进合理分片设计:鼓励使用较少但更大的分片,而非大量小分片
  4. 防止意外查询:避免因使用 * 通配符导致意外查询过多索引

计算分片数量的场景 #

以下场景会累加分片数量:

# 查询单个索引(1个分片)
GET /my-index/_search

# 查询多个索引(每个索引的分片数累加)
GET /index1,index2,index3/_search

# 使用通配符查询(匹配的所有索引分片数累加)
GET /logs-*/_search

# 跨集群查询(本地集群+远程集群分片数累加)
GET /cluster1:logs-*,cluster2:metrics-*/_search

如何优化 #

如果遇到此限制错误,可以考虑以下优化方案:

1. 缩小查询范围

# 优化前:查询所有日志索引
GET /logs-*/_search

# 优化后:只查询特定日期范围
GET /logs-2024-01-*/_search

2. 使用索引别名

# 创建只包含必要索引的别名
POST /_aliases
{
  "actions": [
    {"add": {"index": "logs-active", "aliases": "logs-searchable"}}
  ]
}

# 通过别名查询
GET /logs-searchable/_search

3. 优化分片设计

  • 减少小分片的数量
  • 合并过小的分片
  • 合理设置索引的分片数量

注意事项 #

  1. 动态更新:修改此配置后立即生效,影响所有新执行的搜索请求
  2. 适用范围:此限制适用于所有类型的搜索操作,包括普通搜索、聚合查询、滚动查询等
  3. 与 max_concurrent_shard_requests 的区别:此配置限制的是单次请求涉及的分片总数,而 max_concurrent_shard_requests 控制的是并发访问的分片数量
  4. 跨集群搜索:使用跨集群搜索(CCS)时,所有集群的分片数都会计入此限制