Press "Enter" to skip to content

Kibana 启动卡在 “Kibana server is not ready yet”?问题排查与解决实录

一、问题背景

你是否也遇到过这样的场景:启动 Kibana 后,满怀期待地打开浏览器,却只看到一句冰冷的提示——“Kibana server is not ready yet”。页面不断刷新,后台日志也不再滚动,Kibana 仿佛陷入了“假死”状态。

最近,我就遇到了这个典型问题。本文将完整复盘从发现问题、分析日志、定位根源到最终解决的全过程,并提炼出一套通用的排查思路,希望能帮助遇到类似问题的朋友快速脱困。

核心症状:

  1. 浏览器访问 Kibana (默认 5601 端口) 持续显示 Kibana server is not ready yet
  2. Kibana 启动日志在打印到某个阶段后停止更新,没有崩溃退出,也没有成功启动的提示。

二、初步分析:解读 Kibana 日志

解决问题的第一步,永远是看日志。日志是系统留下的最直接、最宝贵的线索。

以下是我遇到的关键启动日志片段:

...
{"type":"log","@timestamp":"2025-08-05T14:27:05+08:00","tags":["info","savedobjects-service"],"pid":2108,"message":"Waiting until all Elasticsearch nodes are compatible with Kibana before starting saved objects migrations..."}
{"type":"log","@timestamp":"2025-08-05T14:27:05+08:00","tags":["info","savedobjects-service"],"pid":2108,"message":"Starting saved objects migrations"}
...
{"type":"log","@timestamp":"2025-08-05T14:27:06+08:00","tags":["info","savedobjects-service"],"pid":2108,"message":"[.kibana] Migration completed after 3442ms"}
...
{"type":"log","@timestamp":"2025-08-05T14:27:06+08:00","tags":["error","savedobjects-service"],"pid":2108,"message":"[.kibana_task_manager] Action failed with 'search_phase_execution_exception: '. Retrying attempt 1 in 2 seconds."}
{"type":"log","@timestamp":"2025-08-05T14:27:08+08:00","tags":["error","savedobjects-service"],"pid":2108,"message":"[.kibana_task_manager] Action failed with 'search_phase_execution_exception: '. Retrying attempt 2 in 4 seconds."}
{"type":"log","@timestamp":"2025-08-05T14:27:12+08:00","tags":["error","savedobjects-service"],"pid":2108,"message":"[.kibana_task_manager] Action failed with 'search_phase_execution_exception: '. Retrying attempt 3 in 8 seconds."}
...

通过日志,我们可以提炼出两条关键信息:

  1. Kibana 卡在了哪个环节?
    日志明确显示,Kibana 在执行 “Saved Objects Migrations”(保存对象迁移) 步骤。这个步骤是 Kibana 启动时为了确保其内部索引(如 .kibana.kibana_task_manager 等)的结构与当前版本兼容。日志显示 .kibana 索引迁移成功了,但轮到 .kibana_task_manager 时就出错了。

  2. 具体是什么错误?
    错误信息是 [.kibana_task_manager] Action failed with 'search_phase_execution_exception: '。这个错误非常关键:

    • search_phase_execution_exception 不是 Kibana 自身的错误,而是它向 Elasticsearch 发起查询请求后,Elasticsearch 返回的错误
    • 这说明,问题根源不在 Kibana,而在 Elasticsearch。Kibana 作为一个“客户端”,无法从 Elasticsearch 的 .kibana_task_manager 索引中正常查询数据,导致迁移任务卡住并不断重试,最终使整个启动流程停滞。

日志中的其他警告(Warning)
日志中还有大量关于缺少加密密钥、配置项弃用等 warning 信息。这些是重要的配置建议,应该在后续修复,但它们不是导致本次启动失败的直接原因。排查问题时,要学会分清主次,首先聚焦于 error 级别的日志。

三、排查与解决:定位根源

既然怀疑是 Elasticsearch 的问题,那么我们就需要去检查 Elasticsearch 的状态,特别是与 .kibana_task_manager 索引相关的部分。

第 1 步:检查 Elasticsearch 集群健康状况

首先,我们用 curl 命令检查 ES 集群的整体健康度。

# 将 <你的ES地址> 替换为实际的 ES IP 和端口
curl -X GET "http://<你的ES地址>:9200/_cluster/health?pretty"

这个命令会返回集群状态 (status),可能是 green(健康)、yellow(副本分片丢失)或 red(主分片丢失)。如果状态是 red,那么必须先解决 ES 集群的严重问题。在我的场景中,集群状态是 yellow,这虽然不完美,但通常不至于让 Kibana 完全无法启动。

第 2 步:精准定位,检查 Kibana 内部索引

既然问题直指 .kibana_task_manager,我们就来重点检查这个索引。

