基础知识

背景知识

  • OpenSearch 是一个基于 Lucene 的分布式搜索和分析数据库。
  • 它和 ElasticSearch 同源,Elastic 公司改了ElasticSearch 的开源协议后,AWS 公司基于当时的 ElasticSearch 源码开发了 OpenSearch。
  • OpenSearch 常用于搜索领域和观测领域。例如:
    • 类似于 Wiki 的关键词检索引擎
    • 大规模系统的日志查询
    • 监控系统的 trace 追踪

架构

物理架构

  • 一个 OpenSearch 由多台机器组成,其中存数据的叫 data node。
  • 一个 data node 上一般只有一个 OpenSearch 进程(Java 进程)。
  • 一个 OpenSearch 进程管理着多个数据 shard(分片)。
  • 一个 shard 中的数据,会切分成多个 segment。segment 是 Lucene 存储数据的最小单元。

逻辑架构

  • OpenSearch 中最小的数据单元是docs,它的结构像 json。
  • 一个 index 下会有多个 docs,index 会有一个叫 mapping 的映射规则集,index 下的docs要符合 mapping 里面的规则。
  • 同一个 index 下 的docs,它们的 schema 可以不一样,但是有一些限制。例如:
    • 如果mapping 指定 dynamic: strict,新增的 docs 不能带未知的字段。
    • 如果 mapping 里面规定了某个字段对应的类型,新增的 docs 中,对应字段的类型必须匹配。
  • OpenSearch 大量的配置,如过期清理、滚动写入规则等,都是针对 index 级别的。

快捷操作配置

OpenSearch的操作都是通过 HTTP 接口调用执行,为了方便执行,可以提前配置以下变量信息:

export OS_USER=your_admin_user_name
export OS_PASSWORD=your_admin_password
export OS_URL=your_os_host

注意,密码最好用单引号包起来,防止里面的特殊字符出现问题。
如果日常运维操作较多,可以在bashrc 中配置下面的函数,提升效率:

oc() {
  local method="$1"
  local path="$2"
  local data="$3"

  # ---- method 合法性校验 ----
  case "$method" in
    GET|POST|PUT|DELETE)
      ;;
    *)
      echo "error: invalid method '$method'" >&2
      echo "usage: oc <GET|POST|PUT|DELETE> <path> [json_body]" >&2
      return 1
      ;;
  esac

  if [[ -z "$path" ]]; then
    echo "error: path is required" >&2
    echo "usage: oc <GET|POST|PUT|DELETE> <path> [json_body]" >&2
    return 1
  fi

  # ---- 执行 ----
  if [[ -n "$data" ]]; then
    curl -sk \
         -u "$OS_USER:$OS_PASSWORD" \
         -X "$method" \
         -H "Content-Type: application/json" \
         "$OS_URL/$path" \
         -d "$data"
  else
    curl -sk \
         -u "$OS_USER:$OS_PASSWORD" \
         -X "$method" \
         -H "Content-Type: application/json" \
         "$OS_URL/$path"
  fi
}

调用示例:

oc GET "_cat/health?v"

安全提示

  1. export OS_PASSWORD=... 会将密码留在 shell history 中,共享机器上建议改用更安全的方式(如写入权限为 600 的配置文件,或交互式输入)
  2. oc 函数中的 -sk 跳过了 TLS 证书校验,仅适用于内网/测试环境,生产环境建议配置合法证书并去掉 -k

常用排查命令

排查命令按 API 端点分类整理,便于按需查阅。

通用操作

大部分的接口支持在带上vh两个参数。其中,v 表示返回中第一行是数值说明,类似于加了一个表头。h用于选择特定的列,例如h=status,node.total代表了只返回statusnode.total 这两列。
如果不知道h 可以带哪些字段,可以通过help 参数来获取。例如:oc GET "_cat/health?help"

_cat 系列

_cat 接口返回表格格式,适合快速查看集群概况。输出结果类似于tsv文件格式,可以直接重定向到文件中。

集群健康

