OpenSearch 集群生产运维、分片治理与数据恢复
OpenSearch 集群的稳定性核心是分片。索引过多、分片过小、热点写入、磁盘水位、Heap 压力和错误的恢复操作,都会让集群从黄色迅速变成红色。本文专注 OpenSearch 集群本身,覆盖架构、容量、分片、性能、快照、升级和数据恢复,不重复日志采集平台内容。
allocate_stale_primary、allocate_empty_primary、强制 reroute 和直接删除索引都可能造成永久数据丢失。执行前必须确认快照、可用副本和业务影响,并优先使用dry_run与explain。
一、理解节点与集群状态
常见节点角色:
- Cluster Manager:维护集群状态和分片分配;
- Data:存放分片并处理查询和写入;
- Ingest:执行 Pipeline;
- Coordinating:接收请求、分发并汇总;
- Search/ML等专用角色。
小集群可混合角色,大规模生产建议将集群管理、数据和入口职责拆开,避免大查询或GC拖慢选举。
二、集群健康不只看颜色
curl -s http://localhost:9200/_cluster/health?pretty
curl -s http://localhost:9200/_cat/nodes?v
curl -s http://localhost:9200/_cat/indices?v
curl -s http://localhost:9200/_cat/shards?v
- Green:主分片与副本都已分配;
- Yellow:主分片可用,但至少一个副本未分配;
- Red:至少一个主分片不可用,部分数据无法访问。
还应检查 pending tasks、active shards、relocating、initializing、unassigned、节点数量和最近选举。
三、分片容量模型
分片太多会增加 Heap、文件句柄、集群状态和恢复开销;分片太大则迁移、恢复和查询并行受限。没有适合所有场景的固定分片大小。
评估:
- 每日写入量;
- 保留周期;
- 单文档大小;
- 查询并发和时间范围;
- 节点磁盘和网络;
- 恢复时间目标;
- 副本数量;
- Segment 数量。
用 Index Template、ISM、Rollover 和 Data Stream 控制生命周期,避免每天无论数据量大小都创建固定数量分片。
四、主分片数量不可随意修改
索引创建后的主分片数不能直接修改,只能通过 reindex、split 或 shrink 等方式重构。上线前应按增长和恢复目标设计,并为未来 rollover 留出调整空间。
副本数可动态调整,但增加副本会占用磁盘和恢复带宽。单节点集群配置副本必然长期 Yellow。
五、分片未分配排查
curl -s -X GET http://localhost:9200/_cluster/allocation/explain?pretty \
-H 'Content-Type: application/json' \
-d '{}'
常见 decider:
- disk_threshold:磁盘水位;
- awareness:故障域约束;
- same_shard:同一节点已有副本;
- filter:include/exclude/require;
- max_retry:重复恢复失败;
- throttling:恢复并发限制;
- node_version:版本不兼容;
- snapshot_in_progress:快照阻止移动。
先解释为什么不分配,再处理根因。不要看到 Yellow 就反复 reroute。
六、磁盘水位
OpenSearch 根据 low、high、flood stage 水位控制分片分配和索引写入。达到 flood stage 时索引可能被设置只读保护。
curl -s http://localhost:9200/_cluster/settings?include_defaults=true&pretty
curl -s http://localhost:9200/_cat/allocation?v
处理顺序:
- 停止异常写入和大规模重试;
- 找到增长最快索引;
- 清理过期数据应通过索引生命周期和API;
- 扩容或迁移分片;
- 容量恢复后解除只读;
- 调整保留和告警。
不要直接删除节点数据目录释放空间。
七、Heap、GC与系统内存
Heap 主要承担集群状态、缓存、聚合和请求对象;Lucene 文件依赖操作系统页缓存。把全部内存分给 JVM 反而会降低性能。
监控:
- Heap 使用和GC停顿;
- Old Gen增长;
- Circuit Breaker;
- JVM线程;
- Page Cache;
- Swap;
- 节点 OOM。
生产通常关闭 Swap 或严格控制交换。Heap 大小遵循官方和实际工作负载建议,不能简单随物理内存无限增大。
八、写入性能
影响写入的因素:
- Bulk 大小和并发;
- Refresh Interval;
- 副本数;
- Pipeline处理;
- Mapping复杂度;
- 动态字段爆炸;
- Segment Merge;
- 磁盘延迟;
- 热点 Routing。
Bulk 不是越大越好。应按响应大小、队列、Heap和P99确定批次,并对 429 采用退避。
九、Mapping与字段治理
动态字段失控会扩大 Cluster State 和 Heap。应:
- 使用显式模板;
- 控制
total_fields.limit; - 区分 keyword 与 text;
- 避免把唯一ID作为聚合字段;
- 控制 nested 对象;
- 对未知字段使用 flattened 等合适类型;
- 版本化 Mapping;
- 变更前验证兼容性。
字段类型不能原地随意更改,通常需要新索引和 Reindex。
十、查询与聚合排障
curl -s http://localhost:9200/_nodes/hot_threads
curl -s http://localhost:9200/_tasks?detailed=true&actions=*search
高风险查询:
- 深分页;
- 高基数字段聚合;
- 前导通配符和复杂正则;
- Script;
- 大范围无时间过滤;
- 大量 nested;
- 返回超大
_source。
使用 Search After、Point in Time、Source Filtering 和聚合限制。不要依赖提高超时掩盖慢查询。
十一、热点分片
热点可能由单一 Routing、写入时间集中、分片不均或单个大客户造成。
检查:
curl -s http://localhost:9200/_cat/shards?v&s=store:desc
curl -s http://localhost:9200/_nodes/stats?pretty
治理可包括重新设计 Routing、增加合理主分片、Rollover、迁移热点、限制租户和拆分索引。新增节点不会自动解决不合理 Routing。
十二、Segment与Merge
写入先形成 Segment,后台 Merge 合并。大量小 Segment 会增加搜索和文件句柄;Merge 会消耗磁盘吞吐。
关注:
- Segment 数量和内存;
- Merge 时间与节流;
- 磁盘吞吐;
- Refresh频率;
- Force Merge风险。
Force Merge 适合只读冷索引,不应在持续写入索引和高峰期随意执行。
十三、线程池与拒绝
curl -s http://localhost:9200/_cat/thread_pool?v
Search、Write、Get 等线程池出现 rejected 说明节点来不及处理。先治理请求、查询和容量,不要直接无限增大队列;大队列会把快速失败变成长时间超时,并增加内存压力。
十四、快照与恢复
快照是可靠备份方式,直接复制节点数据目录不是一致备份。
curl -X PUT http://localhost:9200/_snapshot/repository_name \
-H 'Content-Type: application/json' -d '{...}'
curl -X PUT http://localhost:9200/_snapshot/repository_name/snapshot_name?wait_for_completion=false
快照为增量共享数据,删除必须使用 Snapshot API,不能直接删除存储后端文件。
恢复演练:
- 新建隔离集群;
- 注册只读仓库;
- 恢复指定索引;
- 验证文档量、时间范围、Mapping和查询;
- 记录恢复速度;
- 验证安全配置和别名。
十五、红色集群恢复
- 保存 health、allocation explain、节点与分片信息;
- 确认缺失主分片的数据副本;
- 检查节点是否临时离线、磁盘满或版本不兼容;
- 优先让含有效分片的原节点恢复;
- 若有快照,评估从快照恢复;
- 只有不存在有效副本和快照时才评估接受数据丢失的强制分配。
allocate_empty_primary 会创建空主分片,旧数据可能被覆盖,应作为最后手段并经过业务批准。
十六、滚动升级
升级前:
- 阅读版本兼容和弃用;
- 完成快照并验证;
- 集群 Green;
- 预留磁盘和恢复带宽;
- 插件与客户端兼容;
- 先升级非Cluster Manager节点;
- 每个节点回归后等待稳定。
可延迟分片分配避免短暂重启触发大规模恢复,但升级后必须恢复设置。混合版本只应存在于升级窗口。
十七、安全治理
- TLS保护节点间与客户端通信;
- 管理账号和应用账号分离;
- 索引、文档和字段级权限按需启用;
- Dashboard不暴露公网;
- 审计日志脱敏;
- 快照仓库凭据最小权限;
- 禁止应用访问危险集群API;
- 定期轮换证书和密钥。
十八、监控清单
- 集群状态、节点和选举;
- 主/副分片、Unassigned和Relocation;
- 磁盘水位和增长;
- Heap、GC、Circuit Breaker和OOM;
- 写入/查询速率、P95/P99和拒绝;
- Bulk失败和429;
- Segment、Merge、Refresh和Flush;
- 快照成功、时长和仓库容量;
- Thread Pool、Pending Task和Hot Thread;
- 每租户用量与热点。
十九、上线检查清单
- [ ] Cluster Manager节点和故障域合理;
- [ ] 索引模板、Rollover和保留策略已定义;
- [ ] 分片大小、数量和副本经过容量验证;
- [ ] Mapping受控,防止字段爆炸;
- [ ] Bulk、查询和租户有并发与限流;
- [ ] 磁盘水位、Heap、拒绝和分片异常有告警;
- [ ] 快照仓库独立并通过恢复演练;
- [ ] 滚动升级和插件兼容经过验证;
- [ ] 危险API被权限控制和审计;
- [ ] Red、节点丢失、磁盘满和热点场景已演练。
二十、结语
OpenSearch 运维的核心是让分片数量、磁盘空间、Heap和查询成本保持在可恢复边界内。出现异常时先解释分片为什么不能分配,再修复根因;真正的数据保护依靠快照和恢复演练,而不是复制数据目录或依赖副本永远存在。
参考资料
- OpenSearch Documentation:https://docs.opensearch.org/latest/
- Snapshot and Restore:https://docs.opensearch.org/latest/tuning-your-cluster/availability-and-recovery/snapshots/snapshot-restore/