OpenSearch 常见运维指南
/ 点击 / 阅读耗时 32 分钟基础知识
背景知识
- 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 中,对应字段的类型必须匹配。
- 如果mapping 指定
- 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"
安全提示:
export OS_PASSWORD=...会将密码留在 shell history 中,共享机器上建议改用更安全的方式(如写入权限为 600 的配置文件,或交互式输入)oc函数中的-sk跳过了 TLS 证书校验,仅适用于内网/测试环境,生产环境建议配置合法证书并去掉-k
常用排查命令
排查命令按 API 端点分类整理,便于按需查阅。
通用操作
大部分的接口支持在带上v 和 h两个参数。其中,v 表示返回中第一行是数值说明,类似于加了一个表头。h用于选择特定的列,例如h=status,node.total代表了只返回status 和node.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"
重点关注 write 和 search 线程池的 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。
- 修改配置(示例:调整磁盘水位线):
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%"
}
}'
- 重置某个配置为默认值(传
null):
oc PUT "_cluster/settings" -d '{
"persistent": {
"cluster.routing.allocation.disk.watermark.low": null
}
}'
- 查看当前配置(含默认值):
oc GET "_cluster/settings?include_defaults=true&flat_settings=true"
节点下线
节点下线前需要先迁出该节点上的 shard,避免数据丢失或集群状态异常。
- 通过 allocation exclude 触发 shard 迁移:
oc PUT "_cluster/settings" -d '{
"transient": {
"cluster.routing.allocation.exclude._name": "node-1"
}
}'
也可以按其他维度排除:_ip(IP)、_host(主机名)、_attr(自定义属性)。
- 观察该节点 shard 数是否降到 0:
oc GET "_cat/allocation?v"
确认 shard 全部迁出后,再关闭该节点的 OpenSearch 进程。
如果只是临时重启,节点重新加入后记得清空排除配置:
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)。
- 将索引只分配到带指定属性的节点(
require,必须全部匹配):
oc PUT "<index>/_settings" -d '{
"index.routing.allocation.require.temp": "warm"
}'
该索引的 shard 只会被分配到设置了 node.attr.temp: warm 的节点上。
- 允许分配到带指定属性的节点之一(
include,满足其一即可):
oc PUT "<index>/_settings" -d '{
"index.routing.allocation.include.temp": "warm,hot"
}'
- 排除特定节点(
exclude,匹配到的不分配):
oc PUT "<index>/_settings" -d '{
"index.routing.allocation.exclude._name": "node-1"
}'
- 解除分配策略(传
null):
oc PUT "<index>/_settings" -d '{
"index.routing.allocation.require.temp": null
}'
- 查看索引当前的分配策略:
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_patterns 是 log-*,所以 rollover 的配置,也要通过index_patterns来指定滚动符合log-* 的 index。
我们首先在索引模板里创建一个index 模板,其中:
index_patterns:表示这个模板,关联的是满足log-*格式的 indexsettings:plugins.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 _settings传null,不是用_aliasesAPI。_aliasesAPI 的remove解除的是 alias 指针,跟rollover_aliassetting 是两个独立的东西——清掉前者不会自动清掉后者,反之亦然。- 想彻底断开 ISM 滚动 + alias 指向,需要两步:先
PUT _settings清rollover_alias,再POST _aliasesremove alias。 - 如果只是想停掉写入、保留历史数据可查询,单独
removealias 即可。
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。
参考文档
- OpenSearch 官方文档
- OpenSearch 中文文档 (中文文档会比官方英文文档落后若干个小版本,涉及生产环境变更请阅读官方文档复核)