這個錯誤說明 Elasticsearch 的磁盤空間嚴重不足,已觸及最高級別(flood-stage
)的水位線。作為自我保護機制,Elasticsearch ?自動將受影響的索引設置為只讀模式 (read-only-allow-delete
)?,從而阻止寫入操作(包括索引新數據),只允許刪除操作。核心原因在于節點磁盤空間不足。以下是完整解決步驟:
1. ?確認磁盤使用狀況?
# 查看各節點磁盤使用率(ES API)
GET _cat/allocation?v&h=node,disk.percent,disk.used,disk.avail,disk.total,shards# 系統級檢查(在ES節點服務器執行)
df -h # 查看所有掛載點空間
du -sh /path/to/es/data/* # 定位大索引目錄
2. ?緊急釋放磁盤空間?
優先選項:通過ES API刪除數據
# 刪除指定索引(謹慎操作!)
DELETE /old_index-2020-*# 使用Curator工具自動化清理(推薦)
curator_cli --host 127.0.0.1 delete_indices --filter_list '[{"filtertype": "age","source": "creation_date","direction": "older","unit": "days","unit_count": 30},{"filtertype": "pattern","kind": "prefix","value": "logs-"}
]'
次選選項:清理ES日志 & 臨時文件
# 刪除ES日志(調整logging.yml避免過大日志)
rm /var/log/elasticsearch/*.log.* # 清理系統臨時文件
sudo apt-get clean # Debian/Ubuntu
sudo yum clean all # CentOS/RHEL
journalctl --vacuum-size=100M # 清理journal日志
?? 危險操作(僅在絕對必要時)
# 手動刪除索引文件(可能導致數據損壞)
# 先關閉ES服務!然后刪除大索引目錄
systemctl stop elasticsearch
rm -rf /data/elasticsearch/nodes/0/indices/old_index-2020-*
systemctl start elasticsearch
3. ?臨時解除索引只讀阻塞?
操作前確保已釋放足夠空間(建議超過low
水位線)。
PUT /.async-search/_settings
{"index.blocks.read_only_allow_delete": null
}
4. ?調整ES磁盤水位線?
在elasticsearch.yml
中設置更合理的閾值(根據實際磁盤容量調整):
# 緊急水位線(默認95%)
cluster.routing.allocation.disk.watermark.flood_stage: 90% # 高水位線(默認90%)
cluster.routing.allocation.disk.watermark.high: 85% # 低水位線(默認85%)
cluster.routing.allocation.disk.watermark.low: 80%
?重啟ES節點? 或 使用動態設置:
PUT _cluster/settings
{"transient": {"cluster.routing.allocation.disk.watermark.low": "80%","cluster.routing.allocation.disk.watermark.high": "85%","cluster.routing.allocation.disk.watermark.flood_stage": "90%","cluster.info.update.interval": "1m" # 檢查磁盤頻率}
}
5. ?長期預防措施?
?措施? | ?操作? |
---|---|
?監控告警? | 配置Prometheus + Grafana監控磁盤空間,設置85%使用率告警閾值 |
?定期維護? | 使用ILM (Index Lifecycle Management) 自動滾動刪除舊索引 |
?擴容磁盤? | 單節點擴展磁盤 或 增加新數據節點 |
?配置備份? | 使用Snapshot & Restore 備份到S3/NFS,定期刪除本地舊快照 |
?冷熱架構? | 部署熱節點(SSD)+ 冷節點(大容量HDD),通過index.routing.allocation 遷移數據 |
處理流程總結
?關鍵建議:?? 始終保留至少 ?20% 的磁盤空閑空間,避免ES觸發自我保護。定期清理舊數據 比 被動處理磁盤滿 更可靠!🚀