解决迁移失败

编辑

迁移 Kibana 主要涉及迁移保存的对象文档,使其与新版本兼容。

保存的对象迁移失败

编辑

如果 Kibana 在迁移保存的对象索引时意外终止,Kibana 将在进程重启时自动尝试再次执行迁移。请勿删除任何保存的对象索引来修复失败的迁移。与之前的版本不同,Kibana 7.12.0 及更高版本不需要删除索引来释放失败的迁移锁。

如果升级迁移反复失败,请参考为迁移做准备。当您解决迁移失败的根本原因时,Kibana 会自动重试迁移。如果您无法解决失败的迁移,请联系支持部门。

损坏的保存对象

编辑

为了查找并解决由损坏的文档引起的问题,我们强烈建议您在开发集群中测试您的 Kibana 升级,尤其是在您的环境中存在创建保存对象的自定义集成时。

通过手动编辑或集成损坏的保存对象会导致迁移失败,并出现日志消息,例如 Unable to migrate the corrupt Saved Object document ...。为了成功升级迁移,您必须修复或删除损坏的文档。

例如,您收到以下错误消息

Unable to migrate the corrupt saved object document with _id: 'marketing_space:dashboard:e3c5fc71-ac71-4805-bcab-2bcc9cc93275'. To allow migrations to proceed, please delete this document from the [.kibana_7.12.0_001] index.

要删除导致迁移失败的文档,请执行以下步骤

  1. 按如下方式创建一个角色

    PUT _security/role/grant_kibana_system_indices
    {
      "indices": [
        {
          "names": [
            ".kibana*"
          ],
          "privileges": [
            "all"
          ],
          "allow_restricted_indices": true
        }
      ]
    }
  2. 创建一个具有上述角色和 superuser 内置角色的用户

    POST /_security/user/temporarykibanasuperuser
    {
      "password" : "l0ng-r4nd0m-p@ssw0rd",
      "roles" : [ "superuser", "grant_kibana_system_indices" ]
    }
  3. 删除迁移系统放置在先前索引上的写阻塞

    PUT .kibana_7.12.1_001/_settings
    {
      "index": {
        "blocks.write": false
      }
    }
  4. 删除损坏的文档

    DELETE .kibana_7.12.0_001/_doc/marketing_space:dashboard:e3c5fc71-ac71-4805-bcab-2bcc9cc93275
  5. 重启 Kibana。

    ID 为 e3c5fc71-ac71-4805-bcab-2bcc9cc93275 且属于 marketing_space 空间的仪表板不再可用

您可以配置 Kibana 自动放弃所有损坏的对象并转换迁移期间发生的错误。设置配置选项 migrations.discardCorruptObjects 时,Kibana 将删除冲突的对象并继续进行迁移。例如,对于升级到 8.4.0,您可以在 kibana.yml 中定义以下设置

migrations.discardCorruptObjects: "8.4.0"

警告:启用上述标志将导致系统放弃所有损坏的对象以及导致转换错误的对象。因此,强烈建议您仔细查看日志中冲突对象的列表。

未知保存对象的文档

编辑

如果保存的对象属于未知的保存对象类型,则迁移将失败。未知保存对象通常是由于对 Elasticsearch 索引执行手动修改(8.x 中不再允许)或禁用先前创建了保存对象的插件引起的。

我们建议使用升级助手来发现和解决任何未知的保存对象类型。包含未知保存对象类型的 Kibana 7.17.0 版本也会记录以下警告消息

CHECK_UNKNOWN_DOCUMENTS Upgrades will fail for 8.0+ because documents were found for unknown saved object types. To ensure that future upgrades will succeed, either re-enable plugins or delete these documents from the ".kibana_7.17.0_001" index after the current upgrade completes.

如果您未能解决此问题,则升级到 8.0+ 将失败,并显示如下消息

Unable to complete saved object migrations for the [.kibana] index: Migration failed because some documents were found which use unknown saved object types: someType,someOtherType

