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即可图形化创建快照

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

Have Fun

欢迎关注我的其它发布渠道