首页 > 技术文章 > elk快照备份

windysai 2021-02-13 23:07 原文

elk快照备份

一、需求引入

  话说,生产用的elk部署在一台2核8G的服务器上,内存使用率经常到95%左右。而且之前因为有多个logstash配置文件来收集日志,有从tcp输入(开发写的程序,实时写入,给运营的人分析),也有后来我加的从nginx或者tomcat日志文件作为logstash输入的,filebeat去采集(就是配置文件中的input部分配置)。

  然后问题就出来了,巅峰时刻同时运行着tcp输入的有5个,filebeat采集的有2~3个。经常导致elk崩溃,如下图:

   tcp采集日志输送到logstash这个方式我还没搞清楚,是我来公司前就有这玩意的,开发也没给过我细说,所以不知道整个流程是怎么样的,只知道要是elk崩溃,从崩溃那一刻起到人为给它修复这段时间的日志是会丢失的!!!还是filebeat采集好,一般都会全量给到logstash采集的,只要日志文件没删。。。

  刚刚已经提到过,服务器配置渣渣,这个改变不了的事实,然后我没尝试过调优(这个是我的问题),而且还同时采集这么多日志文件,引用一句话:两害相权取其轻。我只能跟运营同事商量好,只保留她每天必须要看、要分析的日志,然后其他停掉,最后只留了一个tcp和一个filebeat采集tomcat日志。后来elk就没有莫名其妙挂掉了,当然这不是权宜之计,所以以后等对elk比较熟悉还是要调优滴!!然后还是有点心惊,哪天挂了,想到运营的人因为看不到日志会各种“¥#%&@#”……还是加个索引备份好了~~必要时刻恢复还原到内网的elk上给他们看

 

二、需求实现

1、创建备份文件路径

  创建一个保存数据备份文件的路径,该路径要与elasticsearch.yml中配置的备份仓库路径一致,并且该文件夹路径授予最高权限
mkdir /backup/elkdata -p
chown ljy.ljy -R /backup/elkdata

 

2、创建备份仓库(后面脚本用到)

1】配置文件添加仓库路径
(1)cd /home/ljy/elk5.2/elasticsearch-5.2.1/
(2)vim config/elasticsearch.yml 添加: path.repo: /backup/elkdata

 重启elasticsearch服务生效

kill es进程号
/home/ljy/elk5.2/elasticsearch-5.2.1/bin/elasticsearch >> nohup.out 2>&1 &

 

2】创建备份仓库:
(1)注册,运行成功是会返回一个“acknowledged:true”的信息的
curl -XPUT 'es服务器地址:es端口/_snapshot/elkbackup' -d '{
"type": "fs",
"settings": { "location": "/backup/elkdata"}
}'
 
(2)查看快照存储库
curl -XGET es服务器地址:es端口/_snapshot/elkbackup?pretty
或者运行:
 curl -XGET es服务器地址:es端口/_snapshot/_all?pretty

 

 3、备份脚本说明

  elk数据备份实际上是快照备份,备份脚本主要由两个文件组成

  参考链接(感谢大哥热心分享 ^_^):https://www.twblogs.net/a/5d008b7dbd9eee14644f72b0

  (1)配置信息文件:elasticsearch_backup_config.txt

  记录(没说明的请看参考链接):

  (a)es的ip地址和监听端口; (b)快照存储库名字(备份仓库):warehouseName; (c)备份保留backupsFileDay天的记录

  (d)backupBeforeDelete;   (e)要备份的索引名称indexNames  (f)curl绝对路径

  

  (2)主备份脚本:snapbak.sh

