Skip to content
大纲

数据备份概述

如果您需要对Flyme云Elasticsearch(简称ES)中的数据进行备份以保证集群数据的可靠性,可以参考文本了解各种备份方式的适用场景和相关限制。Flyme云ES支持自动备份与恢复、手动备份与恢复等方式。

功能概览

功能适用场景相关限制
自动备份与恢复需要定时自动备份数据的场景
  • 备份的数据只能恢复到原ES集群中。
  • 只保留最近7天的快照数据。
手动备份与恢复
  • 通过命令手动备份数据的场景。
  • 需要在相同地域的不同集群间恢复数据的场景。
  • 需要开通对象存储服务FOS,并创建相同地域的存储空间。
  • 不支持定时自动备份。

兼容性说明

将快照恢复到目标集群时,索引创建版本需要与目标集群版本兼容,否则恢复会失败。

兼容性如下表所示:

索引创建版本目标集群版本
6.87.0–7.17.2–7.168.0-8.28.3-8.5
5.0–5.6支持不支持不支持不支持支持
6.0–6.7支持支持支持不支持支持
6.8支持不支持支持不支持支持
7.0–7.1不支持支持支持支持支持
7.2–7.16不支持不支持支持支持支持
8.0-8.5不支持不支持不支持支持支持

📌 提示

  • 索引创建版本是指创建索引时的ES集群版本。
  • 快照恢复时,不支持将高版本集群中创建的快照数据恢复到低版本的集群中。
  • 关于快照兼容性的更多详细信息,请参见 Snapshot compatibility



自动备份与恢复

开启Flyme云Elasticsearch(简称ES)的自动备份功能后,系统将按照设定的备份周期和时间自动备份数据,如果遇到数据误删除、应用逻辑错误等情况时,您可以通过自动备份恢复功能,将特定时间点的备份数据恢复到原ES实例中,保证数据的安全性。本文介绍开启、关闭自动备份功能和恢复备份数据的方法。

注意事项

  • 集群的第一个快照是集群数据的完整拷贝,后续所有的快照保留的是已存快照和新快照之间的增量,因此首次快照耗时较长(具体时长与数据量相关),后续快照备份会比较快。
  • 快照仅保存索引数据,不保存Elasticsearch实例自身的监控数据(例如以.monitoring和.security_audit为前缀的索引)、元数据、Translog、实例配置数据、Elasticsearch的软件包、自带和自定义的插件、Elasticsearch的日志等。
  • 自动备份只保留最近7天的快照数据。
  • 自动备份数据只能用于恢复到原集群,如果需要跨集群恢复,请等待后续版本更新。
  • 关闭自动备份会进行一次数据备份,更新自动备份开始时间不会进行数据备份。

开启自动备份

  1. 登录Flyme云Elasticsearch控制台。
  2. 在页面Table栏,单击Elasticsearch实例。
  3. 进入目标实例。
  4. 在顶部导航栏,单击数据备份。
  5. 在数据备份(免费试用)区域,打开自动备份开关。
  6. 单击自动备份开始时间右侧的设置。
  7. 在自动备份周期设置面板,选择备份周期(自动备份触发的时间)。
备份周期说明
每30分钟每30分钟进行一次自动备份。
每天每天都会进行自动备份。可自定义备份时间。
自定义自定义选择备份的周期和时间。

📌 提示

自动备份时间为当前实例所在地域的时间。

  1. 单击确定

查看备份快照

开启自动备份功能后,您可以登录Kibana控制台,在对应Flyme云Elasticsearch实例的Kibana控制台上,通过_snapshot API查看自动备份快照的信息:

  • 查看快照仓库。
GET _snapshot
  • 也可以使用 GET _snapshot/my_backup 获取指定仓库的信息

执行成功后,返回结果示例如下。

json
{
  "flymeyun_es-1z1nq5r2s1boqskzam_snapshot": {
    "type": "s3",
    "settings": {
      "bucket": "es-flyme-es-1z1nq5r2s1boqskzam",
      "disable_chunked_encoding": "true",
      "endpoint": "http://10.128.252.128:7480",
      "protocol": "http"
    }
  }
}
参数说明
flymeyun_es-1z1nq5r2s1boqskzam_snapshot自动快照仓库在首次快照时生成。Flyme云Elasticsearch自动备份快照存储的仓库名称为flymeyun_es-实例名_snapshot。
💡 说明
  • 一个仓库可以存储多个快照,每个快照中可以包含所有、部分或单个索引的备份数据。
type快照的存储协议,s3表示快照存储协议为S3协议。
bucketFOS中Bucket的名称
disable_chunked_encoding
endpointFOS所处地域的信息。
protocol传输协议

快照所有打开的索引

一个仓库可以包含多个快照。每个快照跟一系列索引相关(比如所有索引,一部分索引,或者单个索引)。当创建快照的时候,你指定你感兴趣的索引然后给快照取一个唯一的名字。

让我们从最基础的快照命令开始:

