ES允许我们为某一个index
或者是整个cluster
创建snapshot, 并将这些snapshot存储在remote repository中比如shared file system
S3
HDFS
.
Repository
在我们创建snapshot之前,需要先向ES注册一个remote snapshot repository
, 相当于是告知ES cluster,我们将在某一个地方(S3 bucket)创建一个remote repository专门用来存放当前这个集群的snapshot。根据snapshot存放的位置不同,有多种不同类型的snapshot repository
:
- shared_file_system_repository
- S3 repositories
- HDFS repository
- Google Cloud Storage repositories
- ...
查看当前集群的所有repository
GET /_snapshot/_all
查看某一个repository的具体setting
GET /_snapshot/repo-name
repository verification
当一个repository被注册之后,ES会立刻验证集群中所有的节点(data node、 master node)都能正常和repository工作。这是默认行为。
删除repository
DELETE /_snapshot/my_backup
这样只会删除ES和这个remote repo的引用关系,相当于只是删除那次注册,remote repository中所有文件都依然存在。
Snapshot
一个repository中可以包含多个同一集群的snapshot,也就是ES期待我们只会在一个Repository只能存放某一个集群的snapshot。
如何创建Snapshot
通常我们会使用
PUT /_snapshot/repository_name/snapshot_name
指定在某一个repo中创建一个snapshot。默认情况下,这个指令会给整个cluster创建一个snapshot并存放在指定的remote repo中。
当然你可以创建snapshot的同时指定一些配置,比如只备份某一个index、
PUT /_snapshot/my_backup/snapshot_1
{
"indices": "index_1,index_2",
"ignore_unavailable": true,
"include_global_state": false
}
这个指令可以只备份index_1/index_2
两个index
如何查看snapshot
GET /_snapshot/repo_name/snapshot_name
这个指令返回关于snapshot的基本信息,包括开始和结束时间、创建快照的elasticsearch版本、包含的索引列表、快照的当前状态和快照期间发生的故障列表。
你也可以通过
GET /_snapshot/my_backup/_all
查看当前repo中所有的snapshot
如何删除snapshot
DELETE /_snapshot/my_backup/snapshot_1
使用以上指令删除snapshot的时候:
- 会将repository中所有和这个快照相关的文件都删除
- 会保留下来那些被其他还存在的快照使用的文件(因为快照是增量的)
Note
注意如果你想要删除repo中的所有快照,不要使用下面的命令,直接删除remote repo
DELETE /_snapshot/my_backup
因为这样只会删除ES和这个remote repo的引用关系,相当于只是删除那次注册,remote repository所有文件都依然存在。
增量snapshot
snapshot是增量的。在创建snapshot的时候,Elasticsearch会分析已经存在snapshot,只备份自上一次快照以来创建或更改的文件, 那些没有更改的文件会直接引用到上一次的snapshot中。因此如果频繁备份,那么snapshot的文件会越来越小。
注意
snapshot是某一个时间点的集群状态,因此开始创建快照之后所有对ES的修改都不会出现在这次snapshot中。
创建snapshot的过程中,集群所有的工作都不会被block。但是同一时间,只能有一份snapshot在创建