本篇主要学习下ElasticSearch生产中的运维-备份和恢复。
备份:
第一步,创建仓库
其实就是创建一个备份存储的目的仓库,支持FileSystem、Amazon S3、Azure Cloud、HDFS
创建命令如下:
PUT _snapshot/my_backup
{
"type": "fs",
"settings": {
"location": "/home/docker/back"
}
}
首先给到我们的一个信息是,命令都是通过http协议进行,所以ES的备份是ES运行时进行的,并不是单纯的系统级的文件拷贝,备份前请先启动ES
命令执行后报错:
"reason": "[my_backup] location [/mount/backups/my_backup] doesn't match any of the locations specified by path.repo because this setting is empty"
翻找资料发现做备份的location fs需要在elasticsearch.yml中配置一下,增加一行:
path.repo: ["/home/docker/back"]
修改配置后重启ES,再运行上面命令,成功。
这里Settings里有几个默认参数需要了解下:
compress,是否压缩,默认为是。
max_restore_bytes_per_sec,节点恢复速率。默认40mb/s。
max_snapshot_bytes_per_sec,每个节点快照速率。默认40mb/s。
可以用如下命令修改默认参数:
POST _snapshot/my_backup/
{
"type": "fs",
"settings": {
"compress": true,
"location": "/home/docker/back",
"max_snapshot_bytes_per_sec" : "50mb",
"max_restore_bytes_per_sec" : "50mb"
}
}
仓库创建完毕后,我们去location的位置去看一眼,里面目前还是空的。
第二步,备份索引
本质是在刚才的仓库里创建快照,快照可以指定一个或多个索引进行备份,默认是全部索引,同一个仓库可以创建多个快照。
备份过程也分为同步和异步,默认是异步,备份在后台执行,可以通过wait_for_completion=true参数设定为同步。
异步方式备份全部索引
PUT _snapshot/my_backup/snapshot_all
同步方式备份部分索引
PUT _snapshot/my_backup/snapshot_entity?wait_for_completion=true
{
"indices": "index_entity"
}
这步执行后location下真正增加了快照文件。
第三步,查看备份信息
GET _snapshot/my_backup/snapshot_all
返回如下:
{
"snapshots": [
{
"snapshot": "snapshot_all",
"uuid": "4LWRo_WbR5mzFlZ6ozuDrg",
"version_id": 5060199,
"version": "5.6.1",
"indices": [
"my_index",
"applog",
"index_entity",
"index1",
".kibana"
],
"state": "SUCCESS",
"start_time": "2017-11-03T02:34:17.832Z",
"start_time_in_millis": 1509676457832,
"end_time": "2017-11-03T02:34:18.537Z",
"end_time_in_millis": 1509676458537,
"duration_in_millis": 705,
"failures": [],
"shards": {
"total": 21,
"failed": 0,
"successful": 21
}
}
]
}
其实这个跟上面同步备份时的返回是一样的,此命令主要用来查看异步备份执行结果。
第四部,删除废弃备份快照
DELETE _snapshot/my_backup/snapshot_applog
恢复:
恢复命令比较简单,就是选择一个快照执行_restore就可以了也是默认异步执行,通过wait_for_completion=true可以改成同步执行,如下:
POST _snapshot/my_backup/snapshot_entity/_restore
但执行后报错如下:
reason": "[my_backup:snapshot_entity/hxNnq8CsRAm3Yi8IvD0ZeA] cannot restore index [index_entity] because it's open"
再去寻找资料,发下索引在被回复时需要先关闭,否则索引的写操作会影响恢复,于是关闭索引:
POST index_entity/_close
再执行恢复命令
POST _snapshot/my_backup/snapshot_entity/_restore
成功。恢复好后记得打开索引
POST index_entity/_open
如果要从一个大快照中只恢复部分索引,命令如下:
POST _snapshot/my_backup/snapshot_all/_restore
{
"indices": "index_entity"
}