PUT _snapshot/my_backup/snapshot_1

这个会备份所有打开的索引到 my_backup 仓库下一个命名为 snapshot_1 的快照里。这个调用会立刻返回,然后快照会在后台运行。

通常你会希望你的快照作为后台进程运行,不过有时候你会希望在你的脚本中一直等待到完成。这可以通过添加一个 wait_for_completion 标记实现:

PUT _snapshot/my_backup/snapshot_1?wait_for_completion=true

这个会阻塞调用直到快照完成。注意大型快照会花很长时间才返回。

快照指定索引

默认行为是备份所有打开的索引。不过如果你在用 Kibana,你不是真的想要把所有诊断相关的 .kibana 索引也备份起来。可能你就压根没那么大空间备份所有数据。

这种情况下,你可以在快照你的集群的时候指定备份哪些索引:

PUT _snapshot/my_backup/snapshot_2
{
    "indices": "index_1,index_2"
}

这个快照命令现在只会备份 index1 和 index2 了。

列出快照相关的信息

一旦你开始在你的仓库里积攒起快照了,你可能就慢慢忘记里面各自的细节了——特别是快照按照时间划分命名的时候(比如, backup_2014_10_28 )。

要获得单个快照的信息,直接对仓库和快照名发起一个 GET 请求:

GET _snapshot/my_backup/snapshot_2

这个会返回一个小响应,包括快照相关的各种信息:

json
{
  "snapshots": [
    {
      "snapshot": "snapshot_1",
      "indices": [".marvel_2014_28_10", "index1", "index2"],
      "state": "SUCCESS",
      "start_time": "2014-09-02T13:01:43.115Z",
      "start_time_in_millis": 1409662903115,
      "end_time": "2014-09-02T13:01:43.439Z",
      "end_time_in_millis": 1409662903439,
      "duration_in_millis": 324,
      "failures": [],
      "shards": {
        "total": 10,
        "failed": 0,
        "successful": 10
      }
    }
  ]
}

要获取一个仓库中所有快照的完整列表,使用 _all 占位符替换掉具体的快照名称:

GET _snapshot/my_backup/_all

执行成功后,返回结果示例如下。

json
{
  "snapshots": [
    {
      "snapshot": "es-default_test-es-1z1nq5r2s1boqskzam-20240527180000",
      "uuid": "tdWAymgsSEettlDI38hSEQ",
      "version_id": 7100099,
      "version": "7.10.0",
      "indices": [
        ".apm-agent-configuration",
        "ilm-history-3-000001",
        ".kibana_1",
        ".kibana_task_manager_1",
        ".kibana_security_session_1",
        ".apm-custom-link",
        ".security-7",
        ".kibana-event-log-7.10.0-000001"
      ],
      "data_streams": [],
      "include_global_state": true,
      "state": "SUCCESS",
      "start_time": "2024-05-27T09:59:59.889Z",
      "start_time_in_millis": 1716803999889,
      "end_time": "2024-05-27T10:00:03.506Z",
      "end_time_in_millis": 1716804003506,
      "duration_in_millis": 3617,
      "failures": [],
      "shards": {
        "total": 8,
        "failed": 0,
        "successful": 8
      }
    },
    {
      "snapshot": "es-default_test-es-1z1nq5r2s1boqskzam-20240528055959",
      "uuid": "ll0mzm8FSQyjedLbx_npAA",
      "version_id": 7100099,
      "version": "7.10.0",
      "indices": [
        ".apm-agent-configuration",
        ".kibana_task_manager_1",
        ".kibana_1",
        "ilm-history-3-000001",
        ".apm-custom-link",
        ".kibana_security_session_1",
        ".security-7",
        ".kibana-event-log-7.10.0-000001"
      ],
      "data_streams": [],
      "include_global_state": true,
      "state": "SUCCESS",
      "start_time": "2024-05-27T21:59:59.207Z",
      "start_time_in_millis": 1716847199207,
      "end_time": "2024-05-27T22:00:01.612Z",
      "end_time_in_millis": 1716847201612,
      "duration_in_millis": 2405,
      "failures": [],
      "shards": {
        "total": 8,
        "failed": 0,
        "successful": 8
      }
    }
  ]
}

📌 提示

自动备份时间为当前地域的时间,而以上返回结果中的时间为UTC时间(世界标准时间),会存在时区差。您可根据时区差进行转换,例如北京时间的时区差为8个小时,则北京时间=UTC时间+0800。

删除快照

最后,我们需要一个命令来删除所有不再有用的旧快照。这只要对仓库/快照名称发一个简单的 DELETE HTTP 调用:

DELETE _snapshot/my_backup/snapshot_2

用 API 删除快照很重要,而不能用其他机制(比如手动删除)。因为快照是增量的,有可能很多快照依赖于过去的段。delete API 知道哪些数据还在被更多近期快照使用,然后会只删除不再被使用的段。

