背景
在运行 Elasticsearch 集群的过程中,磁盘空间的使用情况对集群的健康和性能至关重要。当磁盘使用量达到一定的阈值时,Elasticsearch 会触发相应的flood机制,阻止写入操作,以防止磁盘被填满并导致数据丢失。
在这篇文章中,我们探讨了如何处理 Elasticsearch 集群中 "TOO_MANY_REQUESTS/12/disk usage exceeded flood-stage watermark" 错误。这一错误通常出现在磁盘使用量超过了 "flood stage" 阈值(通常是 95%)的情况下。为了确保集群的稳定运行,我们需要采取措施减小磁盘使用量或调整磁盘水印设置,以避免写操作被阻止。
通过清理旧数据、创建快照并删除旧索引、增加磁盘空间或调整disk watermark设置,我们可以有效缓解磁盘空间不足带来的问题。此外,还可以检查和优化索引设置,减少副本数量,进一步降低磁盘使用率。
这些措施不仅可以帮助恢复集群的正常运行,还可以为未来的磁盘管理提供参考,确保 Elasticsearch 集群在高效、稳定的环境下运行。
查看ILM状态
GET _ilm/policy
查找有问题的索引
GET /_all/_ilm/explain?only_errors=true
错误信息 "TOO_MANY_REQUESTS/12/disk usage exceeded flood-stage watermark" 表示磁盘使用量已经超过了 Elasticsearch 设置的 "flood stage" 阈值。这个阈值通常是磁盘使用量的 95%。当磁盘使用量超过此阈值时,Elasticsearch 将阻止任何写操作,以保护集群免于进一步填满磁盘空间并导致数据丢失。
解决方法
要解决这个问题,需要减小磁盘使用量。以下是一些可能的解决方法:
-
清理旧数据:
-
删除不再需要的索引或文档。
-
使用以下命令删除指定索引:
DELETE /index_name
-
例如,删除名为
old-index
的索引:
DELETE /old-index
-
-
快照和删除:
-
对旧索引进行快照(备份),然后删除它们以释放磁盘空间。
-
创建快照:
PUT /_snapshot/my_backup/snapshot_1 { "indices": "index_1,index_2", "ignore_unavailable": true, "include_global_state": false }
-
删除旧索引:
DELETE /index_1 DELETE /index_2
增加磁盘空间:
- 添加新的磁盘到集群的节点,或者增加现有磁盘的容量。
调整 Elasticsearch 的disk.watermark磁盘设置:
查看磁盘的使用设置:
GET /_cluster/settings?include_defaults
disk.watermark.flood_stage
和 disk.watermark.high
都设置为相同的值(例如 95%),将会导致以下问题:
缺乏缓冲:high
和 flood_stage
通常应该有一定的差距,以确保在 high
被触发后,有足够的时间和空间进行分片迁移。如果它们相等,一旦达到这个阈值,Elasticsearch 就会立即阻止写操作,没有时间进行迁移操作。
写操作立即停止:当磁盘使用量达到 95% 时,Elasticsearch 将会立即停止所有写操作,因为 flood_stage
被触发。这可能会导致应用程序的写操作失败,影响正常业务。
无法进行预警:high
通常用作预警系统,让管理员有时间采取行动(如增加磁盘空间或删除旧数据)。如果 high
和 flood_stage
相等,管理员将没有预警时间来处理问题。
-
这只是一个临时解决方案,并不能根本解决磁盘空间不足的问题。可以稍微提高水印阈值,以便有更多时间来清理磁盘空间:
PUT /_cluster/settings { "transient": { "cluster.routing.allocation.disk.watermark.flood_stage": "98%", "cluster.routing.allocation.disk.watermark.high": "95%", "cluster.routing.allocation.disk.watermark.low": "85%", "cluster.info.update.interval": "1m" } }
-
检查和优化索引设置:
减小索引副本数:
``` PUT /index_name/_settings { "number_of_replicas": 1 } ```
例如,将名为
``` my-index ``` 的索引副本数设置为 1: ``` PUT /my-index/_settings { "number_of_replicas": 1 } ```
检查磁盘使用情况
要检查集群中每个节点的磁盘使用情况,可以使用以下命令:
GET /_cat/allocation?v
这将返回每个节点的磁盘使用情况和总空间。