在运行 Elasticsearch 集群遇到磁盘空间不足的情况时,Elasticsearch 会采取保护措施以防止数据丢失。 在执行写操作时,会抛出异常:cluster_block_exception
错误,特别是当错误消息表明索引被设置为只读模式时
错误信息
Caused by: java.lang.RuntimeException: ElasticsearchException[Elasticsearch exception [type=cluster_block_exception, reason=index [es_index] blocked by: [TOO_MANY_REQUESTS/12/disk usage exceeded flood-stage watermark, index has read-only-allow-delete
错误信息分析:
cluster_block_exception
:集群块异常,通常是由于某种保护机制触发的disk usage exceeded flood-stage watermark
:磁盘使用超过了"洪水阶段"水位线index has read-only-allow-delete block
:索引已被设置为只读模式,只允许删除操作
问题分析
Elasticsearch 使用磁盘水位线来确保磁盘空间不会用尽,从而导致写入数据丢失问题。默认情况下,Elasticsearch 设置了以下磁盘水位线:
- 低水位线(85%):当磁盘使用率超过此值时,Elasticsearch 不再为该节点分配新的分片。
- 高水位线(90%):当磁盘使用率超过此值时,Elasticsearch 会尝试将分片迁移到其他节点。
当磁盘使用率达到"洪水阶段"水位线(通常是 95%),Elasticsearch 会将索引设置为只读模式,防止更多的数据写入,以保护集群的稳定性和数据的安全性。
如何解决
-
释放磁盘空间:
-
增加磁盘容量:
-
调整 Elasticsearch 设置(不推荐):
-
修改磁盘水位线设置 :在
elasticsearch.yml
配置文件中,可以调整磁盘水位线设置。例如:yamlcluster.routing.allocation.disk.watermark.low: 75% cluster.routing.allocation.disk.watermark.high: 85% cluster.routing.allocation.disk.watermark.flood_stage: 95%
注意:过低的水位线可能导致频繁的分片迁移和性能问题
-
解决了 Elasticsearch 中的磁盘空间不足问题,并且磁盘使用率降回到低于"洪水阶段"水位线(默认95%),Elasticsearch 通常会自动恢复索引的写入权限
,这意味着一旦磁盘空间不再达到危险水平,Elasticsearch 会自动解除索引的只读状态,允许正常的写入操作。
手动解除只读模式(如果需要): 在一些情况下自动恢复没有按预期发生,可以手动解除索引的只读状态
json
PUT /my_index/_settings
{
"index.blocks.write": null
}