官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html
前几天在写一个刷新ES tool的时候,在QA的test环境上测试tool, 由于测试环境设置了public ip and private ip , 外加对测试环境中ES集群配置的不了解。结果在用postman 测试9200端口能不能访问时, 一个不小心将一个index 删除(还好不是pro 环境。。。),乍一看57万余条数据。。。
废话不多说,让我们开始一键还原吧
快照和恢复
Snapshot and restore 模块允许创建单个索引或者整个集群的快照到远程仓库. 在初始版本里只支持共享文件系统的仓库,但是现在通过官方的仓库插件可以支持各种各样的后台仓库。
仓库
在进行任何快照或者恢复操作之前必须有一个快照仓库注册在Elasticsearch里。下面的这个命令注册了 一个名为my_backup 的共享文件系统仓库,快照将会存储在 /mount/backups/my_backup 这个目录。
$ curl -XPUT ‘http://localhost:9200/_snapshot/my_backup’ -d ‘{
“type”: “fs”,
“settings”: {
“location”: “/mount/backups/my_backup”,
“compress”: true
} }’
一旦仓库被注册了,就可以只用下面的命令去获取这个仓库的信息
$ curl -XGET ‘http://localhost:9200/_snapshot/my_backup?pretty’ {
“my_backup” : {
“type” : “fs”,
“settings” : {
“compress” : “true”,
“location” : “/mount/backups/my_backup”
} } }
如果没有指定仓库名字,或者使用 _all 作为仓库名字,Elasticsearch将返回该集群当前注册的所有仓库的信息:
$ curl -XGET ‘http://localhost:9200/_snapshot’ or
$ curl -XGET ‘http://localhost:9200/_snapshot/_all’
共享文件系统的仓库
共享文件系统仓库 (“type”: “fs”) 是使用共享的文件系统去存储快照。 在 location 参数里指定的具体存储路径必须和共享文件系统里的位置是一样的并且能被所有的数据节点和master节点访问。 另外还支持如下的一些参数设置:
location
指定快照的存储位置。必须要有
compress
指定是否对快照文件进行压缩. 默认是 true.
chunk_size
如果需要在做快照的时候大文件可以被分解成几块。这个参数指明了每块的字节数。也可用不同的单位标识。 比如,1g,10m,5k等。默认是 null (表示不限制块大小)。
max_restore_bytes_per_sec
每个节点恢复数据的最高速度限制. 默认是 20mb/s
max_snapshot_bytes_per_sec
每个节点做快照的最高速度限制。默认是 20mb/s
只读URL仓库
URL仓库(“type”: “url”)可以作为使用共享文件系统存储快照创建的共享文件系统仓库的只读访问方式。 url 参数指定的URL必须指向共享文件系统仓库的根。支持的配置方式如下:
url
指定快照位置。必须要有
仓库插件
下面这些官方插件中的仓库后台都是可用的:
AWS Cloud Plugin 亚马逊S3仓库
HDFS Plugin Hadoop环境
Azure Cloud Plugin Azure存储仓库
快照
一个仓库可以包含同一个集群的多个快照。快照根据集群中的唯一名字进行区分。 在仓库 my_backup 里创建一个名为snapshot_1 的快照可以通过下面的命令:
$ curl -XPUT
“localhost:9200/_snapshot/my_backup/snapshot_1?wait_for_completion=true”
wait_for_completion 参数指定创建snapshot的请求是否等待快照创建完成再返回。 默认情况下,集群中所有打开和启动的索引是自动创建快照的。可以通过在快照请求里列出需要创建快照的索引。 parameter specifies whether or not the request should return immediately or wait for snapshot completion. By default snapshot of all open and started indices in the cluster is created. This behavior can be changed by specifying the list of indices in the body of the snapshot request.
$ curl -XPUT “localhost:9200/_snapshot/my_backup/snapshot_1” -d ‘{
“indices”: “index_1,index_2”,
“ignore_unavailable”: “true”,
“include_global_state”: false
“partial”: “false” }’
上述命令中通过 indices 参数指定快照包含的索引,这个参数支持同时配置多个索引 multi index syntax. 快照请求同样支持 ignore_unavailable 选项。把这个选项设置为 true 的时候在创建快照的过程中会忽略不存在的索引。默认情况下, 如果没有设置 ignore_unavailable 在索引不存在的情况下快照请求将会失败。通过设置 include_global_state 为false 能够防止 集群的全局状态被作为快照的一部分存储起来。默认情况下,如果快照中的1个或多个索引不是全部主分片都可用会导致整个创建快照的过 程失败。 通过设置 partial 为 true 可以改变这个行为。
索引创建快照的过程是增量的。在给索引创建快照的过程中,Elasticsearch会分析存储在仓库中的索引文件并且只会复制那些自从上次快照 之后新建或有所更新的文件。这使得多个快照以一种紧凑的方式存储在同一个仓库里。创建快照的过程是以非阻塞方式执行的。一个索引在创 建快照的同时能够被检索和查询。尽管如此,快照保存的是在开始进行创建快照的那个时间点的索引的视图。所以,在开始创建快照之后的记 录不会出现在这个快照里。在主分片启动之后创建快照的过程就会立即开始,并且之后不会改变位置。在1.2.0版本之前如果集群重新定位或者 新加入快照的索引初始化主分片会导致快照操作失败。从1.2.0版本开始,Elasticsearch会等待重新定位和初始化分片然后再创建快照。
除了给每个索引创建拷贝快照还能存储集群的全局元数据,包括集群的设置和模板。临时的设置和已经注册的快照仓库不会被作为快照的一部 分来存储。
任何时候在集群里只能有一个创建快照的操作在执行。当一个分片正在创建快照的时候,这个分片就不能被迁移到别的节点,因为这会影响重 新平衡和分配过滤的过程。一旦这个分片的快照建立完成,这个分片就可以根据现有的分配过滤和重新平衡算法被迁移到别的节点上。
如果快照已经建立,我们可以通过如下的命令去获得快照的信息:
$ curl -XGET “localhost:9200/_snapshot/my_backup/snapshot_1”
通过如下的命令可以把仓库里所有的快照列出来:
$ curl -XGET “localhost:9200/_snapshot/my_backup/_all”
可以通过如下的命令将仓库里的某个快照删除:
$ curl -XDELETE “localhost:9200/_snapshot/my_backup/snapshot_1”
当一个快照从仓库里删除之后,Elasticsearch会把所有和这个快照相关并且不被其它快照使用的文件删除。如果对正在创建的某个快照执行 删除操作,则创建快照的过程会被取消,并且会把创建过程中所有已经创建的文件删除。因此,删除操作可以用来取消那些由于误操作引起的 长时间运行的快照操作。
恢复
快照可以使用如下的操作来恢复:
$ curl -XPOST “localhost:9200/_snapshot/my_backup/snapshot_1/_restore”
默认情况下,快照中的所有索引以及集群状态都会被恢复。在恢复请求中可以通过 indices 来指定需要被恢复的索引,同样可以使用 include_global_state 选项来防止恢复集群的状态。 indices 支持配置多个索引multi index syntax.rename_pattern 和 rename_replacement 选项可以在恢复的时候使用正则表达式来重命名index。详见 这里.
$ curl -XPOST “localhost:9200/snapshot/my_backup/snapshot_1/restore"
-d '{
“indices”: “index_1,index_2”,
“ignore_unavailable”: “true”,
“include_global_state”: false,
“rename_pattern”: "index(.+)",
“rename_replacement”: "restored_index$1” }’
恢复操作可以在正在运行的集群上操作。尽管如此,已经存在的index只有在关闭之后才能被恢复。恢复操作会自动打开关闭的恢复的索引, 并且创建新的索引如果索引不存在。如果集群状态也是恢复的,如果恢复的模板不存在会被新建,如果同名的模板已经存在则会被覆盖代替。 恢复的持久性设置会被增加到现存的持久性设置里。
快照状态
新增于[1.1.0]
正在运行的快照的详细信息可以通过如下的命令来获取:
$ curl -XGET “localhost:9200/_snapshot/_status”
在这种格式下,这个命令将会返回所有正在运行的快照的信息。通过指明仓库名字,能够把结果限定到具体的一个仓库。
$ curl -XGET “localhost:9200/_snapshot/my_backup/_status”
如果仓库名字和快照id都指明了,这个命令就会返回这个快照的详细信息,甚至这个快照不是正在运行。
$ curl -XGET “localhost:9200/_snapshot/my_backup/snapshot_1/_status”
同样支持多个快照id:
$ curl -XGET
“localhost:9200/_snapshot/my_backup/snapshot_1,snapshot_2/_status”
监控快照/恢复进度
有多种方法去监控运行时快照和恢复的进度。这2个操作都支持 wait_for_completion 参数,如果这个了这个参数将会阻塞客户端直到 操作完成。这是最简单的用来获取操作完成的通知的方法。
快照操作的进度也可以通过定时的调用下面的命令去获得:
$ curl -XGET “localhost:9200/_snapshot/my_backup/snapshot_1”
注意,获取快照信息的操作和快照操作使用相同的资源和线程池。所以,执行获取快照信息的操作的时候如果大量的分片正在做快照操作, 在获取快照新的操作返回结果之前需要先等到资源可用才行。如果分片太大,等待的时间会挺长。
要获取更多的及时和完整的关于快照的信息,可以使用如下的快照状态命令。
$ curl -XGET “localhost:9200/_snapshot/my_backup/snapshot_1/_status”
获取快照信息的方法只返回关于快照进度的基本信息, 快照状态命令会返回正在做快照的每个分片的具体信息。
恢复进度是装在Elasticsearch的标准恢复机制里的。所以,标准恢复监控服务能够被用来监控恢复的状态。当恢复操作在集群里执行的时候, 集群通常会变成 红色 状态。可能是因为恢复操作是从恢复被恢复的索引的主分片开始的。在恢复操作期间主分片变的不可用使得集群处于 红色 状态。一旦主分片的恢复完成,Elasticsearch会切换到标准复制过程,在这个过程会创建需要的复制个数,并且集群状态变为 黄色 。一旦所有的复制分片创建完成,集群会变成 绿色 状态。
集群健康操作只提供恢复过程的大致状态。可以通过 indices recovery 和 cat recovery APIs 获取恢复过程当前状态的更详细的信息。
停止正在运行的快照和恢复操作
快照和恢复框架只允许同一时刻每次运行1个快照或恢复操作。如果正在运行的一个快照是误操作导致的或者运行的时间太长,可以用快照删除 操作去终止正在执行的快照操作。快照删除操作会检查要删除的快照是否正在运行,如果是,删除操作先停止这个快照操作,然后再将它从仓库 里删除。
恢复操作是用用标准的分片回复机制。因此,任何正在运行的恢复操作可以通过删除正在恢复的索引来取消。注意,所有被删除的索引的数据也 会被从集群里删除。
总结: 有备无患
参考:http://blog.csdn.net/yinchunxiang/article/details/38727883