Elasticsearch提供了replica解决方案,它可以帮我们解决了如果有一个或多个node失败了,那么我们的数据还是可以保证完整的情况,并且搜索还可以继续进行。但是,有一种情况是我们的所有的node,或者有一部分node失败,可能会造成我们的数据的丢失。也就是说replca不能提供一种灾难性的保护机制。我们需要一种完整的备份机制。

Snapshot及Restore

在Elastic里,我们提供了一个叫做snapshot及restore API的接口。使您可以使用数据和状态快照备份您的Elasticsearch索引和集群。 快照很重要,因为快照会在出现问题时提供您数据的副本。 如果需要回滚到旧版本的数据,则可以从存储库中还原快照。

如上图所示,我们可以把当前index的状态及数据存入到一个repository里去。

Repository

为了能够做备份,我们首先必须创建一个repository,也就是一个仓库。你可以为一个cluster创建多个仓库。目前支持的仓库类型有:

# Elasticsearch支持仓库类型
Respository 配置类型
Shared file system "type": "fs"
Read-only URL "type": "url"
S3 "type": "s3"
HDFS "type": "hdfs"
Azure "type": "azure"
Google Cloud Storage "type": "gcs"

这里需要注意的是: S3, HDFS, Azure and GCS 需要相应的插件进行安装才可以。

注册仓库

在一个snapshot可以被使用之前,我们必须注册一个仓库(repository)。

  • 使用_snapshot 终点
  • 文件夹必须对所有的node可以访问
  • path.repo必须在所有的node上进行配置,针对一个fs的repository来说
    PUT _snapshot/my_repo
{
"type": "fs",
"settings": {
"location": "/mnt/my_repo_folder"
}
}

这里/mnt/my_repo_folder必须加进所有node的elasticsearch.yml文件中。

fs resposity设置:

    PUT _snapshot/my_repo
{
"type": "fs",
"settings": {
"location": "/mnt/my_repo_folder",
"compress": true,
"max_restore_bytes_per_sec": "40mb",
"max_snapshot_bytes_per_sec": "40mb"
}
}

这里,我们定义compress为true,表明我们希望压缩。通过max_restore_bytes_per_sec及max_snapshot_bytes_per_sec的定义,我们可以来限制数据的snapshot及恢复的数据速度。

S3 repository设置

为了能能使用S3仓库,我们必须使用如下的命令来进行安装插件:

    ./bin/elasticsearch-plugin install repository-s3

注意,上面的命令必须是在Elasticsearch的安装目录下进行执行。我们可以通过如下的命令来进行配置:

    PUT _snapshot/my_s3_repo
{
"type": "s3",
"settings": {
"bucket": "my_s3_bucket_name"
}
}

