
简介
最近有点担心存储日志的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"
如果不加会报错,类似下面
{"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:
 
{
    "type": "fs", 
    "settings": {
        "location": "/backup" 
    }
}
- 返回
 
{
    "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 - 返回
 
{
    "es-backup": {
        "type": "fs",
        "settings": {
            "location": "/backup"
        }
    }
}
接着验证下是不是可以正常工作
- url: 
192.168.1.43:9200/_snapshot/es-backup/_verify - 请求方法: 
POST - Content-Type: 
application/json - 返回
 
{
    "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:
 
{
    "type": "fs", 
    "settings": {
        "location": "/backup",
        "compress": true
    }
}
- 返回
 
{
    "acknowledged": true
}
接着我们创建一个快照
- url: 
192.168.1.43:9200/_snapshot/es-backup/snapshot_1 - 请求方法: 
PUT - Content-Type: 
application/json - 返回
 
{
    "accepted": true
}
查看快照信息
- url: 
192.168.1.43:9200/_snapshot/es-backup/snapshot_1 - 请求方法: 
GET - Content-Type: 
application/json - 返回
 
{
    "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 - 返回
 
{
    "acknowledged": true
}
创建备份的定时任务
下面是我的脚本
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 - 返回
 
太长了,就不输出了
最后说几句
如果你不想这样子去创建快照,你可以尝试使用Cerebro这个工具,点击more->snapshot即可图形化创建快照
欢迎关注我的博客www.bboy.app
Have Fun