oc GET "_cat/health?v"

返回示例:

[root@master1 os]# oc GET "_cat/health?v"
epoch      timestamp cluster         status node.total node.data discovered_cluster_manager shards  pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1705833303 08:48:23  opensearch-cluster yellow        3       3                       true  1047  555    0    0        6           0                  -                 99.4%

关注点:

  • status:
    • green:正常,可读写,所有的副本都能分配到节点。
    • yellow:异常,可读写,存在备副本没有分配到节点,但是主副本都分配到了节点。
    • red:异常,不可读写,存在主分片分配不到节点。
  • unassign:集群中没能分配到节点的 shard 数,正常为 0,大于 0 就是不正常的。

节点信息

_cat/nodes 默认输出不包含磁盘信息,磁盘字段需要通过 h= 显式指定:

oc GET "_cat/nodes?h=ip,heap.percent,ram.percent,cpu,disk.used_percent,node.role,name&v"

返回示例:

[root@master1 os]# oc GET "_cat/nodes?v&h=ip,heap.percent,ram.percent,cpu,disk.used_percent,node.role,name"
ip           heap.percent ram.percent cpu disk.used_percent node.role name
10.233.64.36           28          98  80             54.03 dimr      opensearch-cluster-master-2
10.233.66.23           39         100  66             19.45 dimr      opensearch-cluster-master-1
10.233.127.27          60         100  83             49.33 dimr      opensearch-cluster-master-0

关注点:

  • node.role:节点的角色,例如 d 代表 data 节点,m 代表 master 节点,i 代表 ingest 节点,r 代表 remote_cluster_client(跨集群搜索客户端)。
  • heap.percent:JVM 堆内存使用率,长时间超过 75% 需要关注,超过 85% 容易触发频繁 GC。
  • disk.used_percent:磁盘使用率,超过 85% 会触发 watermark,影响 shard 分配和写入。
  • cpu:CPU 使用率,持续过高说明节点压力较大。

索引概览

oc GET "_cat/indices?v"

常用过滤参数:

  • ?health=red 只看异常状态的索引。
  • ?s=store.size:desc 按磁盘占用倒序排列。
  • ?h=index,docs.count,store.size 只看指定列。
    例如,定位磁盘占用最大的索引:
oc GET "_cat/indices?v&s=store.size:desc&h=index,status,pri,rep,docs.count,store.size,pri.store.size" |head -4

返回示例:

[root@master1 os]# oc GET "_cat/indices?v&s=store.size:desc&h=index,status,pri,rep,docs.count,store.size,pri.store.size" | head -4
index                              status pri rep docs.count store.size pri.store.size
llmops-observe-trace-000002        open   3   1   21518683   242.3gb    121.2gb
llmops-observe-conversation-000002 open   1   1   1058062    99.6gb     49.7gb
llmops-observe-conversation-000003 open   1   1   1003796    99.5gb     49.7gb

shard 分布

oc GET "_cat/shards?v"

常用过滤参数:

  • ?h=index,shard,prirep,state,unassigned.reason,node 只看关键列,定位未分配 shard 的原因

例如,查看未分配 shard 的情况:

oc GET "_cat/shards?v&h=index,shard,prirep,state,unassigned.reason,node" | grep UNASSIGNED

返回示例:

[root@master1 os]# oc GET "_cat/shards?v&h=index,shard,prirep,state,unassigned.reason,node" | grep UNASSIGNED
llmops-observe-tracelevel-1783136061 0 r UNASSIGNED NODE_LEFT
llmops-observe-tracelevel-1783136061 1 r UNASSIGNED NODE_LEFT
llmops-observe-tracelevel-1783136061 2 r UNASSIGNED NODE_LEFT
.ds-llmops-observe-metric-000003     0 r UNASSIGNED NODE_LEFT
.ds-llmops-observe-metric-000003     1 r UNASSIGNED NODE_LEFT
.ds-llmops-observe-metric-000003     2 r UNASSIGNED NODE_LEFT
......

节点磁盘水位