To proceed with the migration you can configure Kibana to discard unknown saved objects for this migration.

要继续进行迁移,请重新启用以前创建这些保存对象的任何插件。或者,仔细查看 Kibana 日志条目中未知的保存对象列表。如果不再使用相应的已禁用插件及其关联的保存对象,则可以通过将配置选项 migrations.discardUnknownObjects 设置为您要升级到的版本来删除它们。例如,对于升级到 8.4.0,您可以在 kibana.yml 中定义以下设置

migrations.discardUnknownObjects: "8.4.0"

不兼容的设置或映射

编辑

指定 settings.refresh_intervalmappings 的匹配索引模板已知会干扰 Kibana 升级。当手动定义索引模板时,可能会发生这种情况。

为确保索引模板不会应用于新的 .kibana* 索引,请缩小任何用户定义的索引模板的数据视图。

不兼容的 xpack.tasks.index 配置设置

编辑

在 Kibana 7.5.0 及更早版本中,当任务管理器索引通过配置设置 xpack.tasks.index: ".tasks" 设置为 .tasks 时,升级迁移将失败。在 Kibana 7.5.1 及更高版本中,不兼容的配置设置会阻止升级迁移启动。

最终失败的重复超时请求

编辑

迁移陷入等待索引黄色状态的重试循环,而黄色状态永远不会达到。在 CLONE_TEMP_TO_TARGET 或 CREATE_REINDEX_TEMP 步骤中,您可能会看到类似的日志条目

"Action failed with [index_not_yellow_timeout] Timeout waiting for the status of the [.kibana_8.1.0_001] index to become "yellow". Retrying attempt 1 in 2 seconds."

该过程正在等待黄色索引状态。已知有两个原因

在重试迁移之前,请检查 _cluster/allocation/explain?index=${targetIndex} API 的输出,以确定索引不是黄色的原因

GET _cluster/allocation/explain
{
  "index": ".kibana_8.1.0_001",
  "shard": 0,
  "primary": true,
}

如果集群超过了磁盘使用率的低水位线,则输出应包含类似于此的消息

"The node is above the low watermark cluster setting [cluster.routing.allocation.disk.watermark.low=85%], using more disk space than the maximum allowed [85.0%], actual free: [11.692661332965082%]"

有关如何修复常见集群问题,请参阅 Elasticsearch 指南。

如果路由分配是问题所在,则 _cluster/allocation/explain API 将返回类似于此的条目

"allocate_explanation" : "cannot allocate because allocation is not permitted to any of the nodes"

路由分配已禁用或受限

编辑

升级迁移失败,因为路由分配已禁用或受限(cluster.routing.allocation.enable: none/primaries/new_primaries),这会导致 Kibana 记录诸如此类的错误

Unable to complete saved object migrations for the [.kibana] index: [incompatible_cluster_routing_allocation] The elasticsearch cluster has cluster routing allocation incorrectly set for migrations to continue. To proceed, please remove the cluster routing allocation settings with PUT /_cluster/settings {"transient": {"cluster.routing.allocation.enable": null}, "persistent": {"cluster.routing.allocation.enable": null}}

要解决此问题,请删除瞬态和持久路由分配设置

PUT /_cluster/settings
{
  "transient": {
    "cluster.routing.allocation.enable": null
  },
  "persistent": {
    "cluster.routing.allocation.enable": null
  }
}

超过 Elasticsearch 集群分片限制

编辑

升级时,Kibana 会创建新索引,这需要少量新分片。如果打开的 Elasticsearch 分片的数量接近或超过 Elasticsearch cluster.max_shards_per_node 设置,则 Kibana 将无法完成升级。通过删除索引以清除资源或增加 cluster.max_shards_per_node 设置,确保 Kibana 能够添加至少 10 个分片。

有关更多信息,请参阅有关每个节点的总分片的文档。