但是,如果你做了一次人工文件删除,你将会面临备份严重损坏的风险,因为你在删除的是可能还在使用中的数据。

监控快照进度

wait_for_completion 标记提供了一个监控的基础形式,但哪怕只是对一个中等规模的集群做快照恢复的时候,它都真的不够用。

另外两个 API 会给你有关快照状态更详细的信息。首先你可以给快照 ID 执行一个 GET,就像我们之前获取一个特定快照的信息时做的那样:

GET _snapshot/my_backup/snapshot_3

如果你调用这个命令的时候快照还在进行中,你会看到它什么时候开始,运行了多久等等信息。不过要注意,这个 API 用的是快照机制相同的线程池。如果你在快照非常大的分片,状态更新的间隔会很大,因为 API 在竞争相同的线程池资源。

更好的方案是拽取 _status API 数据:

GET _snapshot/my_backup/snapshot_3/_status

_status API 立刻返回,然后给出详细的多的统计值输出:

json
{
  "snapshots": [
    {
      "snapshot": "snapshot_3",
      "repository": "my_backup",
      "uuid": "tdWAymgsSEettlDI38hSEQ",
      "state": "SUCCESS",
      "include_global_state": true,
      "shards_stats": {
        "initializing": 0,
        "started": 0,
        "finalizing": 0,
        "done": 8,
        "failed": 0,
        "total": 8
      },
      "stats": {
        "incremental": {
          "file_count": 77,
          "size_in_bytes": 113148
        },
        "total": {
          "file_count": 142,
          "size_in_bytes": 11188226
        },
        "start_time_in_millis": 1716803999889,
        "time_in_millis": 3617
      },
      "indices": {
        ".security-7": {
          "shards_stats": {
            "initializing": 0,
            "started": 0,
            "finalizing": 0,
            "done": 1,
            "failed": 0,
            "total": 1
          },
          "stats": {
            "incremental": {
              "file_count": 0,
              "size_in_bytes": 0
            },
            "total": {
              "file_count": 35,
              "size_in_bytes": 145096
            },
            "start_time_in_millis": 1716804000248,
            "time_in_millis": 200
          },
          "shards": {
            "0": {
              "stage": "DONE",
              "stats": {
                "incremental": {
                  "file_count": 0,
                  "size_in_bytes": 0
                },
                "total": {
                  "file_count": 35,
                  "size_in_bytes": 145096
                },
                "start_time_in_millis": 1716804000248,
                "time_in_millis": 200
              }
            }
          }
        },
        ".apm-custom-link": {
          "shards_stats": {
            "initializing": 0,
            "started": 0,
            "finalizing": 0,
            "done": 1,
            "failed": 0,
            "total": 1
          },
          "stats": {
            "incremental": {
              "file_count": 0,
              "size_in_bytes": 0
            },
            "total": {
              "file_count": 1,
              "size_in_bytes": 208
            },
            "start_time_in_millis": 1716804000047,
            "time_in_millis": 0
          },
          "shards": {
            "0": {
              "stage": "DONE",
              "stats": {
                "incremental": {
                  "file_count": 0,
                  "size_in_bytes": 0
                },
                "total": {
                  "file_count": 1,
                  "size_in_bytes": 208
                },
                "start_time_in_millis": 1716804000047,
                "time_in_millis": 0
              }
            }
          }
        },
        ".kibana_task_manager_1": {
          "shards_stats": {
            "initializing": 0,
            "started": 0,
            "finalizing": 0,
            "done": 1,
            "failed": 0,
            "total": 1
          },
          "stats": {
            "incremental": {
              "file_count": 77,
              "size_in_bytes": 113148
            },
            "total": {
              "file_count": 77,
              "size_in_bytes": 113148
            },
            "start_time_in_millis": 1716804000090,
            "time_in_millis": 3416
          },
          "shards": {
            "0": {
              "stage": "DONE",
              "stats": {
                "incremental": {
                  "file_count": 77,
                  "size_in_bytes": 113148
                },
                "total": {
                  "file_count": 77,
                  "size_in_bytes": 113148
                },
                "start_time_in_millis": 1716804000090,
                "time_in_millis": 3416
              }
            }
          }
        },
        ".apm-agent-configuration": {
          "shards_stats": {
            "initializing": 0,
            "started": 0,
            "finalizing": 0,
            "done": 1,
            "failed": 0,
            "total": 1
          },
          "stats": {
            "incremental": {
              "file_count": 0,
              "size_in_bytes": 0
            },
            "total": {
              "file_count": 1,
              "size_in_bytes": 208
            },
            "start_time_in_millis": 1716803999895,
            "time_in_millis": 0
          },
          "shards": {
            "0": {
              "stage": "DONE",
              "stats": {
                "incremental": {
                  "file_count": 0,
                  "size_in_bytes": 0
                },
                "total": {
                  "file_count": 1,
                  "size_in_bytes": 208
                },
                "start_time_in_millis": 1716803999895,
                "time_in_millis": 0
              }
            }
          }
        },
        "ilm-history-3-000001": {
          "shards_stats": {
            "initializing": 0,
            "started": 0,
            "finalizing": 0,
            "done": 1,
            "failed": 0,
            "total": 1
          },
          "stats": {
            "incremental": {
              "file_count": 0,
              "size_in_bytes": 0
            },
            "total": {
              "file_count": 7,
              "size_in_bytes": 24965
            },
            "start_time_in_millis": 1716803999895,
            "time_in_millis": 200
          },
          "shards": {
            "0": {
              "stage": "DONE",
              "stats": {
                "incremental": {
                  "file_count": 0,
                  "size_in_bytes": 0
                },
                "total": {
                  "file_count": 7,
                  "size_in_bytes": 24965
                },
                "start_time_in_millis": 1716803999895,
                "time_in_millis": 200
              }
            }
          }
        },
        ".kibana-event-log-7.10.0-000001": {
          "shards_stats": {
            "initializing": 0,
            "started": 0,
            "finalizing": 0,
            "done": 1,
            "failed": 0,
            "total": 1
          },
          "stats": {
            "incremental": {
              "file_count": 0,
              "size_in_bytes": 0
            },
            "total": {
              "file_count": 4,
              "size_in_bytes": 5782
            },
            "start_time_in_millis": 1716804000095,
            "time_in_millis": 0
          },
          "shards": {
            "0": {
              "stage": "DONE",
              "stats": {
                "incremental": {
                  "file_count": 0,
                  "size_in_bytes": 0
                },
                "total": {
                  "file_count": 4,
                  "size_in_bytes": 5782
                },
                "start_time_in_millis": 1716804000095,
                "time_in_millis": 0
              }
            }
          }
        },
        ".kibana_security_session_1": {
          "shards_stats": {
            "initializing": 0,
            "started": 0,
            "finalizing": 0,
            "done": 1,
            "failed": 0,
            "total": 1
          },
          "stats": {
            "incremental": {
              "file_count": 0,
              "size_in_bytes": 0
            },
            "total": {
              "file_count": 1,
              "size_in_bytes": 208
            },
            "start_time_in_millis": 1716804000499,
            "time_in_millis": 0
          },
          "shards": {
            "0": {
              "stage": "DONE",
              "stats": {
                "incremental": {
                  "file_count": 0,
                  "size_in_bytes": 0
                },
                "total": {
                  "file_count": 1,
                  "size_in_bytes": 208
                },
                "start_time_in_millis": 1716804000499,
                "time_in_millis": 0
              }
            }
          }
        },
        ".kibana_1": {
          "shards_stats": {
            "initializing": 0,
            "started": 0,
            "finalizing": 0,
            "done": 1,
            "failed": 0,
            "total": 1
          },
          "stats": {
            "incremental": {
              "file_count": 0,
              "size_in_bytes": 0
            },
            "total": {
              "file_count": 16,
              "size_in_bytes": 10898611
            },
            "start_time_in_millis": 1716803999847,
            "time_in_millis": 200
          },
          "shards": {
            "0": {
              "stage": "DONE",
              "stats": {
                "incremental": {
                  "file_count": 0,
                  "size_in_bytes": 0
                },
                "total": {
                  "file_count": 16,
                  "size_in_bytes": 10898611
                },
                "start_time_in_millis": 1716803999847,
                "time_in_millis": 200
              }
            }
          }
        }
      }
    }
  ]
}
  • <1> 一个正在运行的快照会显示 IN_PROGRESS 作为状态。
  • <2> 这个特定快照有一个分片还在传输(另外四个已经完成)。