oc GET "_cat/allocation?v"

关注 disk.percent,超过 85% 触发 low watermark,节点不再接收新 shard 分配;超过 90% 触发 high watermark,开始迁出 shard。
返回示例:

[root@master1 os]# oc GET "_cat/allocation?v"
shards disk.indices disk.used disk.avail disk.total disk.percent host           ip             node
   349        423.5gb   465gb      1.8tb      2.3tb           19 10.233.66.23   10.233.66.23   opensearch-cluster-master-1
   354          1.2tb   1.2tb      1.1tb      2.3tb           54 10.233.64.36   10.233.64.36   opensearch-cluster-master-2
   349          1.1tb   1.1tb      1.1tb      2.3tb           49 10.233.127.27  10.233.127.27  opensearch-cluster-master-0
     6                                                                                             UNASSIGNED

线程池

oc GET "_cat/thread_pool?v&h=node_name,name,active,queue,rejected,completed"

重点关注 writesearch 线程池的 rejected 值,持续增长说明处理速度跟不上请求,客户端会收到 429。
返回示例:

[root@master1 os]# oc GET "_cat/thread_pool?v&h=node_name,name,active,queue,rejected,completed"
node_name                          name                                     active queue rejected completed
opensearch-cluster-master-2 _plugin_geospatial_ip2geo_datasource_update          0     0        0         0
opensearch-cluster-master-2 _plugin_neural_search_hybrid_query_executor          0     0        0         0
opensearch-cluster-master-2 ad-batch-task-threadpool                             0     0        0         0
opensearch-cluster-master-2 ad-threadpool                                        0     0        0        44
opensearch-cluster-master-2 analyze                                              0     0        0         0
opensearch-cluster-master-2 fetch_shard_started                                  0     0        0       511
......

当前任务

oc GET "_cat/tasks?v"

常用过滤参数:

  • ?detailed=true 显示任务描述(description),方便看到具体查询 DSL 或索引名。
  • ?actions=*search* 只看搜索类任务。
  • ?actions=*reindex* 只看 reindex 任务。
  • ?s=running_time:desc 按执行耗时倒序排列,快速定位运行最久的任务。

注意:running_time 默认是格式化字符串(如 580.8ms),不同单位混在一起时不适合按字符串排序。如需按数值精确排序,可加上 &time=ns 让 running_time 以纳秒显示。

例如,查看执行最久的搜索任务:

oc GET "_cat/tasks?v&actions=*search*&s=running_time:desc"

返回示例:

[root@master1 os]# oc GET "_cat/tasks?v&actions=*search*&s=running_time:desc"
task_id                                parent_task_id                     type      start_time    timestamp running_time  ip            node
indices:data/read/search               Htr3-iXcQc_iPoXm_lkOzQG:529765264  -         transport  1785922322976 09:32:06      64.3ms 10.233.127.27 opensearch-cluster-master-0
indices:data/read/search               rDiiw1oIsYSkPAypv9eYMhjG:578470654 -         transport  1785922322985 09:32:06      51.3ms 10.233.64.36  opensearch-cluster-master-2
indices:data/read/search               Htr3-iXcQc_iPoXm_lkOzQG:529765359  -         transport  1785922323018 09:32:07      18.8ms 10.233.127.27 opensearch-cluster-master-0
indices:data/read/search[phase/query]  rDiiw1oIsYSkPAypv9eYMhjG:578470654 -         transport  1785922323035 09:32:07       1.4ms 10.233.127.27 opensearch-cluster-master-0
indices:data/read/search[phase/query]  Htr3-iXcQc_iPoXm_lkOzQG:529765416  -         transport  1785922323035 09:32:07         1ms 10.233.127.27 opensearch-cluster-master-0
indices:data/read/search[phase/query]  rDiiw1oIsYSkPAypv9eYMhjG:578470654 -         transport  1785922323036 09:32:07         1ms 10.233.64.36  opensearch-cluster-master-2
indices:data/read/search[phase/query]  Htr3-iXcQc_iPoXm_lkOzQG:529765410  -         transport  1785922323036 09:32:07   824.2micros 10.233.64.36  opensearch-cluster-master-2
indices:data/read/search[phase/query]  rDiiw1oIsYSkPAypv9eYMhjG:578470680 -         transport  1785922323034 09:32:07   517.2micros 10.233.64.36  opensearch-cluster-master-2

