从快照恢复

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

  1. POST _snapshot/my_backup/snapshot_1/_restore

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

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

  1. POST /_snapshot/my_backup/snapshot_1/_restore
  2. {
  3. "indices": "index_1", (1)
  4. "rename_pattern": "index_(.+)", (2)
  5. "rename_replacement": "restored_index_$1" (3)
  6. }

<1> 只恢复 index_1 索引,忽略快照中存在的其余索引。

<2> 查找所提供的模式能匹配上的正在恢复的索引。

<3> 然后把它们重命名成替代的模式。

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

TIP:

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

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

监控恢复操作

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

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

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

  1. GET restored_index_3/_recovery

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

  1. GET /_recovery/

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

  1. {
  2. "restored_index_3" : {
  3. "shards" : [ {
  4. "id" : 0,
  5. "type" : "snapshot", (1)
  6. "stage" : "index",
  7. "primary" : true,
  8. "start_time" : "2014-02-24T12:15:59.716",
  9. "stop_time" : 0,
  10. "total_time_in_millis" : 175576,
  11. "source" : { (2)
  12. "repository" : "my_backup",
  13. "snapshot" : "snapshot_3",
  14. "index" : "restored_index_3"
  15. },
  16. "target" : {
  17. "id" : "ryqJ5lO5S4-lSFbGntkEkg",
  18. "hostname" : "my.fqdn",
  19. "ip" : "10.0.1.7",
  20. "name" : "my_es_node"
  21. },
  22. "index" : {
  23. "files" : {
  24. "total" : 73,
  25. "reused" : 0,
  26. "recovered" : 69,
  27. "percent" : "94.5%" (3)
  28. },
  29. "bytes" : {
  30. "total" : 79063092,
  31. "reused" : 0,
  32. "recovered" : 68891939,
  33. "percent" : "87.1%"
  34. },
  35. "total_time_in_millis" : 0
  36. },
  37. "translog" : {
  38. "recovered" : 0,
  39. "total_time_in_millis" : 0
  40. },
  41. "start" : {
  42. "check_index_time" : 0,
  43. "total_time_in_millis" : 0
  44. }
  45. } ]
  46. }
  47. }

<1> type 字段告诉你恢复的本质;这个分片是在从一个快照恢复。

<2> source 哈希描述了作为恢复来源的特定快照和仓库。

<3> percent 字段让你对恢复的状态有个概念。这个特定分片目前已经恢复了 94% 的文件;它就快完成了。

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

取消一个恢复

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

  1. DELETE /restored_index_3

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