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、创建备份文件路径
mkdir /backup/elkdata -p chown ljy.ljy -R /backup/elkdata
2、创建备份仓库(后面脚本用到)
重启elasticsearch服务生效
kill es进程号 /home/ljy/elk5.2/elasticsearch-5.2.1/bin/elasticsearch >> nohup.out 2>&1 &
curl -XPUT 'es服务器地址:es端口/_snapshot/elkbackup' -d '{ "type": "fs", "settings": { "location": "/backup/elkdata"} }'
curl -XGET es服务器地址:es端口/_snapshot/elkbackup?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