segments

oc GET "_cat/segments/<index>?v&h=index,shard,segment,docs,size"

segment 数量过多会影响查询性能,只读索引建议执行 force merge,合并 segment。可以通过拼接 tail -n +2 | wc -l 统计 segment 数量(tail -n +2 用于去掉 ?v 带来的表头行)。
返回示例:

[root@master1 os]# oc GET "_cat/segments/llmops-observe-trace-000001?v&h=index,shard,segment,docs,size" | head -4
index                       shard segment   size
llmops-observe-trace-000001     0 _5j9gx   4.8gb
llmops-observe-trace-000001     0 _5ja66   4.9gb
llmops-observe-trace-000001     0 _5jb7z   4.9gb

master 节点

oc GET "_cat/master?v"

确认当前 master 节点是哪台,排查脑裂或 master 切换时使用。
返回示例:

[root@master1 os]# oc GET "_cat/master?v"
id                     host            ip              node
vkH4aK7HRmCaWkjGE0J5bw 10.233.66.23    10.233.66.23    opensearch-cluster-master-1

_cluster 系列

_cluster 接口用于集群级别的诊断和配置。

shard 分配失败原因

oc GET "_cluster/allocation/explain?pretty"

集群存在未分配 shard 时使用,会给出具体的失败原因(如磁盘水位、节点数不足、副本数过高等)。
返回示例(下面的 shard 因为配置了分配策略,要求节点必须带有temp:warm的标签,导致分配失败):

[root@master1 os]# oc GET "_cluster/allocation/explain?pretty"
{
  "index" : "llmops-observe-tracelevel-1783136061",
  "shard" : 0,
  "primary" : false,
  "current_state" : "unassigned",
  "unassigned_info" : {
    "reason" : "NODE_LEFT",
    "at" : "2026-08-03T10:03:04.466Z",
    "details" : "node_left [vkh4aK7HRmCaWkjGE0J5bw]",
    "last_allocation_status" : "no_attempt"
  },
  "can_allocate" : "no",
  "allocate_explanation" : "cannot allocate because allocation is not permitted to any of the nodes",
  "node_allocation_decisions" : [
    {
      "node_id" : "Htr3-iXcQciPoXm_lk0ZqQ",
      "node_name" : "opensearch-cluster-master-0",
      "transport_address" : "10.233.127.27:9300",
      "node_attributes" : {
        "shard_indexing_pressure_enabled" : "true"
      },
      "node_decision" : "no",
      "deciders" : [
        {
          "decider" : "filter",
          "decision" : "NO",
          "explanation" : "node does not match index setting [index.routing.allocation.require] filters [temp:\"warm\"]"
        }
      ]
    }
  ]
}

集群配置

oc GET "_cluster/settings?include_defaults=true&flat_settings=true&pretty"

查看集群当前所有配置(含默认值)。配合 grep 定位具体配置:

oc GET "_cluster/settings?include_defaults=true&flat_settings=true&pretty" | grep disk.watermark

返回示例:

[root@master1 os]# oc GET "_cluster/settings?include_defaults=true&flat_settings=true&pretty" |grep water
  "cluster.routing.allocation.disk.watermark.enable_for_single_data_node" : "false",
  "cluster.routing.allocation.disk.watermark.flood_stage" : "95%",
  "cluster.routing.allocation.disk.watermark.high" : "90%",
  "cluster.routing.allocation.disk.watermark.low" : "85%",

集群状态

oc GET "_cluster/state?pretty"

返回集群元数据,包括所有节点、索引、模板信息。数据量较大,建议配合 jq 过滤查看。

_nodes 系列