响应包括快照的总体状况,但也包括下钻到每个索引和每个分片的统计值。这个给你展示了有关快照进展的非常详细的视图。分片可以在不同的完成状态:

快照状态含义
INITIALIZING分片在检查集群状态看看自己是否可以被快照。这个一般是非常快的。
STARTED数据正在被传输到仓库。
FINALIZING数据传输完成;分片现在在发送快照元数据。
DONE快照完成!
FAILED快照处理的时候碰到了错误,这个分片/索引/快照不可能完成了。检查你的日志获取更多信息。

取消一个快照

最后,你可能想取消一个快照或恢复。因为它们是长期运行的进程,执行操作的时候一个笔误或者过错就会花很长时间来解决——而且同时还会耗尽有价值的资源。

要取消一个快照,在他进行中的时候简单的删除快照就可以:

DELETE _snapshot/my_backup/snapshot_3

这个会中断快照进程。然后删除仓库里进行到一半的快照。

从快照恢复

一旦你备份过了数据,恢复它就简单了:只要在你希望恢复回集群的快照 ID 后面加上 _restore 即可:

POST _snapshot/my_backup/snapshot_1/_restore

默认行为是把这个快照里存有的所有索引都恢复。如果 snapshot_1 包括五个索引,这五个都会被恢复到我们集群里。和 snapshot API 一样,我们也可以选择希望恢复具体哪个索引。

