Elasticsearch:Snapshot 生命周期管理

在今天的文章中,我们来讲述一下 Data safety 及 security。safety 及 security 是两个不同的概念,尽管在中文很多时翻译都为安全的意思。前者的意思是指我的数据在硬件或者人为操作发生错误时,我可以通过数据的备份(比如 snapshot)以及冗余数据存储(比如多个 replica)来找回丢失的数据。Security 更注重数据的能否被非法访问。在今天的讲述中,我们将重点介绍 Elastic 所提供的 Snapshot 功能以及如何使用 Elastic 提供的 snapshot 生命周期管理来自动管理 snapshot。该功能于 7.6 版本开始提供。

它的基本步骤如下:

  • 注册一个 repo (对于云端存储,需要有相应的 plugin)
  • 创建 snapshot
  • 恢复一个 snapshot (同一个集群或者不同的集群)
  • 使用周期管理自动化

Snapshot 是从正在运行的 Elasticsearch 集群中获取的备份。你可以对整个集群进行快照,包括其所有数据流和索引。你还可以仅对群集中的特定数据流或索引进行快照。

必须先注册 snapshot repository,然后才能创建 snapshot。

快照可以存储在本地或远程存储库中。远程存储库可以驻留在 Amazon S3,HDFS,Microsoft Azure,Google Cloud Storage 以及存储库插件支持的其他平台上。

Snapshot 是增量快照:每个快照仅存储不属于较早快照的数据。这使你能够以最小的开销进行频繁的快照。

你可以将快照还原到正在运行的群集,该群集默认情况下包括快照中的所有数据流和索引。但是,你可以选择仅从快照还原群集状态或特定的数据流或索引。

你可以使用 snapshot 生命周期管理 来自动创建和管理 snapshot。

关于如何创建 Snapshot 以及如何使用 restore API 来恢复 snapshot,请参阅我之前的文章 “Elasticsearch:Cluster备份 Snapshot及Restore API”。在那个教程中,我们需要每次手动来进行创建 snapshot 以及 restore。

 

准备数据

在今天的教程中,我们将使用 Kibana 自带的索引来进行展示。打开 Kibana 界面:

点击 Add data:

这样我们的样本数据就导入进 Elasticsearch 了。通过上面的操作,我们在 Elasticsearch 中将生成一个叫做 kibana_sample_data_logs 的索引。在接下来的章节中,我们将备份这个索引的数据。

 

创建一个本地文件夹存储 snapshot 文件

我们在自己的电脑上创建如下的一个文件夹:

mkdir my_repo
$ cd my_repo/
liuxg:my_repo liuxg$ pwd
/Users/liuxg/my_repo

在上面显示了我的 snapshot 将保存于 /Users/liuxg/my_repo 路径中。针对你的情况这个目录应该和这个不同。我们想将这个路径记录下来。这个路径将在以下的章节中要用到。

 

运用 Snapshot 周期管理来创建 snapshot 及恢复

首先,我们来打开 Kibana 界面:

为了创建 snapshot,我们必须首先注册一个 repository。点击上面的 Register a repository 按钮:

在上面,我们提供一个唯一的 repsitory 名字。我们选择 Shared file system。在上面我们也可以打开开关 Source-only snapshots,这样可以节省 50% 以上的空间。但是这里有一个问题,在恢复的时候,你需要重新来创建反向索引。点击上面的 Next 按钮:

在上面,我们把之前创建的一个路径地址 /Users/liuxg/my_repo 填入到 location 里。

就像上面所说的那样,我们需要在 Elasticsearch 的配置文件 config/elasticsearch.yml 中对 path.repo 进行设置:

经过上面的改动后,我们需要重新启动 Elasticsearch。点击上面的 Register 按钮:

点击上面的 Verify respository:

上面显示已经成功连接上了。点击 Close 链接。

我们接下来点击 Policies。我们来创建一个 Policy:

在上面,我们填入我们想要备份的索引 kibana_sample_data_logs。当然我们也可以备份所有的数据流及索引。

在上面我们想在2个小时以后删除那些过时的 snapshot,同时,最低保留10个snapshot 已经最多保留20个 snapshot。

点击上面的 Create policy,这样我们就生产了一个周期管理的一个策略:

在上面的右边显示当前策略的一个总览。我们点击 Close 链接。

在上面的右边,我们可以看见一个 Play 的按钮。当我们点击它的时候,它会马上生成一个 snapshot。一般的情况下,我们并不需要这么做,这是因为我们有一个周期管理的机制在 Policy 里。由于我们是每隔一分钟的时间会自动生成一个 snapshot,那么等一分钟过后,点击  Snapshots:

在上面,我们可以看到每隔一分钟,它会自动生成一个 snapshot。

接下来,我们来把索引 kibana_sample_data_logs 进行删除:

DELETE kibana_sample_data_logs

这样在我们的 Elasticsearch 中就没有这个索引了。接下来,我们来通过 restore 功能对它进行恢复。我们选择其中的一个 snapshot 来进行操作:

