zoukankan      html  css  js  c++  java
  • elk快照备份

    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
  • 相关阅读:
    datetime格式化 c#
    Cookie aps.net
    缓存页面 asp.net
    aps.net IIS 部署 显示404.3错误
    使用systemd管理进程,设置进程自动启动
    VS Code 生成Pack、在Nuget中添加包、在项目中添加包
    dotnet命令 new
    WPF ListView渲染性能优化
    SQL Server判断语句(IF ELSE/CASE WHEN )
    T-SQL脚本附加数据库
  • 原文地址:https://www.cnblogs.com/windysai/p/14400830.html
Copyright © 2011-2022 走看看