# 检查所有 .kibana* 相关的索引状态
curl -X GET "http://<你的ES地址>:9200/_cat/indices/.kibana*?v&s=index"

这个命令的返回结果,就是本次排查的**“Aha!”时刻**:

health status index                    uuid                   pri rep docs.count docs.deleted store.size pri.store.size
green  open   .kibana_1                ...                      1   1         ...          ...      ...            ...
red    open   .kibana_task_manager_1   xxxxxxxxxxxxxxxxxxxxxx   1   1           0            0       208b           208b

关键发现: .kibana_task_manager_1 索引的 health 状态是 red

一个索引处于 red 状态意味着它的主分片未能成功分配。这可能是由于磁盘损坏、节点离线、错误的集群设置等多种原因造成的。对于一个处于 red 状态的索引,任何查询操作(比如 Kibana 启动时尝试的迁移查询)都会失败,并抛出 search_phase_execution_exception 异常。

至此,问题根源水落石出:Kibana 启动时需要迁移 .kibana_task_manager 索引,但该索引在 Elasticsearch 中已损坏(red 状态),导致查询失败,Kibana 无限重试,最终无法完成启动。

第 3 步:果断修复

.kibana_task_manager 索引主要用于存储 Kibana 的后台任务信息。它通常是可以安全删除的,Kibana 在下次启动时会自动重建一个新的、健康的索引。

重要提示: 删除索引是高危操作。请务必确认你删除的是正确的、可再生的系统索引。切勿随意删除存有重要业务数据的索引!

修复步骤如下:

  1. 停止 Kibana 服务,防止它继续尝试访问损坏的索引。

    sudo systemctl stop kibana
    
  2. 删除已损坏的索引

    # 注意索引名称要与上一步查出的一致
    curl -X DELETE "http://<你的ES地址>:9200/.kibana_task_manager_1"
    

    如果操作成功,ES 会返回 {"acknowledged":true}

  3. 重启 Kibana 服务

    sudo systemctl start kibana
    

重启后,再次查看 Kibana 日志,你会发现它顺利通过了 "Saved Objects Migrations" 阶段,成功创建了新的 .kibana_task_manager 索引,并最终打印出服务可用的日志。浏览器再次访问,熟悉的 Kibana 界面终于回来了!

四、举一反三:Kibana 启动问题的通用排查思路

这次经历虽然具体,但其排查思路具有普适性。下次再遇到 Kibana 或其他类似组件的启动问题时,可以遵循以下逻辑框架:

  1. 第一步:永远先看日志(Log is King)

    • 仔细阅读启动日志,不要被大量信息淹没。
    • 重点关注 errorfatal 级别的日志,它们是定位问题的最直接线索。
  2. 第二步:分清主次(Signal vs. Noise)

    • 区分致命错误(Error)配置警告(Warning)。启动失败通常由前者导致。
    • 先解决导致服务无法启动的 error,再回头优化 warning 提及的配置问题。
  3. 第三步:理解依赖关系(Kibana -> Elasticsearch)

    • 牢记 Kibana 是 Elasticsearch 的一个“胖客户端”。它的很多问题(如数据无法显示、启动卡顿)本质上是其后端 Elasticsearch 的问题。
    • 当 Kibana 日志中出现和 Elasticsearch 通信相关的错误时(如 search_phase_execution_exception, No Living connections, Authentication Exception),立即将排查重心转移到 Elasticsearch。
  4. 第四步:善用诊断工具(_cat APIs)

    • Elasticsearch 的 _cat API 是轻量级、对人友好的诊断神器。
    • 熟练使用以下命令,能帮你快速了解 ES 集群的状态:
      • _cluster/health: 查看集群整体健康度。
      • _cat/nodes: 查看各节点资源使用情况(CPU、内存、磁盘)。
      • _cat/indices: 查看所有或特定索引的状态。
      • _cat/shards: 查看分片的分配情况,是诊断 yellowred 状态的利器。
  5. 第五步:大胆假设,小心求证

    • 根据日志和诊断结果,提出一个关于问题根源的假设(例如:“我猜是 .kibana 索引坏了”)。
    • 设计验证方案来证实或推翻你的假设(例如:“我用 _cat/indices 命令检查一下它的健康度”)。
    • 在确认根源后,再执行修复操作,并确保你了解该操作的后果(例如:“我知道删除这个索引是安全的,Kibana 会重建它”)。

五、总结

Kibana 的 "server is not ready yet" 是一个指向性不明的表象,但通过层层深入的分析,我们最终发现它是由一个损坏的 Elasticsearch 内部索引引起的。这个过程再次证明,面对复杂的系统问题,清晰的逻辑、对日志的细致解读以及善用诊断工具,是比盲目猜测和搜索更高效的解决之道。

希望这篇实录能为你未来的排错之旅提供一份有用的地图。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注