ES生产集群备份恢复之基于snapshot+hdfs+restore进行数据恢复
基于snapshot的数据恢复
1 | 正经备份,一般来说,是在一个shell脚本里,你用crontab做一个定时,比如每天凌晨1点,就将所有的数据做一次增量备份 |
1 | 20170721,做了一次snapshot,snapshot_20170721 |
数据恢复
如果我们用一些脚本定期备份数据之后,那么在es集群故障,导致数据丢失的时候,就可以用_restore api进行数据恢复了。比如下面这行命令:
1 | POST _snapshot/my_hdfs_repository/snapshot_1/_restore |
1 | curl -XGET 'http://elasticsearch01:9200/_snapshot/my_hdfs_repository/snapshot_1?pretty' |

这个时候,会将那个snapshot中的所有数据恢复到es中来,如果snapshot_1中包含了5个索引,那么这5个索引都会恢复到集群中来。不过我们也可以选择要从snapshot中恢复哪几个索引
我们还可以通过一些option来重命名索引,恢复索引的时候将其重命名为其他的名称。在某些场景下,比如我们想恢复一些数据但是不要覆盖现有数据,然后看一下具体情况,用下面的命令即可恢复数据,并且进行重命名操作:
POST /_snapshot/my_hdfs_repository/snapshot_1/_restore
{
“indices”: “index_1”,
“ignore_unavailable”: true,
“include_global_state”: true,
“rename_pattern”: “index_(.+)”,
“rename_replacement”: “restored_index_$1”
}
index_01
restores_index_01
这个restore过程也是在后台运行的,如果要在前台等待它运行完,那么可以加上wait_for_completion flag:POST _snapshot/my_backup/snapshot_1/_restore?wait_for_completion=true。
?wait_for_completion=true,包括之前讲解的备份,也是一样的,对运维中的自动化shell脚本,很重要,你的shell脚本里,要比如等待它备份完成了以后,才会去执行下一条命令
restore过程只能针对已经close掉的index来执行,而且这个index的shard还必须跟snapshot中的index的shard数量是一致的。restore操作会自动在恢复好一个index之后open这个index,或者如果这些index不存在,那么就会自动创建这些index。如果通过include_global_state存储了集群的state,还会同时恢复一些template。
默认情况下,如果某个索引在恢复的时候,没有在snapshot中拥有所有的shard的备份,那么恢复操作就会失败,比如某个shard恢复失败了。但是如果将partial设置为true,那么在上述情况下,就还是可以进行恢复操作得。不过在恢复之后,会自动重新创建足够数量的replica shard。
此外,还可以在恢复的过程中,修改index的一些设置,比如下面的命令:
POST /_snapshot/my_backup/snapshot_1/_restore
{
“indices”: “index_1”,
“index_settings”: {
“index.number_of_replicas”: 0
},
“ignore_index_settings”: [
“index.refresh_interval”
]
}
1 | curl -XDELETE 'http://elasticsearch01:9200/my_index?pretty' |

1 | curl -XGET 'http://elasticsearch01:9200/my_index/my_type/1' |

索引恢复
1 | curl -XPOST 'http://elasticsearch01:9200/_snapshot/my_hdfs_repository/snapshot_1/_restore?pretty' |

1 | curl -XGET 'http://elasticsearch01:9200/my_index/my_type/1' |

1 | 作为es集群管理员的话,有的时候可能还是要用curl命令,特别是可能要封装一些自动化的shell脚本,去做一些es的运维操作,比如自动定时备份 |
监控restore的进度
从一个仓库中恢复数据,其实内部机制跟从其他的node上恢复一个shard是一样的
如果要监控这个恢复的过程,可以用recovery api,比如:GET restored_index_1/_recovery
如果要看所有索引的恢复进度:GET /_recovery/,可以看到恢复进度的大致的百分比
1 | curl -XGET 'http://elasticsearch01:9200/my_index/_recovery?pretty' |

取消恢复过程
如果要取消一个恢复过程,那么需要删除已经被恢复到es中的数据
因为一个恢复过程就只是一个shard恢复,发送一个delete操作删除那个索引即可,比如:DELETE /restored_index_1
如果那个索引正在被恢复,那么这个delete命令就会停止恢复过程,然后删除已经恢复的 所有数据
1 | curl -XDELETE 'http://elasticsearch01:9200/my_index' |

本文作者 : Matrix
原文链接 : https://matrixsparse.github.io/2017/10/13/ES生产集群备份恢复之基于snapshot+hdfs+restore进行数据恢复/
版权声明 : 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
知识 & 情怀 | 二者兼得