1)Elasticsearch的snapshot快照备份
优点:通过snapshot拍摄快照,然后定义快照备份策略,能够实现快照自动化存储,可以定义各种策略来满足自己不同的备份
缺点:还原不够灵活,拍摄快照进行备份很快,但是还原的时候没办法随意进行还原,类似虚拟机快照
1、配置备份目录
在 elasticsearch.yml 的配置文件中注明可以用作备份路径 path.repo ,如下所示:
path.repo: ["/mount/backups", "/mount/longterm_backups"]
配置好后,就可以使用 snapshot api 来创建一个 repository 了,如下我们创建一个名为 my_backup 的 repository。
PUT /_snapshot/my_backup { "type": "fs", "settings": { "location": "/mount/backups/my_backup" } }
2、开始通过API接口备份
有了 repostiroy 后,我们就可以做备份了,也叫快照,也就是记录当下数据的状态。如下所示我们创建一个名为 snapshot_1 的快照。
PUT /_snapshot/my_backup/snapshot_1?wait_for_completion=true
【温馨提示】wait_for_completion 为 true 是指该 api 在备份执行完毕后再返回结果,否则默认是异步执行的,我们这里为了立刻看到效果,所以设置了该参数,线上执行时不用设置该参数,让其在后台异步执行即可。
3、增量备份
PUT /_snapshot/my_backup/snapshot_2?wait_for_completion=true
当执行完毕后,你会发现 /mount/backups/my_backup 体积变大了。这说明新数据备份进来了。要说明的一点是,当你在同一个 repository 中做多次 snapshot 时,elasticsearch 会检查要备份的数据 segment 文件是否有变化,如果没有变化则不处理,否则只会把发生变化的 segment file 备份下来。这其实就实现了增量备份。
4、数据恢复
通过调用如下 api 即可快速实现恢复功能:
POST /_snapshot/my_backup/snapshot_1/_restore?wait_for_completion=true { "indices": "index_1", "rename_replacement": "restored_index_1" }
2)elasticdump备份迁移es数据
索引数据导出为文件(备份)
# 导出索引Mapping数据 elasticdump \ --input=http://es实例IP:9200/index_name/index_type \ --output=/data/my_index_mapping.json \ # 存放目录 --type=mapping # 导出索引数据 elasticdump \ --input=http://es实例IP:9200/index_name/index_type \ --output=/data/my_index.json \ --type=data
索引数据文件导入至索引(恢复)
# Mapping 数据导入至索引 elasticdump \ --output=http://es实例IP:9200/index_name \ --input=/home/indexdata/roll_vote_mapping.json \ # 导入数据目录 --type=mapping # ES文档数据导入至索引 elasticdump \ --output=http:///es实例IP:9200/index_name \ --input=/home/indexdata/roll_vote.json \ --type=data
可直接将备份数据导入另一个es集群
elasticdump --input=http://127.0.0.1:9200/test_event --output=http://127.0.0.2:9200/test_event --type=data
type类型
type是ES数据导出导入类型,Elasticdump工具支持以下数据类型:
type类型 说明
mapping ES的索引映射结构数据
data ES的数据
settings ES的索引库默认配置
analyzer ES的分词器
template ES的模板结构数据
alias ES的索引别名
3)esm备份迁移es数据
备份es数据
esm -s http://10.33.8.103:9201 -x "petition_data" -b 5 --count=5000 --sliced_scroll_size=10 --refresh -o=./es_backup.bin
-w 表示线程数
-b 表示一次bulk请求数据大小,单位MB默认 5M
-c 一次scroll请求数量
导入恢复es数据
esm -d http://172.16.20.20:9201 -y "petition_data6" -c 5000 -b 5 --refresh -i=./dump.bin
https://zhuanlan.zhihu.com/p/540189644
https://www.cnblogs.com/windysai/p/14400830.html
#!/bin/bash
#db_backups_conf.txt文件路径
db_backups_conf="/home/ljy/scripts/elasticsearch_backup_config.txt"
base_path='/backup/elkdata'
mv_elk_bath='/backup/elkmvdata'
#本机只保留最近3天快照
find ${mv_elk_bath}/ -type f -mtime +2 -exec rm -rf {} \; > /dev/null 2>&1
##先把原来的挪走
# 获取前一天的:年,月,日
y=`date +"%Y" -d "-1day"`
ym=`date +"%Y%m" -d "-1day"`
d=`date "+%d" -d "-1day"`
if [ ! -d ${mv_elk_bath}/${y}/${ym}/${d} ];
then
mkdir -p ${mv_elk_bath}/${y}/${ym}/${d}
scp -rp ${base_path}/* ${mv_elk_bath}/${y}/${ym}/${d}/
fi
#判断配置信息文件是否存在
if [ -f "${db_backups_conf}" ];then
echo $(date +'%Y-%m-%d %H:%M:%S')" 发现备份文件配置信息文件存在"
#获取等号前内容,作为map中的Key值
dbArrOne=($(awk -F'[=]' '{print $1}' ${db_backups_conf} ))
#获取等号后内容,作为map中的value值
dbArrTwo=($(awk -F'[=]' '{print $2}' ${db_backups_conf}))
#创建一个空map
declare -A map=()
#通过循环,将db_backups_conf配置文件中的信息存储在map中
for((i=0;i<${#dbArrOne[@]};i++))
do
map[${dbArrOne[i]}]=${dbArrTwo[i]}
done
#获取要备份的索引名称的字符串
indexNames=${map["indexNames"]}
#获取默认的字符串分隔符
old_ifs="$IFS"
#设置字符串分隔符为逗号
IFS=","
#将要备份的索引名称value值的字符串进行分隔,获取一个数组
indexNamesArr=($indexNames)
#将字符串的分隔符重新设置为默认的分隔符
IFS="$old_ifs"
#获取当前年月日
saveday=$(date +%Y%m%d)
#获取超出备份天数的年月日
delday=$(date -d ${map["backupsFileDay"]}' days ago' +%Y%m%d)
#执行命令,备份es数据
{
#检测es访问地址是否有效
esStatus=$(curl -s -m 5 -IL http://${map["ipAddress"]}:${map["portNumber"]}|grep 200)
if [ "$esStatus" != "" ];then
echo $(date +'%Y-%m-%d %H:%M:%S')" es地址访问正常:http://"${map["ipAddress"]}":"${map["portNumber"]}",开始备份数据"
#遍历备份索引名称,逐个删除旧备份,重新全量备份
for indexName in ${indexNamesArr[@]};
do
echo $indexName;
##逐个判断索引是否存在
indexStatus=$(curl -s -m 5 -IL http://${map["ipAddress"]}:${map["portNumber"]}/${indexName}|grep 200)
if [ "$indexStatus" != "" ];then
#先备份,然后再删除旧备份
if [ ${map["backupBeforeDelete"]} == "yes" ];then
echo $(date +'%Y-%m-%d %H:%M:%S')" 开始同步备份索引:"${indexName}_backup_${saveday}
curl -XPUT '127.0.0.1:9500/_snapshot/elk_backup/'${indexName}'_backup_'${saveday}'?wait_for_completion=true' -d '{"indices":"'${indexName}'"}'
echo $(date +'%Y-%m-%d %H:%M:%S')" 完成同步备份索引:"${indexName}_backup_${saveday}
#删除旧备份
echo $(date +'%Y-%m-%d %H:%M:%S')" 开始删除备份索引:"${indexName}_backup_${delday}
curl -XDELETE '127.0.0.1:9500/_snapshot/elk_backup/'${indexName}'_backup_'${delday}''
echo $(date +'%Y-%m-%d %H:%M:%S')" 完成删除备份索引:"${indexName}_backup_${delday}
fi
else
echo $(date +'%Y-%m-%d %H:%M:%S')" es中不能存在索引:"${indexName}
fi
done
fi
}
else
echo "文件不存在"
fi
备份到nas上的脚本
分每天和每月(每月仅备份1个)
#/bin/bash
#Date: 2020-08-02
#Script Name: elk_logs_bak
#备份elk快照数据到nas
# 日志位置
base_path='/backup/elkdata'
nas_bak='/nasdir/elk_bak/day_bak'
# 获取当前年信息和月信息
ym=$(date +"%Y%m")
dy=`date "+%Y%m%d"`
d=`date "+%d"`
#按年月创建文件夹
if [ ! -d ${nas_bak}/${ym}/${d} ];
then
sudo mkdir -p ${nas_bak}/${ym}/${d}
fi
scp -rp ${base_path}/* ${nas_bak}/${ym}/${d}/
#每月备份最后一天数据
nasmonth_bak='/nasdir/elk_bak/month_bak'
lastday=`date -d"$(date -d"1 month" +"%Y%m01") -1 day" +"%d"`
thisday=`date +"%d"`
#保留一个月的最后一天日志
if [ $thisday == lastday ];
then
mkdir -p ${nasmonth_bak}/${ym}/
scp -rp ${nas_bak}/${ym}/${d}/* ${nasmonth_bak}/${ym}/
fi
find ${nas_bak}/${ym}/ -type f -mtime +30 -exec rm -rf {} \; > /dev/null 2>&1