熔断器状态

oc GET "_nodes/stats/breaker?pretty"

查看各类型熔断器(parent、fielddata、request)的内存使用量和是否触发,写入被拒且非线程池满时优先查看。
返回示例:

[root@master1 os]# oc GET "_nodes/stats/breaker?pretty"
{
  "_nodes" : {
    "total" : 3,
    "successful" : 3,
    "failed" : 0
  },
  "cluster_name" : "opensearch-cluster",
  "nodes" : {
    "r0i1wIoISyKPApv9eYmhjg" : {
      "timestamp" : 1785980947937,
      "name" : "opensearch-cluster-master-2",
      "transport_address" : "10.233.64.36:9300",
      "host" : "10.233.64.36",
      "ip" : "10.233.64.36:9300",
      "roles" : [
        "data",
        "ingest",
        "master",
        "remote_cluster_client"
      ],
      "attributes" : {
        "shard_indexing_pressure_enabled" : "true"
      },
      "breakers" : {
        "request" : {
          "limit_size_in_bytes" : 6442450944,
          "limit_size" : "6gb",
          "estimated_size_in_bytes" : 55943,
          "estimated_size" : "54.6kb",
          "overhead" : 1.0,
          "tripped" : 0
        },
        ......
      }
    }
  }
}

_settings 系列

索引 settings

oc GET "<index>/_settings?pretty"

查看指定索引的配置,或用 _all 查看全部。

索引 settings 过滤查看

通过 grep 过滤 _all/_settings 来快速查看特定配置:

oc GET "_all/_settings?pretty" | grep -A2 "blocks"          # 查看只读状态
oc GET "_all/_settings?pretty" | grep -A5 "search.slowlog"   # 查看慢查询日志配置
  • 查看只读状态:检查是否有索引被标记为 read_only_allow_delete,通常是磁盘触发 flood_stage(默认 95%)导致的。
  • 查看慢查询日志配置:查看慢查询阈值配置,确认是否开启慢查询日志。

mapping

oc GET "<index>/_mapping?pretty"

查看索引的字段映射,排查写入类型冲突(mapper_parsing_exception)时使用。也可以看单个字段:

oc GET "<index>/_mapping/field/<field_name>?pretty"

常见变更命令

集群配置变更

集群配置分 transient(重启失效)和 persistent(持久化)两种,运维变更推荐用 persistent

  1. 修改配置(示例:调整磁盘水位线):
oc PUT "_cluster/settings" -d '{
  "persistent": {
    "cluster.routing.allocation.disk.watermark.low": "85%",
    "cluster.routing.allocation.disk.watermark.high": "90%",
    "cluster.routing.allocation.disk.watermark.flood_stage": "95%"
  }
}'
  1. 重置某个配置为默认值(传 null):
oc PUT "_cluster/settings" -d '{
  "persistent": {
    "cluster.routing.allocation.disk.watermark.low": null
  }
}'
  1. 查看当前配置(含默认值):
oc GET "_cluster/settings?include_defaults=true&flat_settings=true"

节点下线

节点下线前需要先迁出该节点上的 shard,避免数据丢失或集群状态异常。

  1. 通过 allocation exclude 触发 shard 迁移:
oc PUT "_cluster/settings" -d '{
  "transient": {
    "cluster.routing.allocation.exclude._name": "node-1"
  }
}'

也可以按其他维度排除:_ip(IP)、_host(主机名)、_attr(自定义属性)。

  1. 观察该节点 shard 数是否降到 0:
oc GET "_cat/allocation?v"
  1. 确认 shard 全部迁出后,再关闭该节点的 OpenSearch 进程。

  2. 如果只是临时重启,节点重新加入后记得清空排除配置:

oc PUT "_cluster/settings" -d '{
  "transient": {
    "cluster.routing.allocation.exclude._name": null
  }
}'

重新触发 shard 分配

shard 因临时原因(如节点短暂掉线)未分配时,可以手动 reroute 重试:

oc POST "_cluster/reroute?retry_failed=true"

