一、问题背景


你是否也遇到过这样的场景:启动 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)

- 仔细阅读启动日志,不要被大量信息淹没。
- 重点关注 error 和 fatal 级别的日志,它们是定位问题的最直接线索。
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: 查看分片的分配情况,是诊断 yellow 或 red 状态的利器。
5. 第五步:大胆假设,小心求证

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

五、总结


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

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