ElasticSearch 备份

ElasticSearch 有 两种备份方法

  • ES 快照备份
  • ElasticDump 备份

ES 快照备份

ElasticSearch 自带备份的方法,数据量大的时候,通常推荐这种方法。
集群的环境下,需要依赖 共享文件系统 NFS,AWS S3, HDFS 文件系统等,以下用HDFS 为例。

备份到 HDFS 需要 repository-hdfs 插件的支持。下载下来放在了 /tmp 并安装,重启 ES,变可享用了。

1
./elasticsearch-plugin install file:///tmp/repository-hdfs-6.2.1.zip
  1. 构建仓库,以下创建一个名为 hdfs_backup 的仓库, 我们计划将数据备份到 hdfs://<hadoop-domain.com>:9000/data/es_backup 下面,如无意外会返回 {"acknowlege":"true"}

    1
    2
    3
    4
    5
    6
    7
    8
    curl -XPUT http://<Port:IP>/_snapshot/hdfs_backup -H 'Content-Type:application/json' -d'
    {
    "type": "hdfs",
    "settings": {
    "uri": "hdfs://<hadoop-domain.com>:9000",
    "path": "/data/es_backup"
    }
    }'
  2. 选定索引备份,例如选择了 student索引,如无意外会返回 {"acknowlege":"true"},如果你希望命令阻塞直到备份完成。可以在 URL 尾部加上 wait_for_completion=true

1
2
3
4
curl -XPUT http://<Port:IP>/_snapshot/hdfs_backup/snapshot_1 -H 'ContentType:application/json' -d'
{
"indices": "student"
}'
  1. 可使用以下命令查看备份的进度:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
curl -XGET "http://<Port:IP>/_snapshot/hdfs_backup/*" '
{
"snapshots" : [
{
"snapshot" : "snapshot_1",
"uuid" : "kTdQRNs6RbO9LZ0LCfXLYg",
"version_id" : 6060199,
"version" : "6.6.1",
"indices" : [
"student"
],
"include_global_state" : true,
"state" : "IN_PROGRESS",
"start_time" : "2019-06-13T07:41:47.556Z",
"start_time_in_millis" : 1560411707556,
"end_time" : "1970-01-01T00:00:00.000Z",
"end_time_in_millis" : 0,
"duration_in_millis" : -1560411707556,
"failures" : [ ],
"shards" : {
"total" : 0,
"failed" : 0,
"successful" : 0
}
}
]
}
  1. 如何使用快照来恢复
1
2
3
4
curl -XPOST "http://<Port:IP>/_snapshot/hdfs_backup/snapshot_1/_restore?wait_for_completion=true" -H 'Content-Type: application/json' -d'
{
"indices": "student","rename_replacement": "student"
}'

使用 ElasticDump 来备份

elasticdump 需要 nodeJs 的环境,适用于小数量的备份。其原理是用了 ES 的 Scroll 接口

  • 将 mapping 和 数据备份,并 gzip 到本地盘
1
2
elasticdump --input=http://<Port:IP>/student  --type=data --limit=10000  --output=$ | gzip > student.json.gz
elasticdump --input=http://<Port:IP>/student --output=stduent_mapping.json --type=mapping
  • 创建好mapping 之后,恢复数据, 如果是 gzip 格式的,需要先解压
1
elasticdump --input=./student.json --output=http://<Port:IP>/student