脚本没有语法错误的,不知道为啥成绿色了 = =

  1 #!/bin/bash
  2 
  3 #db_backups_conf.txt文件路径
  4 db_backups_conf="/home/ljy/scripts/elasticsearch_backup_config.txt"
  5 
  6 base_path='/backup/elkdata'
  7 mv_elk_bath='/backup/elkmvdata'
  8 
  9 #本机只保留最近3天快照
 10 find ${mv_elk_bath}/ -type f -mtime +2 -exec rm -rf {} \; > /dev/null 2>&1
 11 
 12 ##先把原来的挪走
 13 # 获取前一天的:年,月,日
 14 y=`date +"%Y" -d "-1day"`
 15 ym=`date +"%Y%m" -d "-1day"`
 16 d=`date "+%d" -d "-1day"`
 17 
 18 if [ ! -d ${mv_elk_bath}/${y}/${ym}/${d} ];
 19 then
 20     mkdir -p ${mv_elk_bath}/${y}/${ym}/${d}
 21     scp -rp ${base_path}/* ${mv_elk_bath}/${y}/${ym}/${d}/
 22 fi
 23 
 24 
 25 #判断配置信息文件是否存在
 26 if [ -f "${db_backups_conf}" ];then
 27 
 28         echo $(date +'%Y-%m-%d %H:%M:%S')" 发现备份文件配置信息文件存在"
 29  
 30         #获取等号前内容,作为map中的Key值
 31         dbArrOne=($(awk -F'[=]' '{print $1}' ${db_backups_conf} ))
 32 
 33         #获取等号后内容,作为map中的value值
 34         dbArrTwo=($(awk -F'[=]' '{print $2}' ${db_backups_conf}))
 35  
 36         #创建一个空map
 37         declare -A map=()
 38 
 39         #通过循环,将db_backups_conf配置文件中的信息存储在map中
 40         for((i=0;i<${#dbArrOne[@]};i++))
 41         do
 42                 map[${dbArrOne[i]}]=${dbArrTwo[i]}
 43         done
 44  
 45         #获取要备份的索引名称的字符串
 46         indexNames=${map["indexNames"]}
 47 
 48 
 49         #获取默认的字符串分隔符
 50         old_ifs="$IFS"
 51 
 52         #设置字符串分隔符为逗号
 53         IFS=","
 54  
 55         #将要备份的索引名称value值的字符串进行分隔,获取一个数组
 56         indexNamesArr=($indexNames)
 57 
 58  
 59         #将字符串的分隔符重新设置为默认的分隔符
 60         IFS="$old_ifs"
 61 
 62         #获取当前年月日
 63         saveday=$(date +%Y%m%d)
 64  
 65         #获取超出备份天数的年月日
 66         delday=$(date -d ${map["backupsFileDay"]}' days ago' +%Y%m%d)
 67 
 68 
 69         #执行命令,备份es数据
 70         {
 71            #检测es访问地址是否有效
 72            esStatus=$(curl -s -m 5 -IL http://${map["ipAddress"]}:${map["portNumber"]}|grep 200)
 73            if [ "$esStatus" != "" ];then
 74              echo $(date +'%Y-%m-%d %H:%M:%S')" es地址访问正常:http://"${map["ipAddress"]}":"${map["portNumber"]}",开始备份数据"
 75 
 76              #遍历备份索引名称,逐个删除旧备份,重新全量备份
 77              for indexName in ${indexNamesArr[@]};
 78              do   
 79                 echo $indexName;
 80                 ##逐个判断索引是否存在
 81                 indexStatus=$(curl -s -m 5 -IL http://${map["ipAddress"]}:${map["portNumber"]}/${indexName}|grep 200)
 82                 if [ "$indexStatus" != "" ];then 
 83                 #先备份,然后再删除旧备份
 84                    if [ ${map["backupBeforeDelete"]} == "yes" ];then
 85                        echo $(date +'%Y-%m-%d %H:%M:%S')" 开始同步备份索引:"${indexName}_backup_${saveday}  
 86                        curl -XPUT '127.0.0.1:9500/_snapshot/elk_backup/'${indexName}'_backup_'${saveday}'?wait_for_completion=true' -d '{"indices":"'${indexName}'"}'
 87                        echo $(date +'%Y-%m-%d %H:%M:%S')" 完成同步备份索引:"${indexName}_backup_${saveday}
 88 
 89                        #删除旧备份                       
 90                        echo $(date +'%Y-%m-%d %H:%M:%S')" 开始删除备份索引:"${indexName}_backup_${delday}
 91                        curl -XDELETE '127.0.0.1:9500/_snapshot/elk_backup/'${indexName}'_backup_'${delday}''
 92                        echo $(date +'%Y-%m-%d %H:%M:%S')" 完成删除备份索引:"${indexName}_backup_${delday}     
 93                    fi
 94                 else
 95                    echo $(date +'%Y-%m-%d %H:%M:%S')" es中不能存在索引:"${indexName}
 96 
 97                 fi                                 
 98              done
 99              fi 
100         }
101 else
102      echo "文件不存在"
103 fi

 

(3)事实上,线上还有一个备份到nas上的脚本

分每天和每月(每月仅备份1个)

 1 #/bin/bash
 2 #Date: 2020-08-02
 3 #Script Name: elk_logs_bak
 4 #备份elk快照数据到nas
 5 
 6 # 日志位置
 7 base_path='/backup/elkdata'
 8 
 9 nas_bak='/nasdir/elk_bak/day_bak'
10 # 获取当前年信息和月信息
11 ym=$(date +"%Y%m")
12 dy=`date "+%Y%m%d"`
13 d=`date "+%d"`
14 
15 #按年月创建文件夹
16 if [ ! -d ${nas_bak}/${ym}/${d} ];
17 then
18    sudo mkdir -p ${nas_bak}/${ym}/${d}
19 fi
20 
21 scp -rp ${base_path}/* ${nas_bak}/${ym}/${d}/
22 
23 #每月备份最后一天数据
24 nasmonth_bak='/nasdir/elk_bak/month_bak'
25 lastday=`date -d"$(date -d"1 month" +"%Y%m01") -1 day" +"%d"`
26 thisday=`date +"%d"`
27 #保留一个月的最后一天日志
28 if [ $thisday == lastday ];
29 then
30    mkdir -p ${nasmonth_bak}/${ym}/
31    scp -rp ${nas_bak}/${ym}/${d}/* ${nasmonth_bak}/${ym}/
32 fi
33 
34 
35 find ${nas_bak}/${ym}/ -type f -mtime +30 -exec rm -rf {} \; > /dev/null 2>&1
View Code

 

推荐阅读