Elasticsearch索引健康状态为yellow的原因排查求助
Elasticsearch单节点环境下索引状态持续yellow的原因分析
核心原因
你用Docker运行的是单节点Elasticsearch实例,而Elasticsearch默认会给每个索引分配至少1个副本分片。根据ES的分片分配规则,副本分片绝对不能和对应的主分片部署在同一个节点上(避免单点故障时数据全部丢失),但你的环境只有一个节点,所以这些副本分片永远无法完成分配,导致所有索引的健康状态停留在yellow——yellow级别的含义就是:所有主分片都正常可用,但部分副本分片未分配。
结合你的测试情况拆解
重建索引后依然yellow:
你删除重建索引时没有指定分片配置,ES会使用默认模板创建索引,默认的副本分片数是1,所以新索引依然存在无法分配的副本,状态自然还是yellow。查询分片数无返回:
你执行的GET /_cat/indices/my-index-000001?v=true&h=index,shards里,shards不是_cat/indices接口的有效列名。正确的字段应该是pri(主分片数)和rep(副本分片数),换成这个命令就能看到分片信息:GET /_cat/indices/my-index-000001?v=true&h=index,pri,rep
解决方法
针对学习用的单节点环境,有几种方式可以解决这个问题:
- 临时修改现有所有索引的副本数:
执行以下命令把所有索引的副本数设为0,这样ES就不会再尝试分配副本,索引状态会变成green:PUT /_all/_settings { "number_of_replicas": 0 } - 新建索引时指定副本数:
创建新索引时明确设置副本数为0:PUT /my-new-index { "settings": { "number_of_replicas": 0 } } - 修改默认配置(永久生效):
如果是Docker部署,可以修改elasticsearch.yml配置文件,添加或修改:
重启ES容器后,新创建的索引都会默认使用0副本配置。index.number_of_replicas: 0
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

