如何获取 elsticsearch 集群中当前打开的分片数量?

Dmi*_*yev 7 elasticsearch

我找不到在哪里获取当前打开的分片的数量。我想进行监控以避免出现这样的情况:

this cluster currently has [999]/[1000] maximum shards open
Run Code Online (Sandbox Code Playgroud)

我可以获得最大限制 - max_shards_per_node

$ curl -X GET "${ELK_HOST}/_cluster/settings?include_defaults=true&flat_settings=true&pretty" 2>/dev/null | grep cluster.max_shards_per_node
"cluster.max_shards_per_node" : "1000",
$
Run Code Online (Sandbox Code Playgroud)

但无法找到如何获取当前打开的分片数量(999)。

Val*_*Val 12

获取此信息的一个非常简单的方法是调用_cat/shardsAPI 并使用 shell 命令计算行数wc

curl -s -XGET ${ELK_HOST}/_cat/shards | wc -l
Run Code Online (Sandbox Code Playgroud)

这将产生一个代表集群中分片数量的数字。

另一种选择是使用 JSON 格式检索集群统计信息,将结果通过管道传输jq,然后获取您想要的任何内容,例如下面我正在计算所有已启动的分片:

curl -s -XGET ${ELK_HOST}/_cat/shards?format=json | jq ".[].state" | grep "STARTED" | wc -l
Run Code Online (Sandbox Code Playgroud)

另一种选择是查询_cluster/statsAPI:

curl -s -XGET ${ELK_HOST}/_cluster/stats?filter_path=indices.shards.total
Run Code Online (Sandbox Code Playgroud)

这将返回一个带有分片计数的 JSON

{
  "indices" : {
    "shards" : {
      "total" : 302
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

据我所知,ES 没有从任何具有单一数字的 API 中吐出单一数字。为了确定这一点,让我们看一下源代码。

  1. 错误是从抛出的IndicesService.java

  2. 要了解如何currentOpenShards计算,我们可以转到Metadata.java

正如您所看到的,代码正在迭代从集群状态检索的索引元数据,非常类似于运行以下命令并计算分片数量,但仅适用于具有"state" : "open"

GET _cluster/state?filter_path=metadata.indices.*.settings.index.number_of*,metadata.indices.*.state
Run Code Online (Sandbox Code Playgroud)

从这些证据中,我们几乎可以确定您正在寻找的单个数字无处可寻,但需要通过我上面展示的方法之一来计算。如果需要,您可以随意提出功能请求。