OpenSearch暖索引数据更新策略及执行报错问题咨询
OpenSearch暖索引数据更新策略及磁盘水位线报错解决
先解决当前_update_by_query执行失败的问题
报错明确提示磁盘使用率超过洪水阶段水位线,索引被设置为只读允许删除状态,解决步骤如下:
- 临时解除索引只读限制
执行以下命令移除只读锁:
PUT /_all/_settings { "index.blocks.read_only_allow_delete": null }
- 释放磁盘空间
- 删除不再需要的旧索引(尤其是冷/归档索引)
- 扩容集群磁盘容量
- 迁移部分索引到其他存储节点
- 调整磁盘水位线配置(可选)
如果当前水位线设置过于严格,可通过动态命令修改集群配置(无需重启节点):
PUT /_cluster/settings { "persistent": { "cluster.routing.allocation.disk.watermark.flood_stage": "90%", "cluster.routing.allocation.disk.watermark.high": "85%", "cluster.routing.allocation.disk.watermark.low": "80%" } }
也可修改elasticsearch.yml文件后重启节点生效,参数值可根据实际存储情况调整。
暖索引的数据更新策略
暖索引通常是访问频率较低但仍需偶尔更新的索引,针对这类索引的更新,推荐以下策略:
- 批量延迟更新:将多个零散的更新请求合并,通过
_bulk或_update_by_query批量执行,减少集群的IO开销和资源占用 - 低峰时段更新:选择集群负载较低的时间段(如凌晨)执行更新操作,避免影响正常的查询业务
- 定向分片更新:如果暖索引是按时间或业务维度分片的,仅针对需要更新的分片执行操作,避免全索引扫描更新
- 临时热节点迁移更新:将需要更新的暖索引临时迁移到性能更高的热节点上执行更新,完成后再迁回暖节点,提升更新效率
- 版本冲突处理:在更新时启用冲突跳过机制,比如在
_update_by_query中添加conflicts=proceed参数,避免因版本冲突导致整个更新任务失败:
POST mobile-data-2023-11-14/_update_by_query?conflicts=proceed { "script": { "id": "update-script", "params": { "status" : "passed" } }, "query": { "match": { "test_id": "APPTESRqeDGY143KiCDYjD" } } }
- 避免频繁小更新:尽量合并多次小更新为单次大更新,减少对暖索引所在节点的频繁IO操作,延长存储介质寿命
内容的提问来源于stack exchange,提问作者mayank vardani
相关产品推荐
相关产品推荐

