Elasticsearch 索引备份与恢复

快照备份

快照是增量的:索引的每个快照只存储不属于早期快照的数据。这使您能够以最少的开销拍摄频繁的快照

配置仓库地址

创建文件夹用作Elasticsearch备份仓库:

 mkdir /usr/local/backup

赋权限

chmod 777 /usr/local/backup

在elasticsearch.yml文件中增加path.repo路径配置:

vim /usr/local/elasticsearch/config/elasticsearch.yml
#加上这个配置
path.repo: ["/usr/local/backup"]

重启elasticsearch

创建仓库
PUT _snapshot/my_backup
{
    "type": "fs",
    "settings": {
        "location": "/mount/backups/my_backup",
        "max_snapshot_bytes_per_sec" : "50mb",	
        "max_restore_bytes_per_sec" : "50mb"	
    }
}

my_backup:仓库名称

type:指定仓库的类型是一个共享文件系统

localhost:指定已挂载的设备作为仓库地址

max_snapshot_bytes_per_sec:当快照数据进入仓库时,这个参数控制这个过程的限流情况。默认每秒 20mb

max_restore_bytes_per_sec:当从仓库恢复数据时,这个参数控制什么时候恢复过程会被限流以保障你的网络不会被占满。默认每秒 20mb

快照所有打开的索引
PUT _snapshot/my_backup/snapshot_1

快照所有打开的索引到my_backup仓库中,快照的名称为snapshot_1,这个调用会立刻返回,然后快照会在后台运行

PUT _snapshot/my_backup/snapshot_1?wait_for_completion=true

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

快照指定索引
PUT _snapshot/my_backup/snapshot_2
{
    "indices": "index_1,index_2"
}

这个快照命令只会备份索引名称为index1index2

查询快照信息
GET _snapshot/my_backup/snapshot_2

返回my_backup仓库下snapshot_2索引的详细信息

GET _snapshot/my_backup/_all

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

删除快照
DELETE _snapshot/my_backup/snapshot_2

删除my_backup仓库下名称为snapshot_2的快照

查看快照进度
GET _snapshot/my_backup/snapshot_3

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

GET _snapshot/my_backup/snapshot_3/_status

推荐使用使用_status查看快照进度,_status API 立刻返回,然后给出详细的多的统计值输出。

分片可以在不同的完成状态:

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

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

快照恢复
POST _snapshot/my_backup/snapshot_1/_restore

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

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

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

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

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

监控恢复操作
GET restored_index_3/_recovery

查看restored_index_3索引的恢复情况

{
  "restored_justin_xiao" : {
    "shards" : [
      {
        "id" : 1,
        "type" : "SNAPSHOT",
        "stage" : "DONE",
        "primary" : true,
        "start_time_in_millis" : 1637254668568,
        "stop_time_in_millis" : 1637254668746,
        "total_time_in_millis" : 178,
        "source" : {
          "repository" : "my_backup",
          "snapshot" : "snapshot_1",
          "version" : "7.9.0",
          "index" : "justin_xiao",
          "restoreUUID" : "6BCjfB81RFqNs7l3clRZpw"
        },
        "target" : {
          "id" : "4D7R303OScSbFvoolxityw",
          "host" : "127.0.0.1",
          "transport_address" : "127.0.0.1:9300",
          "ip" : "127.0.0.1",
          "name" : "DESKTOP-VUKL4GD"
        },
        "index" : {
          "size" : {
            "total_in_bytes" : 6591,
            "reused_in_bytes" : 0,
            "recovered_in_bytes" : 6591,
            "percent" : "100.0%"
          },
          "files" : {
            "total" : 4,
            "reused" : 0,
            "recovered" : 4,
            "percent" : "100.0%"
          },
          "total_time_in_millis" : 118,
          "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" : 41
        },
        "verify_index" : {
          "check_index_time_in_millis" : 0,
          "total_time_in_millis" : 0
        }
      },
      {
        "id" : 2,
        "type" : "SNAPSHOT",
        "stage" : "DONE",
        "primary" : true,
        "start_time_in_millis" : 1637254668585,
        "stop_time_in_millis" : 1637254668854,
        "total_time_in_millis" : 268,
        "source" : {
          "repository" : "my_backup",
          "snapshot" : "snapshot_1",
          "version" : "7.9.0",
          "index" : "justin_xiao",
          "restoreUUID" : "6BCjfB81RFqNs7l3clRZpw"
        },
        "target" : {
          "id" : "4D7R303OScSbFvoolxityw",
          "host" : "127.0.0.1",
          "transport_address" : "127.0.0.1:9300",
          "ip" : "127.0.0.1",
          "name" : "DESKTOP-VUKL4GD"
        },
        "index" : {
          "size" : {
            "total_in_bytes" : 12616,
            "reused_in_bytes" : 0,
            "recovered_in_bytes" : 12616,
            "percent" : "100.0%"
          },
          "files" : {
            "total" : 7,
            "reused" : 0,
            "recovered" : 7,
            "percent" : "100.0%"
          },
          "total_time_in_millis" : 191,
          "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" : 42
        },
        "verify_index" : {
          "check_index_time_in_millis" : 0,
          "total_time_in_millis" : 0
        }
      },
      {
        "id" : 0,
        "type" : "SNAPSHOT",
        "stage" : "DONE",
        "primary" : true,
        "start_time_in_millis" : 1637254668615,
        "stop_time_in_millis" : 1637254668746,
        "total_time_in_millis" : 131,
        "source" : {
          "repository" : "my_backup",
          "snapshot" : "snapshot_1",
          "version" : "7.9.0",
          "index" : "justin_xiao",
          "restoreUUID" : "6BCjfB81RFqNs7l3clRZpw"
        },
        "target" : {
          "id" : "4D7R303OScSbFvoolxityw",
          "host" : "127.0.0.1",
          "transport_address" : "127.0.0.1:9300",
          "ip" : "127.0.0.1",
          "name" : "DESKTOP-VUKL4GD"
        },
        "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" : 64,
          "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
        }
      }
    ]
  }
}

type:字段告诉你恢复的类型;SNAPSHOT表示这个分片是在从一个快照恢复。

source:描述了作为恢复来源的特定快照和仓库。

percent:恢复进度

取消一个快照恢复
DELETE /restored_index_3

要取消一个恢复,你需要删除正在恢复的索引。因为恢复进程其实就是分片恢复,发送一个 删除索引 API 修改集群状态,就可以停止恢复进程。如果 restored_index_3索引正在恢复中,这个删除命令会停止恢复,同时删除所有已经恢复到集群里的数据。

var code = “53aa3209-8eb6-4ae1-ae55-890363724e6b”