Elasticsearch:Cluster备份 Snapshot及Restore API

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

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

原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/12090809.html

时间: 2024-10-08 10:17:06

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

Elasticsearch 2.2.0 精简(cat)API

在Elasticsearch提供了一套精简API来查看系统的状态,官方的文档叫cat API.主要的目的是由于Elasticsearch默认提供的接口返回都是JSON格式的,这种格式不利于人类的阅读,所以搞出来一套cat API来简化. 每个命令都是以/_cat开头,可以接收v参数得到详细输出:可以通过help参数得到返回的每列的帮助信息.可以通h=参数名返回部分内容,多个参数可以用逗号分开,甚至可以支持通配符.例如: 请求:GET http://127.0.0.1:9200/_cat/mast

elasticsearch数据备份恢复

本文主要介绍elasticsearch集群数据备份及恢复,利用共享文件系统,通过快照方式备份. 集群的部署参考:http://hnr520.blog.51cto.com/4484939/1876467 一.配置修改 1.配置文件必须添加如下参数 path.repo:  /mnt/backups/es_mybak 二.数据备份 1.创建备份仓库 curl -XPUT 'http://192.168.115.11:9200/_snapshot/EsBackup' -d '{   "type"

Elasticsearch集群配置以及REST API使用

ES安装与启动 在官网下载压缩包,解压后直接运行bin目录下的.bat文件即可.下载地址戳这里. ES配置集群 Elasticsearch配置集群很简单,只要配置一个集群的 名称 ,ES就会自动寻找并加入到其中. 并且会自动的进行分片.备份等等操作. 配置方式: 直接修改conf/elasticsearch.yml ES查询集群状态 使用ES的REST API可以做到下面的事情: 1 管理集群,节点,索引数据和元数据 2 执行创建,读取,更新和删除操作,以及根据索引查询 3 执行更深入的操作,比

Elasticsearch cluster

引用<<Elasticsearchthe definitive guide>>原文中的一段话: Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎库.但是,Lucene只是一个库.想要使用它,你必须使用Java来作为开发语言并将其直接集成到你的应用中,更糟糕的是,Lucene非常复杂,你需要深入了解检索的相关知识来理解它是如何工作的.Elasticsea

Linux完整备份工具 - dump, restore(现在基本不用这两个)

dump 其实 dump 的功能颇强,他除了可以备份整个文件系统之外,还可以制定等级喔!什么意思啊! 假设你的 /home 是独立的一个文件系统,那你第一次进行过 dump 后,再进行第二次 dump 时, 你可以指定不同的备份等级,假如指定等级为 1 时,此时新备份的数据只会记录与第一次备份所有差异的文件而已. 看不懂吗?没关系!我们用一张简图来说明. 如上图所示,上方的『即时文件系统』是一直随著时间而变化的数据,例如在 /home 里面的文件数据会一直变化一样. 而底下的方块则是 dump

ElasticSearch【5】模板搜索API

ElasticSearch Rest高级API 提供了多种搜索方式,除了前面讲到的search查询,ElasticSearch 还提供了通过模板搜索查询.我个人比较喜欢这种方式. 我们可以通过脚本预选注册模板,在注册模板时定义一个模板名称.在查询时通过模板名称调用该模板.首先演示下如何注册模板: public void registTemplate(){ RestClient restClient = elasticClient.getRestClient(); String template

elasticsearch的备份和恢复(转)

vim /etc/elasticsearch/elasticsearch.yml path.repo: ["/data/backups/es_backup"] #备份目录,根据自己情况进行填写 systemctl restart elasticsearch.service mkdir -pv /data/backups/es_backup chmod 755 /data/backups/es_backup chown elasticsearch:elasticsearch /data/

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

<?php class ElasticSearch { public $index; function __construct($server = 'http://localhost:9200'){ $this->server = $server; } function call($path, $http = array()){ if (!$this->index) throw new Exception('$this->index needs a value'); return 

elasticsearch cluster 详解

上一篇通过clusterservice对cluster做了一个简单的概述, 应该能够给大家一个初步认识.本篇将对cluster的代码组成进行详细分析,力求能够对cluster做一个更清晰的描述.cluster作为多个节点的协同工作机制,它需要节点,节点间通信,各个节点的状态及各个节点上的数据(index)状态.因此这一部分代码包括了上述的几个部分. 首先是节点(DiscoveryNode),这里的节点不同于之前所说的node,只是集群上一个逻辑意义上的节点,只是一个实际节点的描述信息.它实现了S