一 . 基本概念
Elasticsearch 的数据备份与恢复,核心就是快照(Snapshot)和恢复(Restore)机制------把索引数据复制到共享存储(如 NFS、S3、HDFS)中,需要时再拉回来。其实就和虚拟机类似,我们可以随时给虚拟机的当前状态拍下快照,然后在之后的时间可以恢复到当前快照的状态。
ES备份就是给ES的索引拍下一个快照,放到"仓库"中。然后如果需要恢复到之前数据,那么就调用恢复的API就可以了。
二 . 配置 NFS 快照仓库
Elasticsearch 集群有多个节点(服务器)。当我们做备份时,必须保证所有节点都能把数据写到同一个地方。
备份时,每个节点负责备份自己持有的那部分数据(分片)。如果每个节点写自己本地硬盘,数据就会分散在各处,根本无法拼凑成一个完整的、可恢复的备份。因此需要一个共享存储(NFS、S3、HDFS)作为统一的"汇聚点"。
而我们这里选择的共享存储就是NFS。

我们先在nfs服务端安装好nfs,同时创建一个文件夹,这个就是我们的共享文件夹,之后的快照数据都存在这个里面,然后将这个文件夹的权限设为可读写。
然后去编辑/etc/exports文件,在这个文件中,告诉哪一个目录是共享的,有什么权限,谁可以共享。

这里*就是代表所有的ip都可以共享,当然我们也可以指定ip共享。一切都配置完成后,我们在server开启nfs服务。

那么我们这里共享仓库的肯定就是ES集群里面的机器,那么我们就在ES集群中的每一个机器中都创建一个/data/es-backup目录,这样我们就知道这是一个我们用来挂载的目录。

我们三个ES集群都这样挂载上。此时我们nfs的仓库就算是完成了。
三 . 配置 ES
我们配置了nfs仓库,但是ES这里也需要配置,才知道快照的仓库在哪里。打开elasticsearch的yml配置文件,在里面加上快照仓库的路径,一定要注意格式。同时我们需要在每一个ES机器上都配置上。

ES 出于安全考虑,默认禁止访问任意目录。path.repo 是"白名单",告诉 ES 只有这个目录可以作为快照仓库,避免恶意操作。
然后我们在这里做一个滚动重启,因为我们这里的配置是需要重启的,先在我们是有很多索引的,这些索引的分片都是分配好的,如果贸然重启可能会导致节点变成yellow,所以我们做一个滚动重启,让我们的数据分片不要迁移,这个操作我们在kibana中的开发者模式中可以操作,这里可以直接操作ES集群。

点击右上角的开始按钮,这个配置就运行上了,此时重启就没有问题了。不过我们这里只是一个临时修改。
四 . 通过 API 创建仓库
我们可以直接在kibana中的开发者模式中使用API来创建仓库,我们也可以在zerebro中通过图形化的方式来创建。

这就是创建了一个my_backup的仓库,使用的是本地文件系统fs,然后仓库的位置是/data/es-backup,最后一个意思是启动压缩功能。
同时在cerebro中就可以看见对应的仓库,这里也可以直接操作仓库。

五 . 通过 API 创建快照以及恢复操作
创建快照的时候,不带参数就是给所有的索引创建了一个整体的快照,创建快照的时候,ES 会把当前集群的所有索引状态"冻结"并复制到共享目录中。快照是增量的,第一次是全量,后续只备份变化的部分,速度快且节省空间。

这样的操作就是备份了所有的索引,然后后面就是我们命名的一个名字。如果想要指定某一个索引备份的话,那么就要带上参数。

第一个参数就是指定syslog开头的索引,第二个参数就是忽略不存在的索引,第三个是是否备份集群全局状态(如模板、别名等)。
我们也可以在cerebro上的已存在的快照中看到我们创建的快照。当然我们也可以在cerebro上创建,在cerebro上创建就是点击操作。

现在我们来模拟一下恢复的操作,我们先把syslog相关的日志全部删除掉,然后再通过快照来恢复。

post就是拉取的意思,现在我们再看看是否有对应日志。

可以看到又恢复了过来。当然,如果我们一下子备份了多个索引,此时只想恢复一个索引也是可以的,就和之前备份指定索引一样,需要参数。
最后如果我们需要删除快照,我们直接delete+对应快照的名字就可以了。