关于 elasticsearch 的快照备份恢复官方文档还有其他很多文档介绍的很清楚了,这里直接贴链接 http://cwiki.apachecn.org/pages/viewpage.action?pageId=9405386 。下面主要介绍的是我遇到的需要从之前已经删除过的快照仓库来恢复快照。
一、 背景
由于磁盘空间有限,因此写了一个 crontab 来每天晚上检查磁盘空间,低于阈值,则删除旧的快照仓库,创建新的快照仓库,将最早的索引进行快照备份,并生成压缩文件,将压缩文件备份,最后删除索引。也就是说,这么做,每次系统里只有当前最老的索引快照,其余的快照都是压缩文件,那么想从压缩文件中恢复之前老的快照应该怎么做,此时当时创建老的快照时的仓库早已被删除。
二、查询文档说明
官方文档说明,当一个快照仓库被删除时,Elasticsearch只是删除快照的仓库位置引用信息。快照本身没有删除,并在原来的位置。
因此,我们可以大胆的猜测,只要我们重建了当时的快照仓库,再将快照恢复到快照仓库的位置,是不是就可以利用这个快照来恢复索引了。下面就是实践
三、实践
1. crontab 脚本
#!/usr/bin/env bash
set -e -u
reset_snapshot() {
echo "/ndeleting old log archive snapshot" 删除旧的快照仓库
curl -X DELETE http://localhost:9200/_snapshot/log_archive
echo "/nremove old log archive data"
if [ -d "/data/elasticsearch/backup/log_archive" ]; then
rm -rf "/data/elasticsearch/backup/log_archive"
fi
echo "/ncreate new log archive snapshot" 创建新的快照仓库
curl -X POST http://localhost:9200/_snapshot/log_archive -d '{"type": "fs", "settings": {"location": "log_archive", "compress": true}}'
}
backup_log() {
earliest_log_date=$(curl -s http://localhost:9200/_cat/indices | awk '/logstash-/ {print $3}'| sed -e "s/^logstash-//" | sort | head -n 1)
备份最早的日志索引的快照
echo "\ncreate earliest log snapshot logstash-${earliest_log_date}"
curl -X PUT "http://localhost:9200/_snapshot/log_archive/logstash-${earliest_log_date}" -d "{\"indices\": \"logstash-${earliest_log_date}\", \"ignore_unavailable\": \"true\", \"include_global_state\": false }"
while [ $(curl -s "http://localhost:9200/_snapshot/_status" | grep -c "logstash-${earliest_log_date}") != 0 ]; do
sleep 20s
done
echo "backup tar file"
tar -zcvf /backup/log_archive-$(sed "s/\.//g" <<< "logstash-${earliest_log_date}").tgz /data/elasticsearch/backup/log_archive
删除最早的日志的索引
echo "deleting old indices logstash-${earliest_log_date}"
curl -X DELETE http://localhost:9200/logstash-${earliest_log_date}
}
monitor_disk() {
while true; do
available_disk=$(df -h | awk ' /\/data/ {print $4}' | sed -e "s/G//")
if [[ $available_disk > 80 ]]; then
echo "disk space is available"
exit
fi
reset_snapshot
backup_log
done
}
monitor_disk
2. 查询当前的最旧的索引时间,可以看到是4月22号
3. 查询当前的快照仓库和快照,发现只有4月21号的快照
4. 查询备份的压缩文件
也就是说,我们可以尝试恢复4月20号的快照索引,可以看到4月20号的log果然查不到
5. 恢复
1)由于快照仓库存在,而且每次创建的仓库都是一样的,所以这里不需要再额外创建快照仓库。只需要将原有的快照仓库的快照先mv了,然后将压缩的快照仓库解压缩到 path.repo 里即可。发现过了大概一分钟再去查询快照仓库和快照就会发现 reload 生效了
查询之前的快照发现已经显示不存在了
2)现在进行恢复
恢复之后查询最早索引,发现已经恢复成功了
但是刚恢复好的索引会发现没有数据,需要等一两分钟,分片的数据才可以完全恢复好
3)查询 kibana 当天的数据发现也可以查到
网友评论