还有附加的选项用来重命名索引。这个选项允许你通过模式匹配索引名称,然后通过恢复进程提供一个新名称。如果你想在不替换现有数据的前提下,恢复老数据来验证内容,或者做其他处理,这个选项很有用。让我们从快照里恢复单个索引并提供一个替换的名称:

POST /_snapshot/my_backup/snapshot_1/_restore
{
    "indices": "index_1", <1>
    "rename_pattern": "index_(.+)", <2>
    "rename_replacement": "restored_index_$1" <3>
}
  • <1> 只恢复 index_1 索引,忽略快照中存在的其余索引。
  • <2> 查找所提供的模式能匹配上的正在恢复的索引。
  • <3> 然后把它们重命名成替代的模式。

这个会恢复 index_1 到你及群里,但是重命名成了 restored_index_1

和快照类似, restore 命令也会立刻返回,恢复进程会在后台进行。如果你更希望你的 HTTP 调用阻塞直到恢复完成,添加 wait_for_completion 标记:

POST _snapshot/my_backup/snapshot_1/_restore?wait_for_completion=true

监控恢复操作

从仓库恢复数据借鉴了 Elasticsearch 里已有的现行恢复机制。在内部实现上,从仓库恢复分片和从另一个节点恢复是等价的。

如果你想监控恢复的进度,你可以使用 recovery API。这是一个通用目的的 API,用来展示你集群中移动着的分片状态。

这个 API 可以为你在恢复的指定索引单独调用:

GET restored_index_3/_recovery

或者查看你集群里所有索引,可能包括跟你的恢复进程无关的其他分片移动:

GET /_recovery/

输出会跟这个类似(注意,根据你集群的活跃度,输出可能会变得非常啰嗦!):

