三节点集群,索引 6 个主分片 1 副本,_cluster/health 里 status 是 yellow,unassigned_shards 12。新建的索引放到第二天还是 12 个,节点数和磁盘都没变化。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,副本必须落在和主分片不同的节点上,分配时还要看节点属性、磁盘水位和 allocation 开关。节点数不够,或者某个节点被 exclude 掉,副本就一直排队等。主分片本身是好的,不用重建数据。
「副本分片未分配」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。报错里带路径的,先去看那个路径在不在、权限对不对。
GET _cluster/health?pretty
POST _cluster/allocation/explain
{"index": "orders_v3", "shard": 2, "primary": false}
同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
具体做法是,用 allocation/explain 指定一个未分配分片 看它给出哪条拒绝理由;核对 number_of_replicas 是否超过可用节点数减一 超了就下调;确认没有手工 exclude 或 total_shards_per_node 卡住;磁盘水位过 85% 先扩盘或清索引 再让分配器重试。
最后用这个标准收尾,allocation/explain 里该分片从 unassigned 变成 started,health 的 status 回到 green。
