日志

Elasticsearch数据备份和恢复

无论从容灾还是容错角度来看,数据的安全性都十分重要,Elasticsearch(以下简称ES)提供了Snapshot和Restore模块,用于对单个索引甚至整个集群进行备份和恢复。

环境

Elasticsearch 2.1.1

基本流程

ES的Snapshot/Restore流程可以概括为以下几个步骤

1)创建用于备份的远程仓库

2)往仓库创建快照

3)检查快照状态

4)恢复已备份快照

具体操作

a. 建立共享仓库

1)选取一个节点作为快照文件的共享目录

2)在ES集群的各个节点创建一个同名目录并挂载到1)中所创建的共享目录(假定:/mnt/backup/es_backup)

3)注册仓库(Repository)

PUT _snapshot/es_backup
{
    "type": "fs",
    "settings": {
        "location": "/mnt/backup/es_backup",
        "compress": true 
    }
}

以上注册了一个命为es_backup的仓库,仓库数据挂载到/mnt/backup/es_backup。

type:fs 指定使用共享文件系统,当然你还可以选择AWS、HDFS、Azure等repository backends
location:指定仓库目录,请确保所有Master节点和数据节点都挂载到相同的目录,注意:必须要把此路径注册到所有节点的 elasticsearch.yml 的 path.repo 配置项中。 例如

path.repo: ["/mnt/backup/es_backup"]

compress:是否压缩快照文件,这个压缩只对快照的metadata文件(索引的mapping和settings)生效,对数据文件不生效,默认true
chunk_size:大容量索引可以被分成若干块,此参数指定每块的大小,默认单位是字节,当然你也可以设置为1g、100m、512k等(默认null,不限块数据大小)
max_restore_bytes_per_sec:指定恢复数据时各个节点的最大速度阈(yù)值,默认是40mb/s
max_snapshot_bytes_per_sec:指定快照数据时各个节点的最大速度阈(yù)值,默认是40mb/s

b. 生成快照数据

PUT _snapshot/快照仓库名/快照名?wait_for_completion=true

wait_for_completion 指定该 snapshot 请求的结果是否等整个快照创建完毕再返回

PUT _snapshot/es_backup/snapshot_v1?wait_for_completion=true
{
    "indices": "index1,index2",
    "ignore_unavailable": "true",
    "include_global_state": false,
    "partial": "false"
}

indices:指定快照哪些索引
ignore_unavailable:默认false,当索引不存在时snapshot请求失败,当设置为true时忽略不存在的索引
include_global_state:设置为false时,可以防止把集群的全局状态作为快照的一部分被存储下来
partial:默认情况下,如果有一个或多个索引不是全部主分片(shard)都可用,那么snapshot请求失败,可以设为true避免这种情况发生

c. 监控快照状态

GET _snapshot/es_backup/snapshot_v1/_status

d. 恢复

POST _snapshot/仓库名/快照名/_restore?wait_for_completion=true

注意:已存在的索引必须要先关闭才能进行restore操作

POST your_index/_close

下面请求将恢复es_backup仓库的snapshot_v1快照

POST _snapshot/es_backup/snapshot_v1/_restore
{
    "indices": "index1,index2",
    "ignore_unavailable": "true",
    "include_global_state": false,
    "rename_pattern": "index(.+)",
    "rename_replacement": "restored_index_n$1"
    
}

indices:指定快照文件中要恢复的索引
ignore_unavailable:同上
include_global_state:同上
rename_pattern:结合 rename_replacement 重命名索引名称
rename_replacement:结合 rename_pattern 正则表达式重命名索引名,上面的例子最终的索引名为restored_index_n1,restored_index_n2

其他说明

1)快照的创建是增量进行的,ES会检查仓库下的所有索引文件,最终生成上一次快照之后所新增数据或变更数据的快照文件
2)快照生成的过程是非阻塞的,这意味着这个过程中依然可以对索引进行查询等操作,需要注意的是,即使这个过程是非阻塞的,但最终快照生成的视图会定格在snapshot请求发起的那一瞬间
3)通过以下api可以删除快照文件,ES会把snapshot_v1这个快照所属的文件删除(与其他快照相关的文件会被保留)

DELETE _snapshot/es_backup/snapshot_v1

4)删除一个正在创建的快照会把创建快照的请求直接终止

转载请注明出处:

© http://hejunhao.me