elasticsearch数据备份

简介

最近有点担心存储日志的elasticsearch会崩掉,所以准备备份下数据

准备

首先你要准备一个共享文件系统,让你所有es节点都可以访问到这个文件系统,这里我选择的是nfs,是从nas挂载过来的

mount 192.168.1.25:/volume1/es-backup backup/

之后再/etc/fstab上写入

192.168.1.25:/volume1/es-backup /data/elk/elasticsearch/backup nfs defaults 0 0

之后我们的备份文件就是往这个地方写的

配置elasticsearch

给elasticsearch添加path.repo的配置,因为我是使用docker搭建的所以直接在compose文件environment中加入

- "path.repo=/backup"

如果不加会报错,类似下面

1
{"error":"RepositoryException[[backup] failed to create repository]; nested: CreationException[Guice creation errors:\n\n1) Error injecting constructor, org.elasticsearch.repositories.RepositoryException: [backup] location [/mount/bak] doesn't match any of the locations specified by path.repo because this setting is empty\n  at org.elasticsearch.repositories.fs.FsRepository.<init>(Unknown Source)\n  while locating org.elasticsearch.repositories.fs.FsRepository\n  while locating org.elasticsearch.repositories.Repository\n\n1 error]; nested: RepositoryException[[backup] location [/mount/bak] doesn't match any of the locations specified by path.repo because this setting is empty]; ","status":500}

然后把backup文件夹挂载到容器

在volumes中加入

- "./backup:/backup"

这样之后es在生成快照的时候就会直接放到这个目录中,因为我是三个节点的小集群,所以三个节点都要添加上面的配置

之后重启容器

创建快照

在创建快照之前我们要创建一个仓库,如果你不创建仓库也没有事,默认有一个叫all的仓库

你可以使用curl来创建,但是我更喜欢使用postman

  • url: 192.168.1.43:9200/_snapshot/es-backup
  • 请求方法: PUT
  • Content-Type: application/json
  • body:
1
2
3
4
5
6
{
    "type": "fs", 
    "settings": {
        "location": "/backup" 
    }
}
  • 返回
1
2
3
{
    "acknowledged": true
}

注意请求url中snapshot是es的api,后面的es-backup相当于仓库名字

请求body中location是备份的目录,type表示是一个共享文件系统,除了fs,es还支持

  • repository-s3 for S3 repository support
  • repository-hdfs for HDFS repository support in Hadoop environments
  • repository-azure for Azure storage repositories
  • repository-gcs for Google Cloud Storage repositories

接着使用GET方法去查看创建的仓库

  • url: 192.168.1.43:9200/_snapshot/es-backup
  • 请求方法: GET
  • Content-Type: application/json
  • 返回
1
2
3
4
5
6
7
8
{
    "es-backup": {
        "type": "fs",
        "settings": {
            "location": "/backup"
        }
    }
}

接着验证下是不是可以正常工作

  • url: 192.168.1.43:9200/_snapshot/es-backup/_verify
  • 请求方法: POST
  • Content-Type: application/json
  • 返回
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{
    "nodes": {
        "jnz9pQudTRi21iaqnXnZQQ": {
            "name": "elasticsearch2"
        },
        "UdEozw9CQkGYAnmf-ReZ-w": {
            "name": "elasticsearch1"
        },
        "vm3lQRdFSOC4n-ly_lZ8oA": {
            "name": "elasticsearch3"
        }
    }
}

如果你要更新仓库的配置,比如启用压缩,你重新执行下下面这个接口就好了

  • url: 192.168.1.43:9200/_snapshot/es-backup
  • 请求方法: PUT
  • Content-Type: application/json
  • body:
1
2
3
4
5
6
7
{
    "type": "fs", 
    "settings": {
        "location": "/backup",
        "compress": true
    }
}
  • 返回
1
2
3
{
    "acknowledged": true
}

接着我们创建一个快照

  • url: 192.168.1.43:9200/_snapshot/es-backup/snapshot_1
  • 请求方法: PUT
  • Content-Type: application/json
  • 返回
1
2
3
{
    "accepted": true
}

查看快照信息

  • url: 192.168.1.43:9200/_snapshot/es-backup/snapshot_1
  • 请求方法: GET
  • Content-Type: application/json
  • 返回
 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
{
    "snapshots": [
        {
            "snapshot": "snapshot_1",
            "uuid": "m5nnFfLRQACWI-zldoNf6A",
            "version_id": 7060199,
            "version": "7.6.1",
            "indices": [
                "HELLO"
            ],
            "include_global_state": true,
            "state": "IN_PROGRESS",
            "start_time": "2020-05-19T09:12:18.527Z",
            "start_time_in_millis": 1589879538527,
            "end_time": "1970-01-01T00:00:00.000Z",
            "end_time_in_millis": 0,
            "duration_in_millis": -1589879538527,
            "failures": [],
            "shards": {
                "total": 0,
                "failed": 0,
                "successful": 0
            }
        }
    ]
}

我们看到他的"state": "IN_PROGRESS",也就是说这个快照正在创建中,如果state变为SUCCESS表示创建成功

如果你对一个快照感觉不爽,你可以删除快照

  • url: 192.168.1.43:9200/_snapshot/es-backup/snapshot_1
  • 请求方法: DELETE
  • Content-Type: application/json
  • 返回
1
2
3
{
    "acknowledged": true
}

创建备份的定时任务

下面是我的脚本

1
2
3
date_time=`date +"%Y%m%d%S"`
snapshot_name=snapshot_$date_time
curl -X PUT http://192.168.1.43:9200/_snapshot/es-backup/$snapshot_name

放入crontab就好了

查看当前仓库的所有snapshot

  • url: 192.168.1.43:9200/_snapshot/es-backup/_all
  • 请求方法: GET
  • Content-Type: application/json
  • 返回
1
太长了,就不输出了

最后说几句

如果你不想这样子去创建快照,你可以尝试使用Cerebro这个工具,点击more->snapshot即可图形化创建快照

欢迎关注我的博客 www.bboy.app

Have Fun