elasticsearch 如何在elsticsearch集群中获取当前打开的碎片数?

9o685dep  于 2022-11-02  发布在  ElasticSearch
关注(0)|答案(3)|浏览(171)

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

this cluster currently has [999]/[1000] maximum shards open

我可以得到最大限制- 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",
$

但无法找出如何获取当前打开的碎片数(999)。

rdrgkggo

rdrgkggo1#

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

curl -s -XGET ${ELK_HOST}/_cat/shards | wc -l

这将产生一个数字,表示集群中的碎片数。
另一种选择是使用JSON格式检索集群统计信息,将结果通过管道传输到jq中,然后获取您想要的任何内容,例如下面我正在计算所有STARTED碎片:

curl -s -XGET ${ELK_HOST}/_cat/shards?format=json | jq ".[].state" | grep "STARTED" | wc -l

还有一个选项是查询_cluster/stats API:

curl -s -XGET ${ELK_HOST}/_cluster/stats?filter_path=indices.shards.total

这将返回一个包含分片数的JSON

{
  "indices" : {
    "shards" : {
      "total" : 302
    }
  }
}

据我所知,ES从任何带有单个数字的API中都不会输出单个数字。为了确保这一点,让我们看一下源代码。
1.错误是从IndicesService.java抛出的
1.为了了解currentOpenShards是如何计算的,我们可以转到Metadata.java
正如您所看到的,代码正在迭代从集群状态检索到的索引元数据,这与运行以下命令并计算碎片数非常相似,但仅适用于"state" : "open"的索引

GET _cluster/state?filter_path=metadata.indices.*.settings.index.number_of*,metadata.indices.*.state

从这些证据中,我们可以很肯定地说,你要找的那个数字是找不到的,但是需要用上面介绍的方法之一来计算,如果需要的话,你可以自由地使用open a feature request

xa9qqrwz

xa9qqrwz2#

    • 问题 : * * 每个 节点 的 弹性 集群 碎片 数 似乎 越来越 有限 。
    • 解决 方案 : * * 验证 配置 中 每个 节点 的 碎片 数 , 并 使用 弹性 API 增加 碎片 数 。

要 获取 碎片 数 , 请 使用 _cluster/stats API :

curl -s -XGET 'localhost/_cluster/stats?filter_path=indices.shards.total'

中 的 每 一 个
来自 * * elastic docs: * *
使用 集群 统计 信息 API 可以 从 集群 范围 的 Angular 检索 统计 信息 。 该 API 返回 基本 索引 度量 ( 碎片 数 , 存储 大小 , 内存 使用 情况 ) 以及 有关 构成 集群 的 当前 节点 的 信息 ( 数量 , 角色 , 操作 系统 , JVM 版本 , 内存 使用 情况 , CPU 和 已 安装 的 插件 ) 。
要 更新 碎片 数 ( 增加/减少 ) , 请 使用 - _cluster/settings api :

    • 例如 : * *
curl -XPUT -H 'Content-Type: application/json' 'localhost:9200/_cluster/settings' -d '{ "persistent" : {"cluster.max_shards_per_node" : 5000}}'

格式
来自 * * elastic docs * * :
通过 请求 正文 中 的 规范 , 此 API 调用 可以 更新 群集 设置 。 对 设置 的 更新 可以 是 永久 性 的 ( 意味 着 它们 在 重新 启动 后 应用 ) , 也 可以 是 transient 的 ( 即 它们 在 整个 群集 重新 启动 后 不 存在 ) 。
您 可以 指派 空 值 来 重设 永久 或 暂时 设定 。 如果 重设 暂时 设定 , 则 会 套用 定义 的 第 一 个 值 :
永久 设置 配置 文件 中 的 设置 为 默认 值 。 群集 设置 的 优先 顺序 为 :
临时 集群 设置 持久 集群 设置 在 elasticsearch . yml 配置 文件 中 设置 。 最 好 使用 设置 API 设置 所有 集群 范围 的 设置 , 并 仅 将 elasticsearch . yml 文件 用于 本地 配置 。 这样 , 您 可以 确保 所有 节点 上 的 设置 都 相同 。 另 一方面 , 如果 您 使用 配置 文件 意外 地 在 不同 节点 上 定义 了 不同 的 设置 ,很 难 注意 到 这些 差异 。

zte4gxcn

zte4gxcn3#

curl -s '127.1:9200/_cat/indices' | awk '{ if ($2 == "open") C+=$5*$6} END {print C}'

相关问题