json
{
  ".security-7": {
    "shards": [
      {
        "id": 0,
        "type": "EMPTY_STORE",
        "stage": "DONE",
        "primary": true,
        "start_time_in_millis": 1716778116297,
        "stop_time_in_millis": 1716778116342,
        "total_time_in_millis": 44,
        "source": {},
        "target": {
          "id": "rpht7K-ITvysPHguo3C-UQ",
          "host": "10.131.25.3",
          "transport_address": "10.131.25.3:9300",
          "ip": "10.131.25.3",
          "name": "10.131.25.3"
        },
        "index": {
          "size": {
            "total_in_bytes": 0,
            "reused_in_bytes": 0,
            "recovered_in_bytes": 0,
            "percent": "0.0%"
          },
          "files": {
            "total": 0,
            "reused": 0,
            "recovered": 0,
            "percent": "0.0%"
          },
          "total_time_in_millis": 16,
          "source_throttle_time_in_millis": 0,
          "target_throttle_time_in_millis": 0
        },
        "translog": {
          "recovered": 0,
          "total": 0,
          "percent": "100.0%",
          "total_on_start": 0,
          "total_time_in_millis": 11
        },
        "verify_index": {
          "check_index_time_in_millis": 0,
          "total_time_in_millis": 0
        }
      },
      {
        "id": 0,
        "type": "PEER",
        "stage": "DONE",
        "primary": false,
        "start_time_in_millis": 1716778188599,
        "stop_time_in_millis": 1716778189205,
        "total_time_in_millis": 605,
        "source": {
          "id": "rpht7K-ITvysPHguo3C-UQ",
          "host": "10.131.25.3",
          "transport_address": "10.131.25.3:9300",
          "ip": "10.131.25.3",
          "name": "10.131.25.3"
        },
        "target": {
          "id": "Cw01hSFeQYGoAac3qqX66g",
          "host": "10.131.25.6",
          "transport_address": "10.131.25.6:9300",
          "ip": "10.131.25.6",
          "name": "10.131.25.6"
        },
        "index": {
          "size": {
            "total_in_bytes": 208,
            "reused_in_bytes": 0,
            "recovered_in_bytes": 208,
            "percent": "100.0%"
          },
          "files": {
            "total": 1,
            "reused": 0,
            "recovered": 1,
            "percent": "100.0%"
          },
          "total_time_in_millis": 93,
          "source_throttle_time_in_millis": 0,
          "target_throttle_time_in_millis": 0
        },
        "translog": {
          "recovered": 47,
          "total": 47,
          "percent": "100.0%",
          "total_on_start": 47,
          "total_time_in_millis": 453
        },
        "verify_index": {
          "check_index_time_in_millis": 0,
          "total_time_in_millis": 0
        }
      }
    ]
  },
  ".apm-custom-link": {
    "shards": [
      {
        "id": 0,
        "type": "EMPTY_STORE",
        "stage": "DONE",
        "primary": true,
        "start_time_in_millis": 1716778097597,
        "stop_time_in_millis": 1716778098009,
        "total_time_in_millis": 412,
        "source": {},
        "target": {
          "id": "rpht7K-ITvysPHguo3C-UQ",
          "host": "10.131.25.3",
          "transport_address": "10.131.25.3:9300",
          "ip": "10.131.25.3",
          "name": "10.131.25.3"
        },
        "index": {
          "size": {
            "total_in_bytes": 0,
            "reused_in_bytes": 0,
            "recovered_in_bytes": 0,
            "percent": "0.0%"
          },
          "files": {
            "total": 0,
            "reused": 0,
            "recovered": 0,
            "percent": "0.0%"
          },
          "total_time_in_millis": 241,
          "source_throttle_time_in_millis": 0,
          "target_throttle_time_in_millis": 0
        },
        "translog": {
          "recovered": 0,
          "total": 0,
          "percent": "100.0%",
          "total_on_start": 0,
          "total_time_in_millis": 135
        },
        "verify_index": {
          "check_index_time_in_millis": 0,
          "total_time_in_millis": 0
        }
      },
      {
        "id": 0,
        "type": "PEER",
        "stage": "DONE",
        "primary": false,
        "start_time_in_millis": 1716778100283,
        "stop_time_in_millis": 1716778100409,
        "total_time_in_millis": 126,
        "source": {
          "id": "rpht7K-ITvysPHguo3C-UQ",
          "host": "10.131.25.3",
          "transport_address": "10.131.25.3:9300",
          "ip": "10.131.25.3",
          "name": "10.131.25.3"
        },
        "target": {
          "id": "Ok7_0yLdTqmpk2QQ1fNcQA",
          "host": "10.131.25.4",
          "transport_address": "10.131.25.4:9300",
          "ip": "10.131.25.4",
          "name": "10.131.25.4"
        },
        "index": {
          "size": {
            "total_in_bytes": 208,
            "reused_in_bytes": 0,
            "recovered_in_bytes": 208,
            "percent": "100.0%"
          },
          "files": {
            "total": 1,
            "reused": 0,
            "recovered": 1,
            "percent": "100.0%"
          },
          "total_time_in_millis": 48,
          "source_throttle_time_in_millis": 0,
          "target_throttle_time_in_millis": 0
        },
        "translog": {
          "recovered": 0,
          "total": 0,
          "percent": "100.0%",
          "total_on_start": 0,
          "total_time_in_millis": 44
        },
        "verify_index": {
          "check_index_time_in_millis": 0,
          "total_time_in_millis": 0
        }
      }
    ]
  },
  ".kibana_task_manager_1": {
    "shards": [
      {
        "id": 0,
        "type": "PEER",
        "stage": "DONE",
        "primary": false,
        "start_time_in_millis": 1716778097629,
        "stop_time_in_millis": 1716778098978,
        "total_time_in_millis": 1348,
        "source": {
          "id": "Ok7_0yLdTqmpk2QQ1fNcQA",
          "host": "10.131.25.4",
          "transport_address": "10.131.25.4:9300",
          "ip": "10.131.25.4",
          "name": "10.131.25.4"
        },
        "target": {
          "id": "rpht7K-ITvysPHguo3C-UQ",
          "host": "10.131.25.3",
          "transport_address": "10.131.25.3:9300",
          "ip": "10.131.25.3",
          "name": "10.131.25.3"
        },
        "index": {
          "size": {
            "total_in_bytes": 208,
            "reused_in_bytes": 0,
            "recovered_in_bytes": 208,
            "percent": "100.0%"
          },
          "files": {
            "total": 1,
            "reused": 0,
            "recovered": 1,
            "percent": "100.0%"
          },
          "total_time_in_millis": 174,
          "source_throttle_time_in_millis": 0,
          "target_throttle_time_in_millis": 0
        },
        "translog": {
          "recovered": 5,
          "total": 5,
          "percent": "100.0%",
          "total_on_start": 5,
          "total_time_in_millis": 440
        },
        "verify_index": {
          "check_index_time_in_millis": 0,
          "total_time_in_millis": 0
        }
      },
      {
        "id": 0,
        "type": "EMPTY_STORE",
        "stage": "DONE",
        "primary": true,
        "start_time_in_millis": 1716778095344,
        "stop_time_in_millis": 1716778095578,
        "total_time_in_millis": 233,
        "source": {},
        "target": {
          "id": "Ok7_0yLdTqmpk2QQ1fNcQA",
          "host": "10.131.25.4",
          "transport_address": "10.131.25.4:9300",
          "ip": "10.131.25.4",
          "name": "10.131.25.4"
        },
        "index": {
          "size": {
            "total_in_bytes": 0,
            "reused_in_bytes": 0,
            "recovered_in_bytes": 0,
            "percent": "0.0%"
          },
          "files": {
            "total": 0,
            "reused": 0,
            "recovered": 0,
            "percent": "0.0%"
          },
          "total_time_in_millis": 91,
          "source_throttle_time_in_millis": 0,
          "target_throttle_time_in_millis": 0
        },
        "translog": {
          "recovered": 0,
          "total": 0,
          "percent": "100.0%",
          "total_on_start": 0,
          "total_time_in_millis": 95
        },
        "verify_index": {
          "check_index_time_in_millis": 0,
          "total_time_in_millis": 0
        }
      }
    ]
  },
  ".apm-agent-configuration": {
    "shards": [
      {
        "id": 0,
        "type": "PEER",
        "stage": "DONE",
        "primary": false,
        "start_time_in_millis": 1716778100258,
        "stop_time_in_millis": 1716778100897,
        "total_time_in_millis": 639,
        "source": {
          "id": "Ok7_0yLdTqmpk2QQ1fNcQA",
          "host": "10.131.25.4",
          "transport_address": "10.131.25.4:9300",
          "ip": "10.131.25.4",
          "name": "10.131.25.4"
        },
        "target": {
          "id": "rpht7K-ITvysPHguo3C-UQ",
          "host": "10.131.25.3",
          "transport_address": "10.131.25.3:9300",
          "ip": "10.131.25.3",
          "name": "10.131.25.3"
        },
        "index": {
          "size": {
            "total_in_bytes": 208,
            "reused_in_bytes": 0,
            "recovered_in_bytes": 208,
            "percent": "100.0%"
          },
          "files": {
            "total": 1,
            "reused": 0,
            "recovered": 1,
            "percent": "100.0%"
          },
          "total_time_in_millis": 63,
          "source_throttle_time_in_millis": 0,
          "target_throttle_time_in_millis": 0
        },
        "translog": {
          "recovered": 0,
          "total": 0,
          "percent": "100.0%",
          "total_on_start": 0,
          "total_time_in_millis": 36
        },
        "verify_index": {
          "check_index_time_in_millis": 0,
          "total_time_in_millis": 0
        }
      },
      {
        "id": 0,
        "type": "PEER",
        "stage": "DONE",
        "primary": true,
        "start_time_in_millis": 1716778189453,
        "stop_time_in_millis": 1716778190119,
        "total_time_in_millis": 666,
        "source": {
          "id": "Ok7_0yLdTqmpk2QQ1fNcQA",
          "host": "10.131.25.4",
          "transport_address": "10.131.25.4:9300",
          "ip": "10.131.25.4",
          "name": "10.131.25.4"
        },
        "target": {
          "id": "Cw01hSFeQYGoAac3qqX66g",
          "host": "10.131.25.6",
          "transport_address": "10.131.25.6:9300",
          "ip": "10.131.25.6",
          "name": "10.131.25.6"
        },
        "index": {
          "size": {
            "total_in_bytes": 208,
            "reused_in_bytes": 0,
            "recovered_in_bytes": 208,
            "percent": "100.0%"
          },
          "files": {
            "total": 1,
            "reused": 0,
            "recovered": 1,
            "percent": "100.0%"
          },
          "total_time_in_millis": 72,
          "source_throttle_time_in_millis": 0,
          "target_throttle_time_in_millis": 0
        },
        "translog": {
          "recovered": 0,
          "total": 0,
          "percent": "100.0%",
          "total_on_start": 0,
          "total_time_in_millis": 52
        },
        "verify_index": {
          "check_index_time_in_millis": 0,
          "total_time_in_millis": 0
        }
      }
    ]
  },
  ".kibana-event-log-7.10.0-000001": {
    "shards": [
      {
        "id": 0,
        "type": "PEER",
        "stage": "DONE",
        "primary": true,
        "start_time_in_millis": 1716778188626,
        "stop_time_in_millis": 1716778189195,
        "total_time_in_millis": 568,
        "source": {
          "id": "rpht7K-ITvysPHguo3C-UQ",
          "host": "10.131.25.3",
          "transport_address": "10.131.25.3:9300",
          "ip": "10.131.25.3",
          "name": "10.131.25.3"
        },
        "target": {
          "id": "Cw01hSFeQYGoAac3qqX66g",
          "host": "10.131.25.6",
          "transport_address": "10.131.25.6:9300",
          "ip": "10.131.25.6",
          "name": "10.131.25.6"
        },
        "index": {
          "size": {
            "total_in_bytes": 208,
            "reused_in_bytes": 0,
            "recovered_in_bytes": 208,
            "percent": "100.0%"
          },
          "files": {
            "total": 1,
            "reused": 0,
            "recovered": 1,
            "percent": "100.0%"
          },
          "total_time_in_millis": 90,
          "source_throttle_time_in_millis": 0,
          "target_throttle_time_in_millis": 0
        },
        "translog": {
          "recovered": 1,
          "total": 1,
          "percent": "100.0%",
          "total_on_start": 1,
          "total_time_in_millis": 371
        },
        "verify_index": {
          "check_index_time_in_millis": 0,
          "total_time_in_millis": 0
        }
      },
      {
        "id": 0,
        "type": "PEER",
        "stage": "DONE",
        "primary": false,
        "start_time_in_millis": 1716778100711,
        "stop_time_in_millis": 1716778100840,
        "total_time_in_millis": 129,
        "source": {
          "id": "rpht7K-ITvysPHguo3C-UQ",
          "host": "10.131.25.3",
          "transport_address": "10.131.25.3:9300",
          "ip": "10.131.25.3",
          "name": "10.131.25.3"
        },
        "target": {
          "id": "Ok7_0yLdTqmpk2QQ1fNcQA",
          "host": "10.131.25.4",
          "transport_address": "10.131.25.4:9300",
          "ip": "10.131.25.4",
          "name": "10.131.25.4"
        },
        "index": {
          "size": {
            "total_in_bytes": 208,
            "reused_in_bytes": 0,
            "recovered_in_bytes": 208,
            "percent": "100.0%"
          },
          "files": {
            "total": 1,
            "reused": 0,
            "recovered": 1,
            "percent": "100.0%"
          },
          "total_time_in_millis": 33,
          "source_throttle_time_in_millis": 0,
          "target_throttle_time_in_millis": 0
        },
        "translog": {
          "recovered": 1,
          "total": 1,
          "percent": "100.0%",
          "total_on_start": 1,
          "total_time_in_millis": 63
        },
        "verify_index": {
          "check_index_time_in_millis": 0,
          "total_time_in_millis": 0
        }
      }
    ]
  },
  ".kibana_1": {
    "shards": [
      {
        "id": 0,
        "type": "EMPTY_STORE",
        "stage": "DONE",
        "primary": true,
        "start_time_in_millis": 1716778095175,
        "stop_time_in_millis": 1716778095302,
        "total_time_in_millis": 127,
        "source": {},
        "target": {
          "id": "rpht7K-ITvysPHguo3C-UQ",
          "host": "10.131.25.3",
          "transport_address": "10.131.25.3:9300",
          "ip": "10.131.25.3",
          "name": "10.131.25.3"
        },
        "index": {
          "size": {
            "total_in_bytes": 0,
            "reused_in_bytes": 0,
            "recovered_in_bytes": 0,
            "percent": "0.0%"
          },
          "files": {
            "total": 0,
            "reused": 0,
            "recovered": 0,
            "percent": "0.0%"
          },
          "total_time_in_millis": 29,
          "source_throttle_time_in_millis": 0,
          "target_throttle_time_in_millis": 0
        },
        "translog": {
          "recovered": 0,
          "total": 0,
          "percent": "100.0%",
          "total_on_start": 0,
          "total_time_in_millis": 60
        },
        "verify_index": {
          "check_index_time_in_millis": 0,
          "total_time_in_millis": 0
        }
      },
      {
        "id": 0,
        "type": "PEER",
        "stage": "DONE",
        "primary": false,
        "start_time_in_millis": 1716778097736,
        "stop_time_in_millis": 1716778100034,
        "total_time_in_millis": 2297,
        "source": {
          "id": "rpht7K-ITvysPHguo3C-UQ",
          "host": "10.131.25.3",
          "transport_address": "10.131.25.3:9300",
          "ip": "10.131.25.3",
          "name": "10.131.25.3"
        },
        "target": {
          "id": "Ok7_0yLdTqmpk2QQ1fNcQA",
          "host": "10.131.25.4",
          "transport_address": "10.131.25.4:9300",
          "ip": "10.131.25.4",
          "name": "10.131.25.4"
        },
        "index": {
          "size": {
            "total_in_bytes": 208,
            "reused_in_bytes": 0,
            "recovered_in_bytes": 208,
            "percent": "100.0%"
          },
          "files": {
            "total": 1,
            "reused": 0,
            "recovered": 1,
            "percent": "100.0%"
          },
          "total_time_in_millis": 127,
          "source_throttle_time_in_millis": 0,
          "target_throttle_time_in_millis": 0
        },
        "translog": {
          "recovered": 6,
          "total": 6,
          "percent": "100.0%",
          "total_on_start": 6,
          "total_time_in_millis": 1479
        },
        "verify_index": {
          "check_index_time_in_millis": 0,
          "total_time_in_millis": 0
        }
      }
    ]
  }
}
  • <1> type 字段告诉你恢复的本质;这个分片是在从一个快照恢复。
  • <2> source 哈希描述了作为恢复来源的特定快照和仓库。
  • <3> percent 字段让你对恢复的状态有个概念。这个特定分片目前已经恢复了 94% 的文件;它就快完成了。

输出会列出所有目前正在经历恢复的索引,然后列出这些索引里的所有分片。每个分片里会有启动/停止时间、持续时间、恢复百分比、传输字节数等统计值。

取消一个恢复

要取消一个恢复,你需要删除正在恢复的索引。因为恢复进程其实就是分片恢复,发送一个 删除索引 API 修改集群状态,就可以停止恢复进程。比如:

DELETE /restored_index_3

如果 restored_index_3 正在恢复中,这个删除命令会停止恢复,同时删除所有已经恢复到集群里的数据。