📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

为什么这个错误发生 #

cluster_block_exception 表示集群或索引被阻止执行某些操作。集群阻塞是一种保护机制,用于在特定情况下防止数据不一致或集群状态恶化。

这个错误可能由以下原因引起:

  1. 集群正在进行恢复:集群正在从数据恢复中,阻止写入操作
  2. 节点数量不足:候选主节点数量未达到法定人数
  3. 磁盘空间不足:磁盘水位线触发,阻止写入操作
  4. 索引正在创建或删除:索引处于中间状态
  5. 只读模式:索引或集群被设置为只读模式
  6. 快照正在进行:某些操作在快照执行期间被阻止
  7. 版本升级期间:集群升级过程中某些操作被阻止
  8. 分片分配被禁用:分片分配被手动禁用

如何修复这个错误 #

1. 检查阻塞状态 #

# 查看集群阻塞信息
GET /_cluster/state/blocks?pretty

# 查看索引阻塞信息
GET /<index>/_block?pretty

# 查看集群健康状态
GET /_cluster/health?pretty

2. 检查磁盘水位线 #

# 查看磁盘使用情况
GET /_cat/allocation?v

# 查看节点统计信息
GET /_nodes/stats/fs?pretty

3. 清理磁盘空间 #

如果磁盘空间不足:

# 删除旧索引
DELETE /<old_index>

# 清理已过期的快照
DELETE /_snapshot/<repo>/<snapshot>

# 减少副本数量以释放空间
PUT /<index>/_settings
{
  "index": {
    "number_of_replicas": 0
  }
}

4. 解除索引阻塞 #

# 删除索引的写阻塞
DELETE /<index>/_block/write

# 删除所有阻塞
DELETE /<index>/_block/write
DELETE /<index>/_block/metadata
DELETE /<index>/_block/read

5. 手动启用分片分配 #

如果分片分配被禁用:

# 启用分片分配
PUT /_cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": "all"
  }
}

6. 修改磁盘水位线设置 #

# 调整磁盘水位线(谨慎使用)
PUT /_cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.disk.watermark.low": "90%",
    "cluster.routing.allocation.disk.watermark.high": "95%",
    "cluster.routing.allocation.disk.watermark.flood_stage": "98%"
  }
}

# 解除洪水阶段阻塞
PUT /_all/_settings
{
  "index.blocks.read_only_allow_delete": null
}

7. 等待集群恢复 #

某些阻塞是临时的,等待集群状态恢复:

# 等待集群达到绿色状态
GET /_cluster/health?wait_for_status=green&timeout=50s

# 等待所有分片分配
GET /_cluster/health?wait_for_no_relocating_shards=true&timeout=50s

8. 检查并修复未分配的分片 #

# 查看未分配的分片
GET /_cat/shards?v&h=index,shard,prirep,state,unassigned.reason | grep UNASSIGNED

# 解释分片未分配的原因
GET /_cluster/allocation/explain

# 尝试重新分配分片
POST /_cluster/reroute?retry_failed=true

9. 处理恢复中的阻塞 #

# 查看恢复状态
GET /_cat/recovery?v

# 等待恢复完成
GET /_cluster/health?wait_for_no_initializing_shards=true&timeout=50s

10. 检查节点数量 #

# 查看候选主节点数量
GET /_cat/nodes?v&h=name,master

# 确保有足够的候选主节点
# 通常建议至少 3 个候选主节点

预防措施 #

  • 监控磁盘使用情况,提前清理或扩容
  • 配置合理的磁盘水位线阈值
  • 确保集群有足够数量的候选主节点
  • 在非高峰时段执行大型操作(如快照、重建索引)
  • 定期检查集群健康状态
  • 配置集群监控告警
  • 避免在生产环境中频繁修改集群设置
  • 使用索引生命周期管理(ILM)自动管理索引