前言

    最近公司在进行数据备份计划,所以我编写了“scp自动复制脚本”与“rsync+inotify实现服务器之间文件实时同步”的2个备份文档,2个方案都成功的被使用,领导与同事都认为能解决备份问题,接下来在进行备份的时候,也没用发现问题,证明我弄的备份文档还可以,领导还说我弄的不错 。
    但在接下来备份的中途,发现服务端(也就是要做备份的服务器)的磁盘空间满了,在这台服务器的一些服务写不了输入到服务器里(这个是通过nagios监控磁盘空间得到的报警邮件,但我明明设置为磁盘空间超过80%warning报警,超过90%进行crtical报警,但磁盘空间都满了才收到报警,不知道哪里设置错了,还在查找),所以我们打算清理一些文件,获得一些空间。
    当我登陆服务器就发现没有什么可以删除的文件,但服务器磁盘空间都满了超过5分钟了,领导们都很着急,最后没办法只能在正在进行备份任务的服务端,删除一些已经备份到备份服务器的文件,这个是最后的办法了,但那个备份的目录里有8509个文件夹,每个文件夹里有3000-7000左右的txt文件,我当时进行的是scp自动复制,如果想删除哪些文件的话,还得去备份端查看哪些文件已经在备份端接收了,然后在去服务端删除,这样的话,太浪费时间了,而且工作量太大,每个文件大约能有3-5m,刚开始我清理了20个,获得了83m,这样服务端的应用服务可以写入数据到服务器了,但生成的文件速度太快了(以前磁盘空间大的时候也没用注意 ),比我删除的速度都快,这样的话,过一会磁盘就又满了。
    没办法,我就打算用脚本来解决此问题,在经过30分钟左右时间,总算写成了一个脚本,在测试机里测试了几遍没用问题发现,就在生产的服务器里运行了这个脚本,发现删除速度很快,没用误删除文件,总算解决了这个问题。
    下面是我为这个“备份文件自动对比、删除脚本”写的运维人员使用手册,一个技术文档。
 
备份文件自动对比、删除脚本
一、目的   
         由于引擎服务器里应用服务每五秒生成一个文件夹,每个文件夹有3000-7000左右的txt文档,所以造成引擎服务器的磁盘空间饱满,不能正常的工作,为了解决这种情况,我编写了“ssh信任与scp自动备份脚本”与“rsync+inotify实时同步服务器文件”这2种解决方法,但发现备份任务可以完成,并符合公司平台的要求,但在做备份的时候,很可能引擎服务器的磁盘空间就满了,没有办法正常工作,或者在备份完成的时候,由于文件数目很多,没有办法知道哪些是备份完成的,哪些是没有备份的,及时做wc -l对比也不行,所以根据这种情况,我又编写了一份“备份文件自动对比、删除脚本”,用自动化的方式来实现备份文件的自动对比、删除,解决了磁盘空间满的问题,为我们运维的工作节省了很多的时间,去解决其他的问题。
二、实现机制
         是通过脚本的方式实现自动化,在服务端与备份端都运行此脚本,产生日志,并把备份端的日志传到服务端,并在服务端的要备份目录里,运行rm脚本,实现了备份文件自动对比、删除。
三、脚本内容解释
A.服务端server
  1. #!/bin/bash  
  2. server="$(ls -l /usr/local/lbs/file/area|awk '{print $9}')"    ###此为查看要备份的目录,并把他的文件名复制到server_log日志里  
  3. echo $server > /tmp/server_log  

注意:在server脚本里面,server="$(ls -l /usr/local/lbs/file/area|awk '{print $9}')" 这个里面,ls -l /usr/local/lbs/file/area是你做备份的目录(是服务端机器的要做备份的目录),还有那个awk '{print $9}'如果你在使用英文字体的服务器上,使用$9;如果是中文字体的服务器上,使用$8,如何查询当前服务器使用哪种字体,可以使用cat /etc/sysconfig/i18n命令,查询结果为LANG="en_US.UTF-8",则是英文字体;查询结果为LANG="zh_CN.UTF-8",则为中文字体。

B.备份端back
  1. #!/bin/bash  
  2. back="$(ls -l /home/beifen/area|awk '{print $9}')"   ###此为查看做备份的目录,并把它的文件名负责到back_log日志里  
  3. echo $back> /tmp/back_log  

在back脚本里面,ddir="$(ls -l /home/back/area20120208|awk '{print $9}')"这个里面,/home/back/area20120208是你做备份的目录(是备用机器的目录),还有那个awk '{print $9}'如果你在使用英文字体的服务器上,使用$9;如果是中文字体的服务器上,使用$8,

如何查询当前服务器使用哪种字体,可以使用cat /etc/sysconfig/i18n命令,查询结果为LANG="en_US.UTF-8",则是英文字体;查询结果为LANG="zh_CN.UTF-8",则为中文字体。
C.服务端的rm
  1. #!/bin/bash  
  2. a="$(cat /tmp/server_log)" ##定义a为查看服务端日志里文件名  
  3. b="$(cat /tmp/back_log)" ##定义b为查看备份端日志里文件名   
  4. for a in $b;             ##如果服务端的文件名与备份端的文件名一直,那么在服务端删除备份端里的文件名,这样在服务端就没有了这个文件,节省了磁盘空间,而在备份端还存在这个文件,起到了备份的计划任务。  
  5. do   
  6. rm -rf $b  
  7. done  
