--- title: "集群阻塞异常 (cluster_block_exception) 错误排查与解决" date: 2026-03-10 lastmod: 2026-03-10 description: "cluster_block_exception 表示集群或索引被阻止执行某些操作,通常由磁盘空间不足、节点数量不足或分片分配被禁用引起。" tags: ["集群", "磁盘空间", "分片分配", "水位线"] summary: "为什么这个错误发生 # cluster_block_exception 表示集群或索引被阻止执行某些操作。集群阻塞是一种保护机制,用于在特定情况下防止数据不一致或集群状态恶化。 这个错误可能由以下原因引起: 集群正在进行恢复:集群正在从数据恢复中,阻止写入操作 节点数量不足:候选主节点数量未达到法定人数 磁盘空间不足:磁盘水位线触发,阻止写入操作 索引正在创建或删除:索引处于中间状态 只读模式:索引或集群被设置为只读模式 快照正在进行:某些操作在快照执行期间被阻止 版本升级期间:集群升级过程中某些操作被阻止 分片分配被禁用:分片分配被手动禁用 如何修复这个错误 # 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." --- ## 为什么这个错误发生 `cluster_block_exception` 表示集群或索引被阻止执行某些操作。集群阻塞是一种保护机制,用于在特定情况下防止数据不一致或集群状态恶化。 这个错误可能由以下原因引起: 1. **集群正在进行恢复**:集群正在从数据恢复中,阻止写入操作 2. **节点数量不足**:候选主节点数量未达到法定人数 3. **磁盘空间不足**:磁盘水位线触发,阻止写入操作 4. **索引正在创建或删除**:索引处于中间状态 5. **只读模式**:索引或集群被设置为只读模式 6. **快照正在进行**:某些操作在快照执行期间被阻止 7. **版本升级期间**:集群升级过程中某些操作被阻止 8. **分片分配被禁用**:分片分配被手动禁用 ## 如何修复这个错误 ### 1. 检查阻塞状态 ```bash # 查看集群阻塞信息 GET /_cluster/state/blocks?pretty # 查看索引阻塞信息 GET //_block?pretty # 查看集群健康状态 GET /_cluster/health?pretty ``` ### 2. 检查磁盘水位线 ```bash # 查看磁盘使用情况 GET /_cat/allocation?v # 查看节点统计信息 GET /_nodes/stats/fs?pretty ``` ### 3. 清理磁盘空间 如果磁盘空间不足: ```bash # 删除旧索引 DELETE / # 清理已过期的快照 DELETE /_snapshot// # 减少副本数量以释放空间 PUT //_settings { "index": { "number_of_replicas": 0 } } ``` ### 4. 解除索引阻塞 ```bash # 删除索引的写阻塞 DELETE //_block/write # 删除所有阻塞 DELETE //_block/write DELETE //_block/metadata DELETE //_block/read ``` ### 5. 手动启用分片分配 如果分片分配被禁用: ```bash # 启用分片分配 PUT /_cluster/settings { "persistent": { "cluster.routing.allocation.enable": "all" } } ``` ### 6. 修改磁盘水位线设置 ```bash # 调整磁盘水位线(谨慎使用) 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. 等待集群恢复 某些阻塞是临时的,等待集群状态恢复: ```bash # 等待集群达到绿色状态 GET /_cluster/health?wait_for_status=green&timeout=50s # 等待所有分片分配 GET /_cluster/health?wait_for_no_relocating_shards=true&timeout=50s ``` ### 8. 检查并修复未分配的分片 ```bash # 查看未分配的分片 GET /_cat/shards?v&h=index,shard,prirep,state,unassigned.reason | grep UNASSIGNED # 解释分片未分配的原因 GET /_cluster/allocation/explain # 尝试重新分配分片 POST /_cluster/reroute?retry_failed=true ``` ### 9. 处理恢复中的阻塞 ```bash # 查看恢复状态 GET /_cat/recovery?v # 等待恢复完成 GET /_cluster/health?wait_for_no_initializing_shards=true&timeout=50s ``` ### 10. 检查节点数量 ```bash # 查看候选主节点数量 GET /_cat/nodes?v&h=name,master # 确保有足够的候选主节点 # 通常建议至少 3 个候选主节点 ``` ### 预防措施 - 监控磁盘使用情况,提前清理或扩容 - 配置合理的磁盘水位线阈值 - 确保集群有足够数量的候选主节点 - 在非高峰时段执行大型操作(如快照、重建索引) - 定期检查集群健康状态 - 配置集群监控告警 - 避免在生产环境中频繁修改集群设置 - 使用索引生命周期管理(ILM)自动管理索引