简介
最近有点担心存储日志的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