这里的my_s3_bucket_name是我们在AWS上定义的S3 bucket。更多关于S3的配置可以参阅链接 Repository Settings(https://www.elastic.co/guide/en/elasticsearch/plugins/current/repository-s3-repository.html)。

Snapshot所有的索引

一旦我们的repository已经被配置好了,那么我们就可以利用_snapshot终点来进行snapshot。必须注意的是snapshot只拷贝在执行该命令时的所有的数据,而在之后的所有的数据将不被备份。snapshot是按照增量来进行备份的,也就是说它只拷贝从上次执行snapshot之后变化的部分。通常来说,每隔30分钟进行一次备份是足够的。

snapshot命令:

PUT _snapshot/my_repo/my_snapshot_1

这里必须注意的几点:

  • my_repo是指的我们在上面定义的repository的名字
  • my_snapshot_1指的是一个唯一的snapshot名字
  • 没有特定的索引名字被指出,那么它指的是所有的open索引

如果我们想指定某个或某些特定的索引,那么我们可以使用如下的命令来执行备份(snapshot)

    PUT _snapshot/my_repo/my_logs_snapshot_1
{
"indices": "logs-*",
"ignore_unavailable": true,
"include_global_state": true
}

这里它表述我们相对所有以logs-为开头的索引进行备份。

我们可以通过如下的命令来进行监测正在进行的snapshot的进度:

GET _snapshot/my_repo/my_snapshot_2/_status

管理snapshots

获取所有在repo中的snapshots:

GET _snapshot/my_repo/_all

获取某个特定snapshot的信息

GET _snapshot/my_repo/my_snapshot_1

删除一个snapshot

DELETE _snapshot/my_repo/my_snapshot_1

恢复一个snapshot

我们可以使用_restore终点来从一个snapshot恢复所有的索引:

POST _snapshot/my_repo/my_snapshot_2/_restore

我们也可以通过如下的方法来恢复某个或某些特定的索引:

    POST _snapshot/my_repo/my_snapshot_2/_restore
{
"indices": "logs-*",
"ignore_unavailable": true,
"include_global_state": false
}

在很多的时候,我们想把snapshot中的索引恢复到一个不同名字的索引之中,从而不用覆盖现有的。我们可以通过rename_pattern及rename_replacement来进行配置:

    POST _snapshot/my_repo/my_snapshot_2/_restore
{
"indices": "logs-*",
"ignore_unavailable": true,
"include_global_state": false,
"rename_pattern": "logs-(.+)",
"rename_replacement": "restored-logs-$1"
}

在上面,我们把所有的以logs-为开头的索引恢复到以restored-logs-的开头的索引之中来。

Restore到一个新的cluster

针对这个情况,我们可以恢复从另外一个cluster中备份的snapshot到当前的cluster中来。我们必须在新的cluster中注册这个repository才可以进行下面的操作。

从上面我们可以看出来,my_repo必须对两个cluster都是可见的才可以。

动手实践

准备数据:

运行起来我们的Kibana:

我们分别点击上面的1和2处:

点击上面的“Add data”。这样我们就可以把我们的kibana_sample_data_logs索引加载到Elasticsearch中。

GET _cat/indices/kibana_sample_data_logs

注册repository

首先我们在我们的电脑上创建一个如下的目录:

/shared_folder/my_repo

我们在termimal中打入如下的命令:

mkdir -p shared_folder/my_repo/
    $ pwd
/Users/liuxg/shared_folder
bogon:shared_folder liuxg$ ls -al
drwxr-xr-x 2 liuxg staff 64 Nov 13 13:23 my_repo

将以下path.repo属性添加到我们运行的所有node的elasticsearch.yml文件中:

path.repo: /Users/liuxg/shared_folder/my_repo

注意,针对你的情况,你需要改动这里的path路径。

然后启动我们的Elasticsearch及Kibana。紧接着,我们在Kibana console中打入如下的命令:

    PUT _snapshot/my_local_repo
{
"type": "fs",
"settings": {
"location": "/Users/liuxg/shared_folder/my_repo"
}
}

注意这里的location是根据我自己的电脑的路径来设置的。你需要根据自己实际的路径进行修改。在这里my_local_repo是我们的repository名称。

接下来,我们打入如下的命令来对我们的kibana_sample_data_logs索引进行snapshot:

    PUT _snapshot/my_local_repo/snapshot_1
{
"indices": "kibana_sample_data_logs",
"ignore_unavailable": true,
"include_global_state": true
}

我们可以通过如下的命令来查看snapshot:

GET _snapshot/my_local_repo/_all

我们可以在右边看到snapshot_1出现在列表之中,说明我们已经成功地创建了这个snapshot。

我们接下来可以通过如下的命令来删除kibana_sample_data_logs索引:

DELETE kibana_sample_data_logs

这样我们彻底地删除了这个索引。那么我们该如何把之前备份的数据恢复回来呢?

在Kibana中打入如下的命令:

    POST _snapshot/my_local_repo/snapshot_1/_restore
{
"indices": "kibana_sample_data_logs",
"ignore_unavailable": true,
"include_global_state": false
}

在执行完上面的命令后,我们可以通过如下的命令来查看恢复后的kibana_sample_data_logs索引:

GET kibana_sample_data_logs/_count

显然我们已经成功地恢复了我们之前备份的数据。

这个时候,如果我们去到我们的snapshot文件目录,我们可以看到:

    $ pwd
/Users/liuxg/shared_folder/my_repo
bogon:my_repo liuxg$ ls
index-0 meta-TzygGpJ1SOK5yJdsmc1lng.dat
index.latest snap-TzygGpJ1SOK5yJdsmc1lng.dat
indices

显然在文件目录中,已经有新生产的文件了。

Elasticsearch:Cluster备份 Snapshot及Restore API的更多相关文章

  1. 【ELK】Elasticsearch的备份和恢复

    非原创,只是留作自己查询使用,转自http://keenwon.com/1393.html Elasticsearch的备份和恢复 备份 Elasticsearch的一大特点就是使用简单,api也比较 ...

  2. Elasticsearch 5.4.3实战--Java API调用:索引mapping创建

    因为项目开发使用的是Java语言, 项目的开发架构是Spring MVC+ maven的jar包管理,  所以今天重点说说ES 5.4.3 的Java API的源码实战 1. pom.xml文件增加依 ...

  3. elasticsearch数据备份还原

    elasticsearch数据备份还原 1.在浏览器中运行http://XXX.XXX.XXX.XXX:9200/_flush,确保索引数据能保存到硬盘中. 2.原数据的备份.主要是elasticse ...

  4. ElasticSearch查询 第一篇:搜索API

    <ElasticSearch查询>目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇: ...

  5. Elasticsearch入坑指南之RESTful API

    Elasticsearch入坑指南之RESTful API Tags:Elasticsearch ES为开发者提供了非常丰富的基于Http协议的Rest API,通过简单的Rest请求,就可以实现非常 ...

  6. elasticsearch数据基于snapshot的还原备份+版本升级

    前言 之前安装的是elasticsearch-6.5.0,漏洞扫描报The remote web server hosts a Java application that is vulnerable. ...

  7. ElasticSearch快照备份及恢复

    工作步骤: 1:建立备份快照数据挂载点,即共享文件目录(Shared Filesystem): 2:建立快照仓储repository: 3:建立snapshot快照备份: 4:恢复snapshot快照 ...

  8. Elasticsearch集群配置以及REST API使用

    ES安装与启动 在官网下载压缩包,解压后直接运行bin目录下的.bat文件即可.下载地址戳这里. ES配置集群 Elasticsearch配置集群很简单,只要配置一个集群的 名称 ,ES就会自动寻找并 ...

  9. 分布式搜索引擎Elasticsearch PHP类封装 使用原生api

    //官方的 php  api写的鸡肋了,下面这个类可以使用 es api 操作. <?php class ElasticSearch { public $index; function __co ...

随机推荐

  1. 异常注意事项_多异常的捕获处理和异常注意事项_finally有return语句

    异常注意事项_多异常的捕获处理 多个异常使用捕获又该如何处理呢? 1. 多个异常分别处理 2. 多个异常一次捕获,多次处理 3. 多个异常一次捕获一次处理 public class Demo01Exc ...

  2. Wpf 多指应用开发解析

    1  首先分析多指事件与单指事件,以及执行顺序 2  事件阻断 订阅多指事件后,在TouchDown时 采用e.handle = true,阻断多指事件,或在ManipulationStarting. ...

  3. python打开文件、文件夹窗口、终端窗口

    简介 在一些项目中,我们会需要在生成完文件后打开某些文件或者文件夹窗口,这就需要使用到内置的文件打开方式了. 打开文件或文件夹 Windows import os import subprocess ...

  4. @DS("slave") 多数据源兼容事务问题解决方案

    SpringBoot项目中用到多数据源,在方法上又必须加事务处理,此时可以对使用了@DS的方法或类添加@Transactional并添加事务隔离级别 举例: 1.这是一个方法,方法内需要实现多数据源查 ...

  5. 四位一体水溶交融,Docker一拖三Tornado6.2 + Nginx + Supervisord非阻塞负载均衡容器式部署实践

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_203 容器,又见容器.Docker容器的最主要优点就在于它们是可移植的.一套服务,其所有的依赖关系可以捆绑到一个独立于Linux内 ...

  6. JAVA语言基础组成(2)

    函数  函数的定义 1.什么是函数? 函数就是定义在类中的具有特定功能的一段独立小程序.函数也称为方法. 2.函数的格式: 修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2,.. ...

  7. 用VS Code搞Qt6:编译附加模块

    上一次水文中,老周所介绍的是编译 Qt 的基础模块-- qtbase.一次性编译所有代码可以一劳永逸,但体积相当大,编译时间较长,CPU负载大发热大,风扇转得猛,电费交得多.因此老周更喜欢分开来编译. ...

  8. NC20242 [SCOI2005]最大子矩阵

    题目链接 题目 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大. 注意:选出的k个子矩阵 不能相互重叠. 输入描述 第一行为n,m,k(1 ≤ n ≤ 100 ...

  9. BZOJ1787/Luogu4281: [Ahoi2008]Meet 紧急集合

    画画图可知,三点\(lca\)必有两相同,\(a,b,c\)距离为\(dis_a + dis_b + dis_c - dis_{lca(a,b)} - dis_{lca(b,c)} - dis_{lc ...

  10. pnpm凭什么这么快

    前端包管理器层出不穷,pnpm算是一个后起之秀.它和npm有什么不同,为什么有了npm还要造一个pnpm? npm的问题 npm是最早的包管理器,安装nodejs自带npm,v3版本之前,npm安全依 ...