原文地址:[es数据备份和恢复 – 阿dai的家 – OSCHINA – 中文开源技术交流社区](https://my.oschina.net/adailinux/blog/3007239)
- Elasticsearch 5.x 数据备份和恢复可由 snapshot 模块来完成,snapshot模块可以通过文件共享系统为单个索引或整个集群远程创建快照和进行数据恢复。
数据备份
索引快照时增量的。在创建快照前es会分析已有快照仓库,只对上次备份后更改的内容进行增量备份。在创建备份时同一个集群中只能运行一个es snapshot进程。
Es 基础命令
创建快照仓库
curl -X PUT "node1:9200/_snapshot/my_backup" -H 'Content-Type: application/json' -d'{ "type": "fs", "settings": { "location": "sys_backup" } }'
查看已注册的快照仓库
curl -X GET "node1:9200/_snapshot/my_backup"
可以使用逗号间隔多个仓库,星号通配符匹配所有仓库名字,下面示例返回仓库名以repo开头的和包含backup的仓库信息:
curl -X GET "node1:9200/_snapshot/repo*,*backup*"
获取所有已注册快照仓库,省略仓库名或者使用_all
curl -X GET "node1:9200/_snapshot"
或者
curl -X GET "node1:9200/_snapshot/_all"
查看快照仓库列表
curl -X GET "node1:9200/_cat/repositories?v"
准备工作
文件共享系统
nfs、hdfs?
共享文件系统仓库(“type”: “fs”)使用共享文件系统存快照,如果要注册共享文件系统仓库,必须在所有master和data节点挂载相同的共享文件系统到同一个路径位置。这个路径位置(或者它的一个父目录)必须在所有master和data节点的path.repo设置上注册。
假设共享文件系统挂载到
/data/backups/es_backup
,应该在elasticsearch.yml文件中添加如下配置:path.repo: ["/data/backups", "/data/longterm_backups"]
创建快照仓库
所有节点重启之后,执行下面的命令注册名字为
es_backup
的共享文件系统仓库:curl -X PUT 'node1:9200/_snapshot/es_backup?verify=false' -H 'Content-Type: application/json' -d'{ "type": "fs", "settings": { "location": "/mount/backups/es_backup", "compress": true, "max_restore_bytes_per_sec": 50m, "max_snapshot_bytes_per_sec": 30m } }'
如果使用相对路径,该路径将根据在path.repo中定义的第一个路径决定:
curl -XPUT 'http://node1:9200/_snapshot/es_backup?verify=false' -H 'Content-Type: application/json' -d '{ "type": "fs", "settings": { "location": "es_backup", "compress": true, "max_restore_bytes_per_sec": 50m, "max_snapshot_bytes_per_sec": 30m } }'
参数说明
参数 | 含义 |
---|---|
location |
快照存储位置 |
compress |
是否压缩源文件,默认为true |
chunk_size |
如果有需要,可以将大文件分解为多个小文件,默认不开启 |
max_restore_bytes_per_sec |
指定数据恢复速度,默认为 40m/s |
max_snapshot_bytes_per_sec |
指定创建快照时的速度,默认为 40m/s |
readonly |
设置为只读仓库,默认为false |
##### Repository Verification
在创建一个仓库时,会即刻在集群所有节点验证确保其功能在所有节点可用,verify
参数可以用来取消该验证(如果想使用验证功能,创建仓库时去掉 ?verify=false
参数即可):
“`bash
curl -XPUT 'http://node1:9200/_snapshot/es_backup?verify=false' -H 'Content-Type: application/json' -d '{
"type": fs
… …
}'
“`
验证过程可以通过下面命令手动执行:
“`bash
curl -X POST "node1:9200/_snapshot/es_backup/_verify"
“`
### Snapshot
#### 创建快照
一个仓库可以拥有同一个集群的多个快照。在一个集群中快照拥有一个唯一名字作为标识。
示例: 在仓库 es_backup 中创建名字为 test_snapshot 的快照,可以通过执行下面的命令来实现。
“`bash
curl -X PUT "node1:9200/_snapshot/es_backup/test_snapshot?wait_for_completion=true"
“`
参数 wait_for_completion 决定请求是在快照初始化后立即返回(默认),还是等快照创建完成之后再返回。快照初始化时,所有之前的快照信息会被加载到内存,所以在一个大的仓库中改请求需要若干秒(甚至分钟)才能返回,即使参数 wait_for_completion 的值设置为 false。
默认情况下,创建一个快照会包含集群中所有打开和启动状态的索引。可以通过在创建快照的请求体中定义索引列表来改变这个默认处理:
“`bash
curl -X PUT "node1:9200/_snapshot/es_backup/test_snapshot_2?wait_for_completion=true" -H 'Content-Type: application/json' -d'
{
"indices": "index_1,index_2",
"ignore_unavailable": true,
"include_global_state": false
}
“`
要包含到快照中索引列表可以使用支持多个索引语法的 indices 参数来指定。快照请求也支持 ignore_unavailable
选项,该选项设置为 true
时,在创建快照时会忽略不存在的索引。默认情况下,如果选项 ignore_unavailable
没有设值,一个索引缺失,快照请求会失败。
通过设置 include_global_state
为 false
,可以阻止集群全局状态信息被保存为快照的一部分。默认情况下,如果如果一个快照中的一个或者多个索引没有所有主分片可用,整个快照创建会失败,该情况可以通过设置 partial 为 true 来改变。
快照名可以通过使用 date_math_expressions
来自动获得,和创建新索引时类似。注意特殊字符需要 URI 转码处理。
例如,在名字中使用当前日期,比如 snapshot-2018.05.11,来创建快照,可以使用如下命令完成:
“`bash
# PUT /_snapshot/es_backup/<snapshot-{now/d}>
curl -X PUT "node1:9200/_snapshot/es_backup/%3Csnapshot-%7Bnow%2Fd%7D%3E"
“`
创建快照:
“`bash
curl -X PUT "node1:9200/_snapshot/es_backup/syslog?wait_for_completion=true" -H 'Content-Type: application/json' -d'
{
"indices": "bash_history.log*,secure.log*,cron.log*",
"ignore_unavailable": true,
"include_global_state": false
}
“`
#### 查看快照信息
“`bash
curl -X GET "node1:9200/_snapshot/es_backup/syslog"
“`
这个命令返回快照的基本信息,包括开始合结束时间、创建快照的 ElasticSearch 版本、包含的索引列表、快照当前状态和快照期间产生的失败索引列表。快照的状态有:
状态 | 含义 |
---|---|
IN_PROGRESS |
正在创建快照 |
SUCCESS |
快照创建成功 |
FAILED |
快照创建完成,但是有错误,数据不会保存 |
PARTIAL |
整个集群备份完成,但是至少有一个shard数据存贮失败,会有更具体报错信息 |
INCOMPATIBLE |
创建快照的es版本和当前集群es版本不一致 |
查看某仓库下所有快照信息:
“`bash
curl -X GET "node1:9200/_snapshot/es_backup/_all"
“`
查看当前正在运行的快照:
“`bash
curl -X GET "localhost:9200/_snapshot/my_backup/_current"
“`
#### 删除快照
从仓库中删除一个快照,使用如下命令:
“`bash
curl -X DELETE "node1:9200/_snapshot/es_backup/test_snapshot_2"
“`
当一个快照从仓库中删除,ElasticSearch 将删除该快照关联的但不被其他快照使用的所有文件。如果在快照创建的时候执行快照删除操作,此快照创建进程将终止且所有该进程已创建的文件也将被清理。所以,快照删除操作可以用来取消错误启动的长时间运行的快照操作。
#### 删除仓库
可以使用下面命令注销仓库:
“`bash
curl -X DELETE "node1:9200/_snapshot/es_backup"
“`
## 数据恢复
### 全量恢复
快照可以通过执行以下命令恢复
“`bash
curl -X POST "node1:9200/_snapshot/es_backup/syslog/_restore"
“`
默认情况下,快照中的所有索引将被恢复,集群状态不被恢复。可以通过在恢复请求中使用 indices 和 include_global_state 选项来指定要恢复的索引和允许恢复集群全局状态。索引列表支持多索引语法。rename_pattern 和 rename_replacement 选项在恢复时通过正则表达式来重命名索引。设置 include_aliases 为 false 可以防止与索引关联的别名被一起恢复。
“`bash
curl -X POST "localhost:9200/_snapshot/my_backup/snapshot_1/_restore" -H 'Content-Type: application/json' -d'
{
"indices": "index_1,index_2",
"ignore_unavailable": true,
"include_global_state": true,
"rename_pattern": "index_(.+)",
"rename_replacement": "restored_index_$1"
}'
“`
恢复操作可以在正常运行的集群上执行。已存在的索引只能在关闭状态下才能恢复,并且要跟快照中索引拥有相同数目的分片。还原操作自动打开关闭状态的索引,如果被还原索引在集群不存在,将创建新索引。如果集群状态通过 include_global_state
(默认是 false)选项被还原,在集群中不存在的模板会被新增,已存在的同名模板会被快照中的模板替换。持久化设置会被添加到现有的持久化设置中。
## 参考