四、部署脚本
1、在备份端
把back上传到备份端,给764权限
然后运行sh back,就能在/tmp里看到一个back_log日志文件产生,并把此文件上传到被备份端的/tmp目录下;
2、服务端
A.把server上传到此服务器上,给764权限
然后运行sh server,就能在/tmp里看到一个server_log日志文件产生;
B.把rm上传到此服务器,具体路径为/usr/local/lbs/file/area,给764权限;
C.运行sh rm,等待一会就能自动的删除area里的文件(只是在存储里删除贵州备用机器里已有的文件)
五、备注
         此脚本只适用与备份端的(/home/beifen/area)与被备份端的(/usr/local/lbs/file/area)之间的文件传输与自动删除area里的文件,其他情况不适用。
         如果你想进行备份其他目录里的文件的话,需要修改服务端server里的内容与备份端back里的内容,并且把rm上传到服务端中要做备份里的目录下。

以上是我编写的运维手册,可能大家很多地方看不明白,我在下面进行一些操作,可以使大家更明白。

下面是进行操作的2太服务器的结构,分别有主机名、ip地址、备份的身份status(是服务端还是备份端)、系统、内核、位数;

1、服务端(我这里是savecenter)

把server上传到服务器的tmp/test目录下,并给予744权限;(此脚本需要进行根据环境进行修改,根据目前情况我的修改如下)

  1. #!/bin/bash  
  2. server="$(ls -l /tmp/test|awk '{print $9}')"    ###此为查看要备份的目录,并把他的文件名复制到server_log日志里  
  3. echo $server > /tmp/server_log   

2、备份端(我这里是nagios)

把back上传到服务器的tmp/test目录下,并给予744权限;(此脚本需要进行根据环境进行修改,根据目前情况我的修改如下)

  1. #!/bin/bash    
  2. back="$(ls -l /tmp/test|awk '{print $9}')"   ###此为查看做备份的目录,并把它的文件名负责到back_log日志里    
  3. echo $back> /tmp/back_log   

现在脚本已经上传到服务器里,准备工作完成,下面可以测试我的脚本了。但我还是先说明一下,这次实验的目的,是要在服务端(savecenter)里建立1-10,10个文件夹,然后在备份端(nagios)建立1-5,5个文件夹,在使用我的脚本,查看能否自动的进行对比与删除。

但为什么需要在服务端建立10个文件夹,备份端建立5个文件夹呢?

因为如果服务端在做备份的时候,把文件备份到备份端,但可能备份没有完成,还正在进行备份任务,所以可能服务端里有10个文件夹,但备份端里只接受到了5个,但这时服务端的磁盘空间满了,为了获得空间,需要删除已经做备份的文件,所以我这里是在服务端里建立了10个文件夹,备份端建立了5个文件夹,代表备份没有完成、正在进行,然后使用我的脚本,删除服务端里跟备份端的5个文件夹相同名字的文件夹,如果无误,说明我的脚本能够实现备份的文件自动对比、删除。

3、现在在服务端创建1-10,10个文件夹,结果如下图

4、在备份端创建1-5,5个文件夹,结果如下图

5、现在在服务端运行server脚本,就能获得server_log日志,里面内容都是/tmp/test下1-10,10个文件夹的名字;

6、在备份端运行back脚本,能得到back_log日志,里面的内容为/tmp/test下1-5,5个文件夹的名字

7、现在把备份端的back_log日志,传到服务端的tmp目录下

  1. [root@nagios tmp]# scp back_log 172.16.6.2:/tmp  
  2. back_log                                                                100%   10     0.0KB/s   00:00     

8、把rm上传到服务器的tmp/test目录下,并给予744权限;(此脚本需要进行根据环境进行修改,根据目前情况我的修改如下)

  1. #!/bin/bash
  2. a="$(cat /tmp/server_log)" ##定义a为查看服务端日志里文件名
  3. b="$(cat /tmp/back_log)" ##定义b为查看备份端日志里文件名 
  4. for a in $b;  ##如果服务端的文件名与备份端的文件名一直,那么在服务端删除备份端里的文件名,这样在服务端就没有了这个文件,节省了磁盘空间,而在备份端还存在这个文件,起到了备份的计划任务。
  5. do
  6. rm -rf $b
  7. done

9、在服务端运行rm脚本,它自动对比server_log日志与back_log日志,如果server_log日志里的名字在back_log里,就删除back_log日志里的内容,达到自动对比、删除功能

下面是服务端运行rm的情况与结果图

从图上看,1-5,5个文件夹都已经删除了

下面是备份端的tmp/test下的截图

从上面可以看见,1-5,5个文件夹没有变化,所以我的这个“备份文件自动对比、删除脚本”实现了备份文件的自动对比并自动删除任务。

总结:我编写的这个“备份文件自动对比、删除脚本”适用于备份的文件数目多,正在进行备份任务,但需要删除已经做备份的文件,或者备份任务完成,但备份的文件很多、很杂,删除需要对比在删除,很浪费时间与人力,使用了此脚本加上我前文写的“ssh信任与scp自动复制脚本”与“rsync+inotify实时同步服务器文件”可以实现自动化的、实时的同步或者备份服务器文件,并在正在进行备份任务或者完成备份任务的时候,自动对比、删除已经备份的文件,节省人力与时间。

虽然我写的比较多,而且可能有点复杂,但实现的功能还是很强的,脚本也很容易读懂,如果各位想在自己的环境下运行,需要根据各位的需要进行相应的修改了,如果还有什么不懂的地方,可以留言给我,我会及时的帮各位解答.

下面是我写的“ssh信任与scp自动复制脚本”与“rsync+inotify实时同步服务器文件”链接:

“ssh信任与scp自动复制脚本”           http://dl528888.blog.51cto.com/2382721/769519

“rsync+inotify实时同步服务器文件”    http://dl528888.blog.51cto.com/2382721/771533