
Elasticsearch由于磁盘满了,导致索引有部分分片处于未分配的状态,由于清理空间或者扩容晚了,当磁盘有富余的时候,索引的分片不会自动恢复了,怎么办?(建议ES前面加个缓冲,比如Kafka,这样会临时堆积在Kafka避免期间数据丢失)

我们可以参考以下几个步骤来解决这个问题。
1. 确认磁盘空间已恢复
• 检查当前磁盘使用率是否低于 磁盘水位线阈值(默认 cluster.routing.allocation.disk.watermark.low
为 85%,high
为 90%)。• 若磁盘空间仍不足,需清理历史数据(如删除旧索引)或扩容磁盘,确保磁盘利用率低于阈值。
2. 检查分片自动分配设置
• 确保集群启用了分片自动分配: GET _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "all"
}
}• 若未启用,需动态更新配置为 "all"
。
3. 调整磁盘水位线阈值
若磁盘空间接近阈值但仍低于默认值,可临时调高水位线以允许分配:
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.disk.watermark.low": "90%",
"cluster.routing.allocation.disk.watermark.high": "95%"
}
}
• 长期运行时需避免磁盘再次打满,也可以修改为具体值比如100G。
4. 检查分片状态
使用 _shard_stores
API 查看分片是否损坏:
GET /_shard_stores
• 若分片存储已损坏,需通过快照恢复或副本重建。
5. 强制重新平衡集群
触发集群重新平衡,尝试重新分配所有失败的分片:
POST /_cluster/reroute?retry_failed
7. 其他方法
• 临时修改索引副本为0,再恢复为1:若仅仅是副本分片不可用,可以把对应索引的副本设置为0,然后再修改为1,这样es会重新初始化副本分片。
文章转载自运维笔谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




