Elasticsearch备份和还原

Elasticsearch经常用来存储数据,如果你在里面存储了重要的数据,那么就需要进行备份,然后在出现问题的时候需要进行还原。

管理repositories

Elasticsearch提供了一个内置的系统来快速备份和恢复您的数据。 在使用实时数据时,保持备份是复杂的,因为会有大量的并发问题。
Elasticsearch快照允许将单个索引(或别名)或整个集群的快照创建到远程存储库中。在开始执行快照之前,必须创建存储库 – 这是您的备份/快照将被存储的位置。

我们需要编辑config/elasticsearch.yml文件增加备份存储库的位置,比如:path.repo: /tmp/,在这个例子中我们使用/tmp目录来作为存储库的位置,然后我们
创建一个名为my_repository的存储库:

curl -XPUT 'http://localhost:9200/_snapshot/my_repository' -d '
{
    "type": "fs",
    "settings": {
        "location": "/tmp/my_repository",
        "compress": true
    }
}'

创建成功返回结果:

{"acknowledged":true}

如果你检查你的文件系统的话,会发现/tmp/my_repository目录已经被创建

我们可以通过下面的方式来回去仓库的一些信息:

curl -XGET 'http://localhost:9200/_snapshot/my_repository'

返回结果为:


{
    "my_repository": {
        "type": "fs",
        "settings": {
            "compress": "true",
            "location": "/tmp/my_repository"
        }
    }
}

也可以使用下面的方式获取所有仓库的信息

curl -XGET 'http://localhost:9200/_snapshot'

如果想删除这个仓库,那么可以使用:

curl -XDELETE 'http://localhost:9200/_snapshot/my_repository'

返回结果为:

{"acknowledged":true}

管理snapshot

假设我们想为test-index和test-2这两个索引创建一个快照snap_1,那我们可以使用下面的方式:

curl -XPUT "http://localhost:9200/_snapshot/my_repository/snap_1? wait_for_completion=true" -d '
{
    "indices": "test-index,test-2",
    "ignore_unavailable": "true",
    "include_global_state": false
}'

执行以后,如果你去检查/tmp/my_repository目录的话,下面会新增一些数据文件。

为了获取快照的相关信息,可以使用:

curl -XGET 'http://localhost:9200/_snapshot/my_repository/snap_1?pretty'

如果想删除快照的话,可以使用

curl -XDELETE 'http://localhost:9200/_snapshot/my_repository/snap_1'

如果想查看所有的索引快照的话,可以使用:

curl -XGET 'http://localhost:9200/_snapshot/my_repository/_all'

另外快照的处理过程可以被监控:

curl -XGET "http://localhost:9200/_snapshot/my_repository/snap_1/_status?pretty"

从快照进行数据还原

curl -XPOST "http://localhost:9200/_snapshot/my_repository/snap_1/_restore? pretty" -d '
{
    "indices": "test-index,test-2",
    "ignore_unavailable": "true",
    "include_global_state": false,
    "rename_pattern": "test-(.+)",
    "rename_replacement": "copy_$1"
}'

Reindexing from a remote cluster

快照和恢复API执行的非常快,并且是备份数据的首选方式,但它们有一些限制,例如:

  • 备份是一个安全的Lucene索引副本,所以这取决于使用的Elasticsearch版本。 如果您从版本5.x之前的Elastisearch版本切换,则无法恢复旧索引。
  • 不可能在旧版本中恢复更新的Elasticsearch版本的备份。 恢复只能向前兼容。
  • 不可能从备份恢复部分数据。

为了能够在这种情况下复制数据,解决方案是使用远程服务器使用reindex API。

为了能够从远程服务器上复制数据,我们需要在config/elasticsearch.yml文件中增加远程服务器的地址:

reindex.remote.whitelist: ["192.168.1.227:9200"]

然后重启Elasticsearch,然后我们就可以执行api调用了:

curl -XPOST "http://localhost:9200/_reindex" -d '{
    "source": {
        "remote": {
            "host": "http://192.168.1.227:9200"
        },
        "index": "test-source"
    },
    "dest": {
        "index": "test-dest"
    }
}'

参考文档

https://www.elastic.co/guide/en/elasticsearch/reference/5.0/modules-snapshots.html