解除索引只读状态

磁盘触发 flood_stage 后,索引会被设为 read_only_allow_delete,清理磁盘后需要手动解除:

oc PUT "_all/_settings" -d '{
  "index.blocks.read_only_allow_delete": null
}'

也可以只针对单个索引:把 _all 换成对应索引名。

调整副本数

副本数调整属于集群容量/容灾层面的运维变更:

oc PUT "<index>/_settings" -d '{
  "index.number_of_replicas": 2
}'
  • 调大副本可以分摊查询压力、提升容灾能力,但会占用更多磁盘和写入带宽。
  • 调小副本可以释放磁盘空间,但会降低容灾能力。

更新索引分配策略

通过 index.routing.allocation.* 可以控制单个索引的 shard 分配到的节点范围,常用于冷热架构(hot/warm)、跨机架容灾等场景。注意这是索引级配置,区别于集群级的 cluster.routing.allocation.*(节点下线用的就是集群级 exclude)。

  1. 将索引只分配到带指定属性的节点(require,必须全部匹配):
oc PUT "<index>/_settings" -d '{
  "index.routing.allocation.require.temp": "warm"
}'

该索引的 shard 只会被分配到设置了 node.attr.temp: warm 的节点上。

  1. 允许分配到带指定属性的节点之一(include,满足其一即可):
oc PUT "<index>/_settings" -d '{
  "index.routing.allocation.include.temp": "warm,hot"
}'
  1. 排除特定节点(exclude,匹配到的不分配):
oc PUT "<index>/_settings" -d '{
  "index.routing.allocation.exclude._name": "node-1"
}'
  1. 解除分配策略(传 null):
oc PUT "<index>/_settings" -d '{
  "index.routing.allocation.require.temp": null
}'
  1. 查看索引当前的分配策略:
oc GET "<index>/_settings?pretty" | grep -A5 "routing.allocation"

索引生命周期管理(ISM)

ISM(Index State Management)是 OpenSearch 的索引生命周期管理插件,通过定义策略(policy)自动执行 rollover、delete、force_merge 等操作,适合日志、trace 等时序数据的滚动写入和过期清理。策略本质上是一个状态机,典型的生命周期是 hot → warm → delete。ISM 后台 job 默认每 5 分钟执行一次(由 plugins.index_state_management.job_interval 控制),集群状态为 red 时不会执行。

配置 ISM 策略

1. 创建策略

以「滚动写入 + 过期删除」为例:索引在 hot 状态写入并 rollover,7 天后转 warm(降副本并迁到 warm 节点),30 天后删除。

oc PUT "_plugins/_ism/policies/log_policy" -d '{
  "policy": {
    "description": "日志滚动写入 + 过期删除",
    "default_state": "hot",
    "states": [
      {
        "name": "hot",
        "actions": [
          { "rollover": { "min_size": "50gb", "min_index_age": "1d" } }
        ],
        "transitions": [
          { "state_name": "warm", "conditions": { "min_index_age": "7d" } }
        ]
      },
      {
        "name": "warm",
        "actions": [
          { "replica_count": { "number_of_replicas": 1 } },
          { "allocation": { "require": { "temp": "warm" } } }
        ],
        "transitions": [
          { "state_name": "delete", "conditions": { "min_index_age": "30d" } }
        ]
      },
      {
        "name": "delete",
        "actions": [ { "delete": {} } ],
        "transitions": []
      }
    ],
    "ism_template": {
      "index_patterns": ["log-*"],
      "priority": 100
    }
  }
}'

关注点:

  • rollover 触发条件(满足任一即可):min_size(索引大小)、min_primary_shard_size(主分片大小)、min_index_age(年龄)、min_doc_count(文档数)。
  • ism_template 让匹配 index_patterns 的新建索引自动绑定该策略,无需手动 add;priority 用于多个模板冲突时决定优先级。

2. 配置 rollover alias