点击 Snapshots 后面的恢复按钮:

针对我们的操作,我们可以选择上面的不同的选项。我们不准备 Restore global state,尽管在我们之前创建 snapshot 时,我们已经点击那个选择来保存 global state。点击 Next 按钮:

点击 Next 按钮:

点击 Restore snapshot:

上面显示已经成功地恢复了索引。我们来重新来检查一下索引 kibana_sample_data_logs:

GET _cat/indices
green open .apm-custom-link               jh4aRSmHRqGCMbWPy2oOyw 1 0     0  0   208b   208b
green open .kibana-event-log-7.9.1-000001 iqgkQDbRRmm73sGv1fvBbQ 1 0     1  0  5.5kb  5.5kb
green open .kibana_task_manager_1         LiCob6msRuWfHht5cDYpBw 1 0     6 83 72.6kb 72.6kb
green open .apm-agent-configuration       WS2paOjhQgOVr__USM1ChA 1 0     0  0   208b   208b
green open kibana_sample_data_logs        mAsGd4g3SMyqLZ2sFDyhSQ 1 0 14074  0 11.2mb 11.2mb
green open .kibana_1                      nJ3OTQThTo2Jg7LZbWGYjg 1 0   115  2 11.1mb 11.1mb

上面显示索引 kibana_sample_data_logs 已经存在了。

我们再次进入到 Snapshots 的界面:

我们会发现从 4:06 到 4:12 这个中间有一段时间是没有创建新的 snapshot 的,这是因为我们把索引 kibana_sample_data_logs 给删除了。在接下来 4:12 开始,又开始自动备份了,每分钟一次。

我们可以检查之前注册 repository 时使用的路径里的文件:

$ pwd
/Users/liuxg/my_repo
liuxg:my_repo liuxg$ ls
index-68                        meta-yplAJp48QeyEERYgltmIqA.dat
index.latest                    snap--qXeq_vvQAedC1PHHFgMSw.dat
indices                         snap-13q3h1cxQVCOWJXGIjdavg.dat
meta--qXeq_vvQAedC1PHHFgMSw.dat snap-1So-vOVNQVavUAGddTUxfA.dat
meta-13q3h1cxQVCOWJXGIjdavg.dat snap-3NTTWbxCQYa13XsEQTUkaw.dat
meta-1So-vOVNQVavUAGddTUxfA.dat snap-5Bt4J72mRzC4_eeK0MXM_A.dat
meta-3NTTWbxCQYa13XsEQTUkaw.dat snap-6Q2Su9GXQrSjL-31fZfwKw.dat
meta-5Bt4J72mRzC4_eeK0MXM_A.dat snap-7DE5EMHOSQ-kU1ejXaUu8Q.dat
meta-6Q2Su9GXQrSjL-31fZfwKw.dat snap-8PqwnWtWQumqBNWl8BmefQ.dat
meta-7DE5EMHOSQ-kU1ejXaUu8Q.dat snap-9PNAe_zwSWOd8VtqO_1UHQ.dat
meta-8PqwnWtWQumqBNWl8BmefQ.dat snap-9x6iCjTjSgKQzCu7eVQdzQ.dat
meta-9PNAe_zwSWOd8VtqO_1UHQ.dat snap-AlyhL4pbT_ytL5RkqERvNA.dat
meta-9x6iCjTjSgKQzCu7eVQdzQ.dat snap-D1mlS3cXTEGP4uvCdj40Fg.dat
meta-AlyhL4pbT_ytL5RkqERvNA.dat snap-FknMPZnRQzW7uHqiYkCdpg.dat
meta-D1mlS3cXTEGP4uvCdj40Fg.dat snap-FsVxPFsaRJSIaT-d1_rDNQ.dat
meta-FknMPZnRQzW7uHqiYkCdpg.dat snap-GGCMBl2XQRmyUmY_kWrfDQ.dat
meta-FsVxPFsaRJSIaT-d1_rDNQ.dat snap-GMMiP7WuSYSrB1IqoCNAfA.dat
meta-GGCMBl2XQRmyUmY_kWrfDQ.dat snap-JGdGHsVETtyA5effratsCg.dat
meta-GMMiP7WuSYSrB1IqoCNAfA.dat snap-L3wBfEZGR86qlJ6ACf2SLw.dat
meta-JGdGHsVETtyA5effratsCg.dat snap-McgDErqfR3OQ-ELyX1S-xw.dat
meta-L3wBfEZGR86qlJ6ACf2SLw.dat snap-OE1WcJ-JTW2pQDvFKLCyLg.dat
meta-McgDErqfR3OQ-ELyX1S-xw.dat snap-P2pk-rwERtqg4mItguACDQ.dat
meta-OE1WcJ-JTW2pQDvFKLCyLg.dat snap-P3wMjD3GSeGNnyrL9Ju9GA.dat
meta-P2pk-rwERtqg4mItguACDQ.dat snap-PAaMRknpR9SAEktnOLx4Vg.dat

我们可以看到有很多的 snap文件。