一、问题背景
你是否也遇到过这样的场景:启动 Kibana 后,满怀期待地打开浏览器,却只看到一句冰冷的提示——“Kibana server is not ready yet”。页面不断刷新,后台日志也不再滚动,Kibana 仿佛陷入了“假死”状态。
最近,我就遇到了这个典型问题。本文将完整复盘从发现问题、分析日志、定位根源到最终解决的全过程,并提炼出一套通用的排查思路,希望能帮助遇到类似问题的朋友快速脱困。
核心症状:
- 浏览器访问 Kibana (默认
5601端口) 持续显示Kibana server is not ready yet。 - 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."}
...
通过日志,我们可以提炼出两条关键信息:
-
Kibana 卡在了哪个环节?
日志明确显示,Kibana 在执行 “Saved Objects Migrations”(保存对象迁移) 步骤。这个步骤是 Kibana 启动时为了确保其内部索引(如.kibana、.kibana_task_manager等)的结构与当前版本兼容。日志显示.kibana索引迁移成功了,但轮到.kibana_task_manager时就出错了。 -
具体是什么错误?
错误信息是[.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 在下次启动时会自动重建一个新的、健康的索引。
重要提示: 删除索引是高危操作。请务必确认你删除的是正确的、可再生的系统索引。切勿随意删除存有重要业务数据的索引!
修复步骤如下:
-
停止 Kibana 服务,防止它继续尝试访问损坏的索引。
sudo systemctl stop kibana -
删除已损坏的索引。
# 注意索引名称要与上一步查出的一致 curl -X DELETE "http://<你的ES地址>:9200/.kibana_task_manager_1"如果操作成功,ES 会返回
{"acknowledged":true}。 -
重启 Kibana 服务。
sudo systemctl start kibana
重启后,再次查看 Kibana 日志,你会发现它顺利通过了 "Saved Objects Migrations" 阶段,成功创建了新的 .kibana_task_manager 索引,并最终打印出服务可用的日志。浏览器再次访问,熟悉的 Kibana 界面终于回来了!
四、举一反三:Kibana 启动问题的通用排查思路
这次经历虽然具体,但其排查思路具有普适性。下次再遇到 Kibana 或其他类似组件的启动问题时,可以遵循以下逻辑框架:
-
第一步:永远先看日志(Log is King)
- 仔细阅读启动日志,不要被大量信息淹没。
- 重点关注
error和fatal级别的日志,它们是定位问题的最直接线索。
-
第二步:分清主次(Signal vs. Noise)
- 区分致命错误(Error)和配置警告(Warning)。启动失败通常由前者导致。
- 先解决导致服务无法启动的
error,再回头优化warning提及的配置问题。
-
第三步:理解依赖关系(Kibana -> Elasticsearch)
- 牢记 Kibana 是 Elasticsearch 的一个“胖客户端”。它的很多问题(如数据无法显示、启动卡顿)本质上是其后端 Elasticsearch 的问题。
- 当 Kibana 日志中出现和 Elasticsearch 通信相关的错误时(如
search_phase_execution_exception,No Living connections,Authentication Exception),立即将排查重心转移到 Elasticsearch。
-
第四步:善用诊断工具(
_catAPIs)- Elasticsearch 的
_catAPI 是轻量级、对人友好的诊断神器。 - 熟练使用以下命令,能帮你快速了解 ES 集群的状态:
_cluster/health: 查看集群整体健康度。_cat/nodes: 查看各节点资源使用情况(CPU、内存、磁盘)。_cat/indices: 查看所有或特定索引的状态。_cat/shards: 查看分片的分配情况,是诊断yellow或red状态的利器。
- Elasticsearch 的
-
第五步:大胆假设,小心求证
- 根据日志和诊断结果,提出一个关于问题根源的假设(例如:“我猜是
.kibana索引坏了”)。 - 设计验证方案来证实或推翻你的假设(例如:“我用
_cat/indices命令检查一下它的健康度”)。 - 在确认根源后,再执行修复操作,并确保你了解该操作的后果(例如:“我知道删除这个索引是安全的,Kibana 会重建它”)。
- 根据日志和诊断结果,提出一个关于问题根源的假设(例如:“我猜是
五、总结
Kibana 的 "server is not ready yet" 是一个指向性不明的表象,但通过层层深入的分析,我们最终发现它是由一个损坏的 Elasticsearch 内部索引引起的。这个过程再次证明,面对复杂的系统问题,清晰的逻辑、对日志的细致解读以及善用诊断工具,是比盲目猜测和搜索更高效的解决之道。
希望这篇实录能为你未来的排错之旅提供一份有用的地图。