严格来说,rollover alias 和 ISM 并没有必然的关联。原生的 rollover 是不会自动滚的,需要手动调用oc POST "log/_rollover" 来触发。
我们这里配置 rollover alias,是因为在 ISM 中使用了 rollover 来实现index 自动滚动。
由于上面的 ism_template中,我们指定了index_patternslog-*,所以 rollover 的配置,也要通过index_patterns来指定滚动符合log-* 的 index。
我们首先在索引模板里创建一个index 模板,其中:

  • index_patterns:表示这个模板,关联的是满足log-*格式的 index
  • settingsplugins.index_state_management.rollover_alias: "log" 告诉 ISM 用 log 这个 alias 做 rollover。
oc PUT "_index_template/log_template" -d '{
  "index_patterns": ["log-*"],
  "template": {
    "settings": {
      "plugins.index_state_management.rollover_alias": "log"
    }
  }
}'

接着,通过is_write_index 指定初始写入的 index:

oc PUT "log-000001" -d '{
  "aliases": { "log": { "is_write_index": true } }
}'

移除 alias

清除索引 setting 里的 rollover_alias(让 ISM 不再以该 alias 做滚动):

oc PUT "log-000001/_settings" -d '{
  "index.plugins.index_state_management.rollover_alias": null
}'

解除索引与 alias 的关联(让该 alias 不再指向这个索引):

oc POST "_aliases" -d '{
  "actions": [
    { "remove": { "index": "log-000001", "alias": "log" } }
  ]
}'

关注点:

  • rollover_alias 是索引 setting,清除要 PUT _settingsnull不是_aliases API。
  • _aliases API 的 remove 解除的是 alias 指针,跟 rollover_alias setting 是两个独立的东西——清掉前者不会自动清掉后者,反之亦然。
  • 想彻底断开 ISM 滚动 + alias 指向,需要两步:先 PUT _settingsrollover_alias,再 POST _aliases remove alias。
  • 如果只是想停掉写入、保留历史数据可查询,单独 remove alias 即可。

3. 手动绑定 / 移除策略

已存在的索引可手动绑定策略(新索引建议用 ism_template 自动绑定):

oc POST "_plugins/_ism/add/log-*" -d '{ "policy_id": "log_policy" }'

移除策略:

oc POST "_plugins/_ism/remove/log-*"

注意:_ism/add 不要用裸 *,会匹配到 .opendistro-security 等系统索引,若策略含 delete action 可能误删用户和角色,务必带前缀(如 log-*)。

查询 ISM 状态

查看索引的策略执行状态

oc GET "_plugins/_ism/explain/log-*?pretty"

返回每个索引当前所处的 state、绑定的 policy_id、正在执行的 action / step、是否失败等信息。排查「索引为什么没按预期 rollover / 删除」时优先看这个。
关注点:

  • state:索引当前所处状态(hot / warm / delete)。
  • action / step:正在执行的动作和步骤。
  • is_retrying / failed:是否在重试或已失败,失败时会有 info 字段说明原因。

查看该索引实际生效的策略内容(确认是不是最新版本):

oc GET "_plugins/_ism/explain/<index>?show_policy=true"

反向查询索引(例如:log-000001)绑定了某个策略:

oc GET "_plugins/_ism/explain/log-000001?pretty"

如果不知道策略名称,可以通过下面的命令获取:

oc GET "_plugins/_ism/policies?pretty"

查看策略定义

oc GET "_plugins/_ism/policies/log_policy?pretty"

查看某个策略的完整定义。查看所有策略:

oc GET "_plugins/_ism/policies?pretty"

重试失败的索引

索引执行 action 失败后会进入失败状态,修复原因后可手动重试:

oc POST "_plugins/_ism/retry/log-*"

调整 job 执行频率

调试时可将后台 job 调快(单位为分钟,默认 5):

oc PUT "_cluster/settings" -d '{
  "persistent": {
    "plugins.index_state_management.job_interval": 1
  }
}'

注意:集群状态为 red 时 ISM 不会执行 job;调快频率会增加集群负载,调试完建议改回 5。

参考文档