RED 状态

2. RED 状态还能修复吗?

答案是:大多数情况下可以修复,但取决于根本原因。

  • 可修复的情况:

    • 节点临时下线后重新启动。

    • 磁盘空间清理后。

    • 分片分配被禁用后重新启用。

    • 主分片损坏,但存在一个完好的副本分片(此时该副本分片可以提升为新的主分片)。

  • 难以修复或可能造成数据丢失的情况:

    • 承载主分片的节点永久丢失,并且该分片的所有副本也同时丢失(即该分片的全部数据副本都损毁了)。

    • Lucene 索引文件严重损坏,且没有可用的副本。

重要提示:集群处于 RED 状态意味着你已经部分丢失数据了。虽然集群可能仍在为其他健康的分片提供服务,但红色索引上的读写操作会失败。这是一个需要立即处理的严重故障。


3. 怎么修复?(诊断与修复步骤)

请按照以下逻辑步骤进行排查和修复:

第一步:诊断 - 找出问题根源

  1. 查看集群健康状态:

    bash
    GET _cluster/health

    关注 number_of_nodesactive_primary_shardsactive_shardsunassigned_shards, 以及具体是哪个索引变红了。

  2. 查看未分配的分片:

    bash
    GET _cat/shards?v=true&h=index,shard,prirep,state,node,unassigned.reason&s=state

    这会列出所有分片,并过滤出状态为 UNASSIGNED 的分片。prirep 字段会告诉你它是主分片(p)还是副本分片(r)。重点关注 UNASSIGNED 的主分片。unassigned.reason 字段会给出未分配的原因。

  3. 查看分片分配解释:
    对于特定的未分配分片,可以使用 Allocation Explain API 来获取详细原因。

    bash
    GET _cluster/allocation/explain
    {
      "index": "your_red_index_name",
      "shard": 0,
      "primary": true
    }

    这个命令的输出是修复的关键! 它会明确告诉你:

    • 无法分配的原因(如 node_leftdisk_usage_exceededcorrupt_index 等)。

    • 正在尝试将其分配到哪个节点,以及为什么失败。

第二步:修复 - 根据原因采取行动

场景A:节点离线

  • 行动:重启离线的节点。一旦节点重新加入集群,它会自动恢复其持有的分片。

  • 如果节点永久丢失,你需要让集群意识到这一点,以便它将可用的副本分片提升为主分片。这可以通过延迟超时自动完成,或者手动执行:

    bash
    PUT _cluster/settings
    {
      "persistent": {
        "cluster.routing.allocation.enable": "all"
      }
    }

    (确保分片分配没有被禁用)集群在等待一段时间(默认1分钟)后,会开始将未分配的分片重新分配到其他健康节点上。

场景B:磁盘空间不足

  • 行动:

    1. 清理磁盘空间(删除旧日志、备份文件,或扩容磁盘)。

    2. 也可以临时调高磁盘水位线(不推荐长期使用):

      bash
      PUT _cluster/settings
      {
        "transient": {
          "cluster.routing.allocation.disk.watermark.low": "90%",
          "cluster.routing.allocation.disk.watermark.high": "95%",
          "cluster.routing.allocation.disk.watermark.flood_stage": "98%"
        }
      }
    3. 空间释放后,分片会自动重新分配。

场景C:分片数据损坏

这是最棘手的情况。

  1. 首选方案:从副本恢复。如果损坏的是主分片,但存在一个完好的副本,你可以通过重启节点或手动重路由,让集群将完好的副本提升为主分片。

  2. 最终手段:强制分配空分片(会丢失数据!)。如果确认该分片的数据已经无法恢复,且可以接受该分片的数据丢失,可以强制分配一个空分片。此操作不可逆,务必谨慎!

    bash
    POST _cluster/reroute?pretty
    {
      "commands": [
        {
          "allocate_stale_primary": {
            "index": "your_red_index_name",
            "shard": 0,
            "node": "target_node_name",
            "accept_data_loss": true
          }
        }
      ]
    }

    这个命令会强制在指定节点上分配一个“陈旧”的主分片(可能丢失数据),并开始重建副本。

  3. 如果以上都不行,从快照恢复。如果你有定期的快照(Snapshot)备份,这是最好的选择。删除损坏的索引,然后从最近的快照中恢复它。

场景D:分配被禁用

  • 行动:启用分配。

    bash
    PUT _cluster/settings
    {
      "persistent": {
        "cluster.routing.allocation.enable": "all"
      }
    }

总结与预防

  • 预防胜于治疗:

    • 为生产环境配置至少 3 个主节点节点,并分散在不同可用区。

    • 为每个索引设置足够数量的副本分片(number_of_replicas >= 1),确保主分片和它的副本不在同一个节点上。

    • 设置磁盘使用率监控和警报。

    • 定期执行快照备份,这是数据安全的最后防线。

    • 合理规划分片大小和数量,避免过大或过小。

当出现 RED 状态时,保持冷静,按照 诊断 -> 根据原因修复 的流程操作,优先使用无数据损失的方案,最后才考虑强制分配等有损操作。

posted @ 2025-11-12 14:13  滴滴滴  阅读(11)  评论(0)    收藏  举报