Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3386540
  • 博文数量: 631
  • 博客积分: 10716
  • 博客等级: 上将
  • 技术积分: 8397
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-01 22:35
文章分类

全部博文(631)

文章存档

2020年(2)

2019年(22)

2018年(4)

2017年(37)

2016年(22)

2015年(1)

2013年(12)

2012年(20)

2011年(19)

2010年(20)

2009年(282)

2008年(190)

分类:

2009-09-06 19:14:34

本文是 Unix/Linux 系统管理自动化系列中的一篇,主要讲述如何实现自动化备份与同步系统数据。

数据是 Unix/Linux 系统中最重要的组成部分 , 但是数据的备份与同步却是最容易被忽略的任务。通过定期的数据备份与同步,可以在磁盘出现故障时,最大程度的降低数据损失。当用户误操作导致数据损坏或者丢失时,可以快速恢复。

数据的备份不同于整个系统备份,将不同数据按照优先级分类,根据用户需求,备份重要文件。

从而使数据独立于操作系统,降低备份成本与时间。

不同的操作系统可能使用不同的数据备份方式,本文介绍了通用的 Unix/Linux 实用程序(tar 和 cpio),标准的 AIX 实用程序 (mksysb 和 backup),以及远程备份工具 rsync。





回页首


在商业环境中,必须首先确定需要备份哪些文件以及备份所消耗的时间。如果备份过多的文件,会导致备份系统的成本过于庞大,从而带来不必要的开支。如果没有备份足够的数据,那么可能导致重要数据的丢失,反而带来更大的损失。

当然,备份整个系统是简单易行的,但是通常这样的备份是浪费的且缺乏意义的。从减少备份系统的成本出发,只有当某些数据足够重要,需要共享,才具有备份的必要。

基本数据一般分为以下几类:

  • 用户数据:所有的用户数据以及用户目录,及私人文件等。
  • 系统信息:系统用户,组,密码,主机列表等。
  • 应用程序:系统上启动的服务,比如 web 应用程序,apache 等。
  • 应用程序的配置文件与数据:针对不同的应用程序,不同的配置参数和重要数据文件。
  • 数据库:事实上数据库可以单独提供针对数据库所有数据的备份与同步功能。

简单的数据备份是指一次性备份所有数据,然后再备份上次备份之后所做的修改。第一次备份是指“完全备份”,后一次备份是“增量备份”。通常适用于个人或者小型网站。对于机构或者大型网站来说,需要采用“多级备份”。将完全备份设定为 0 级,增量备份的级别分别是 1,2,3 等。在每个增量备份级别上,可备份同级或上一级的上次备份以来的变动。

比如,如果我们有 1 0 盘磁带,如果使用简单备份进行日备份,则可恢复两周内的数据。

如果使用多级备份,例如:

磁带 1-2, 月备份,每月第一个星期五

磁带 3-6, 周备份,每周星期五(排除第一周)

磁带 7-10,日备份,每周星期一到四,则可以将备份历史扩展到两个月。





回页首




mkinsttape 镜像包括以下重要文件:

  • Tapeblksz 该文件包含运行 mksysb 前设置的磁带驱动器的块大小。
  • bosinst.data 该文件指定目标系统的需求以及基本操作系统安装程序是怎样运行
  • image.data 该文件包含安装过程中实际安装的镜像的描述数据(文件大小、名称、装入点等)。

表 3. mksysb 命令的常用参数:

参数 含义
-e 该参数将不备份 /etc/exclude.rootvg 文件中定义的文件
-i 该参数将调用 mkszfile 命令自动生成一个新的 image.data 文件
-m 该参数将调用 mkszfile 命令生成映射文件

在运行 mksysb 前,可以运行 mksysb -i 命令来自动生成一个新的 image.data 文件。虚拟 TOC 可以确保 mksysb 磁带中包含的镜像数与基本操作系统安装磁带中的镜像数相同。最后,rootvg 数据包含用 mksysb 命令备份的实际数据。它实际上会使用 backup 命令保存 rootvg 中所有装入的文件系统的内容。

如果对用户卷组进行备份的话,可使用下列的命令:

 # savevg -if /dev/rmt0 uservg 

其中,-i 参数将调用 mkvgdata 命令;-f 参数将数据存储到指定设备或文件中。

backup 介绍

backup 是 AIX 系统提供的一种备份文件和文件系统的方法,其本身就可以支持增量备份和多级备份,不必借助其它方式,其好处在此不在赘述。

表 4. backup 命令的常用参数:

参数 含义
-level 该参数指定备份级别(0-9), 默认是 9
-i 该参数将按名称备份整个文件系统
-f 该参数将数据备份到指定设备中
-p 该参数在归档之前先打包或压缩,且小于 2G 的文件。适用于不活动的文件系统
-q 该参数指可移动介质已准备就绪
-u 该参数将用文件系统的原始设备名称 , 时间日期以及备份级别来更新 /etc/dumpdates 文件
-v 该参数将在 backup 时显示附加信息

将 /CriticalDate 目录和它的所有文件和子目录备份到指定设备,使用:

 # find /CriticalDate -depth | backup -i -f /dev/rmt0 

-level 和 -u 参数结合,可以进行多级和增量备份:

 # backup -0 -uf /dev/rmt0 /home 

rsync 介绍

如果将数据备份与远程传输结合起来,譬如 scp,就可以实现数据的远程备份。但通常的备份方法,都无法对本地和远程目录中的内容进行同步。

rsync(Remote Sync)是 Unix/Linux 系统下一款优秀的数据备份与同步工具。它可以对文件集进行同步。然而更有价值的是,rsync 使用文件的增量,也就是说,它在网络中仅发送两个文件集合有区别的部分。这样可以占用更少的带宽,并且速度更快。

rsync 的特性:

  • 能够更新整个目录树和文件系统
  • 保持原文件的权限,时间,软硬链接
  • 安装无需特殊权限
  • 优化的流程,文件传输速率高
  • 可以通过直接的 socket 连接传输文件,或者选择 rsh,ssh 等方式
  • 支持匿名传输

表 5. rsync 命令的常用参数:

参数 含义
-a 该参数表示以递归方式传输文件,并保持所有文件属性
-v 该参数显示详细的传输处理
-z 该参数对备份的文件在传输时进行压缩处理
-P 该参数将显示备份过程

如果在客户端对服务器上的重要数据进行备份的话,可使用下列的命令:


清单 1. rsync 命令演示
 
 #rsync – avzP rsync@Server::CriticalData /Backup 

 =========================== 
 This is Critical Data Server 
 =========================== 

 receiving file list ... 
 9 files to consider 
 Location/ 
 Location/Locationlist1 
    97164953  13%    1.11MB/s    0:08:57 


   706609152 100%    1.17MB/s    0:09:37 (xfer#1, to-check=5/9) 
 Name/Name1 
          44 100%    0.16kB/s    0:00:00 (xfer#2, to-check=3/9) 
 Name/Name2 
          22 100%    0.08kB/s    0:00:00 (xfer#3, to-check=2/9) 
 Time/Monday 
          17 100%    0.06kB/s    0:00:00 (xfer#4, to-check=0/9) 

 sent 32111 bytes  received 497214837 bytes  847820.88 bytes/sec 
 total size is 706609242  speedup is 1.42 

首次传输过程进行完全备份,当再次运行该命令时,rsync 将只传输数据的增量。从而完成增量备份。

如果在客户端对服务器上的重要数据进行同步的话,可使用下列的命令:

 # rsync -avzP --delete rsync@Server::CriticalData /Backup 

这里调用 --delete 选项,表示客户端上的数据要与服务器端完全一致,如果 /Backup 目录中有服务器不存在的文件,则删除。从而保持客户端与服务器的数据同步。

注意:谨慎使用 --delete 选项,最好不要把已经有重要数所据的目录当做客户端的备份目录,否则会误删除重要数据。

如果用客户端的备份数据去恢复服务器,可使用下列的命令:

 #rsync – avzPO  /Backup/ rsync@Server::CriticalData 

这里需要将 rsync.conf 中 read only 设置为 false,同时使 /CirticalData 目录具有写权限。

注意:也可调用 --delete 选项来保持客户端与服务器端的数据同步。在后面,将详细介绍 rsync.conf 的配置。-O 参数用于忽略目录的时间属性。





回页首


系统管理员必须执行的数据备份与同步任务大多牵涉到某种形式的系统配置,当管辖的任务比较庞大,数据量较多,但操作一样且有固定周期时,采用自动化脚本就成为必然。尤其是为多个操作系统提供支持时。

要实现自动化操作,脚本编制是必须掌握的基本技能。一个脚本由一系列命令构成,这些命令负责执行各种各样的任务。系统管理员在重复执行了几遍类似的命令后,通常就能准确地掌握要点,并希望利用脚本,将重复性的工作交给计算机去做。常用的脚本语言有 Shell,Perl,Tcl/Expect 等。

实用命令的自动化实现

本文的示例主要是通过 Shell 来实现的。Shell 是一种“解释性”语言,列出了管理员通过键盘敲入的相同命令, 并且每次执行一次这样的命令。

例如执行一条简单的 tar 命令,可以使用下面的一个简单的脚本。



 
 #!/bin/sh 
 tar -czvf backup.tar.gz /CriticalData/ 

如果我们想用其它的命令来实现数据备份,可以将以上的示例脚本中的命令部分替换掉,例如执行一条简单的 cpio 命令,可替换为下面一个简单的脚本。



 
 #!/bin/sh 
 find /CriticalData/ -depth | cpio -ov > backup.cpio 

事实上我们可以通过 shell 中一些变量设置,条件测试以及流程控制语句来实现不同的需求。例如,管理员希望能够在周一到周日,通过 backup 命令做多级备份。

我们可以设置 Level 变量,当变量满足不同条件时,就可以实现多级备份。



 
 #!/bin/sh 

 // 判读当前系统的日期是星期几
 DATE=`date | awk '{ printf $1 }'` 
 case $DATE in 
  Mon) LEVEL=1;; 
  Tue) LEVEL=2;; 
  Wed) LEVEL=3;; 
  Thu) LEVEL=4;; 
  Fri) LEVEL=5;; 
  Sat) LEVEL=6;; 
  Sun) LEVEL=7;; 
 esac 

 // 备份命令
 backup -$LEVEL -uf /dev/rmt0 /home 

虽然各种实用程序和命令以及参数各不相同,但 shell 自动化脚本的基本思路是类似的。如果系统管理员需要连续地定期地执行脚本,可以借助 Unix/Linux 系统的 crontab 功能。

rsync 的自动化实现

由于 rsync 在数据备份与同步上的优秀表现,本文将主要介绍用 rsync 来实现数据的备份与同步。

要使用 rsync,只需要将主服务器安装并配置成为 rsync 服务器,将另外一台装有 rsync 的机器作为备份客户端。在对 rsync 服务器配置结束以后,就可以在客户端发出 rsync 命令来实现将服务器端的文件备份到客户端来。在客户端创建自动化脚本,并启用 cron 服务,就可以定期对主服务器的数据进行自动备份与同步。

  1. 在服务器端手动创建 rsync 配置文件

    创建 rsync.conf 作为服务器配置文件

    假设我们在服务器端,设置需要备份的目录 /CriticalData, 但不需要备份 /CriticalData 目录下的 Common 目录。

    先创建一个目录,用于存放 rsync 相关配置文件

     # mkdir /etc/rsyncd 
    

    创建 rsync.conf

     #touch /etc/rsyncd/rsyncd.conf 
    

    编辑 rsyncd.conf


     
    gid = users                     
    read only = true
    use chroot = true
    transfer logging = true
    log format = %h %o %f %l %b
    log file = /var/log/rsyncd.log
    pid file = /var/run/rsyncd.pid
    secrets file = /etc/rsyncd.secrets
    hosts allow = 192.168.0.0/255.255.255.0
    max connections = 5
    timeout = 300
    motd file = /etc/rsyncd/rsyncd.motd
    
    [CriticalData]
    path = /CriticalData          
    list = true
    ignore errors      
    comment =This is Critical Data
    auth users = rsync    
    secrets file = /etc/rsyncd/rsyncd.secrets
    exclude = Common/   
    

    rsync.conf 中主要分为全局变量和模块两部分。模块用 [ ] 表示,模块之前的为全局变量。

    重要参数说明:

    path
    指定该模块所定义的备份目录的路径,该参数是必须指定的。

    exclude
    用来指定多个由空格隔开的多个文件或目录 ( 相对路径 ),并将其添加到 exclude 列表中。这等同于在客户端命令中使用 --exclude 参数。一个模块只能指定一个 exclude 选项。但是需要注意的一点是该选项有一定的安全性问题,客户端很有可能绕过 exclude 列表,如果希望确保特定的文件不能被访问,那就最好结合 uid/gid 选项一起使用。

    auth users
    该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户不一定是客户端存在的用户。如果"auth users"被设置,那么客户端发出对该模块的连接请求时,需要对用户身份进行验证。用户的名和密码以明文方式存放在"secrets file"选项指定的文件中。默认情况下无需密码就可以连接模块 ( 也就是匿名方式 )。

    创建 rsync.secrets 作为用户密码文件

     #touch /etc/rsyncd/rsyncd.secrets 
     #chmod 600 /etc/rsyncd/rsyncd.secrets 
    

    编辑 rsyncd.secrets, 格式为“用户 : 密码”

     rsync:passwd 
    

    注意:rsync是服务器上存在的用户同时将/CriticalData的使用者改为rsync

     #chown -R rsync /CriticalData/ 
    

    创建 rsync.motd 作为登录消息文件

    此文件是选择性配置文件,也可以不创建。

     #touch /etc/rsyncd/rsyncd.motd 
    

    编辑 rsyncd.conf

     ============================
    This is Critical Data Server
    =============================
     

  2. 启动 rsync

    将 rsync 启动

     #/usr/bin/rsync --daemon  --config=/etc/rsyncd/rsyncd.conf 
    

    可以将这个命令写入 /etc/rc.d/rc.local 中,当系统启动时,自动运行 rsync。

  3. 创建脚本

    在客户端创建一个 /root/rsync/ 目录用来存放自动化脚本和其它文件。

    创建 /root/rsync/rsync.sh 自动化脚本,保证权限为 755。




     
     #!/bin/sh 
    
     export RSYNC_PASSWORD=passwd 
     export PATH=$PATH:/bin:/usr/bin:/usr/local/bin 
    
     // 设置远程服务器与需要备份的目录
     SERVER=rsync@Server 
     DIR=CriticalData 
    
     // 设置客户端上的用于备份的目录
     BDIR=/Backup 
     BASE=Current 
     INCREMENTDIR=`date +%Y-%m-%d` 
    
     // 在客户端灵活使用 exclude 功能;设置日志
     EXCLUDES=/root/rsync/excludes 
     LOG=/tmp/rsync.log 
    
     // 参数设置,调用 backup-dir 将服务器端的增量文件存储到 INCREMENTDIR 目录下
     OPTS="-avz--force --delete --delete-excluded  --exclude-from=$EXCLUDES -b 
     --backup-dir=$BDIR/$INCREMENTDIR --ignore-errors"
    
     // 确保客户端上的用于备份的目录存在
     install -d $BDIR/$BASE 
    
     // 实现数据备份与同步,将日志邮寄给 root 用户
     run_rsync() 
     { 
     echo "==========Begin rsync: `date`===========" >>$LOG 2>&1 
     du -s $BDIR/* >>$LOG 2>&1 
     rsync $OPTS $SERVER::$DIR $BDIR/$BASE  >>$LOG 2>&1 
     echo "==========End rsync: `date`===========" >>$LOG 2>&1 
     mail root -s "Backup Report" < $LOG 
     rm $LOG 
     } 
    
     // 条件测试,运行程序
     if [ -f $EXCLUDES ]; then 
            if [ -d $BDIR ]; then 
                    run_rsync 
            else 
                    echo "cant find $BDIR"; exit 
            fi 
            else 
                    echo "cant find $EXCLUDES"; exit 
     fi 
    

    执行完 rsync.sh 后,可以查看 /Backup 目录来检查数据的正确性。将有两种目录,一个是 Current 目录,用于存放当前服务器端备份和同步后的数据。在脚本运行过程中,进行增量传输。另外还有一个类似于 2009-06-16 的目录,用于存放已在服务器端删除的增量数据。目录的名称将根据脚本执行的日期定义。

      # pwd 
     /Backup 
     # ls
     2009-06-16  Current
     

  4. 启用 cron 服务,实现定期自动备份

    如果系统管理员需要连续地定期地执行脚本,那么就需要借助 Unix/Linux 系统的 crontab 功能,使系统可以定期地调用 rsync.sh 脚本。

    使用命令“crontab -e”编辑 crontab,添加一条类似于以下的项:

     0 0 * * * /root/rsync/rsync.sh 2>&1>>/root/rsync/rsync_cron.log 
    

    重新启动 cron 服务,并用“crontab – l” 查看任务是否添加成功。也可以定期查看 /root/rsync/rsync_cron.log 来监控 cron 服务的运行情况。

  5. 监控脚本的执行过程

    如果配置正确 , rysnc.sh 的执行过程将会邮寄给 root 用户,通过 mail 命令可读取这些邮件。




    # mail
    Mail version 8.1 6/6/93.  Type ? for help.
    "/var/spool/mail/root": 1 message 1 new
    >N  1 root@cdlf2ler02.clus  Tue Jun 16 16:53  32/1050  "Backup Report"
    & 
    

    敲入回车,可显示具体的邮件内容。类似于:




     
     Message 1: 
     From root@cdlf2ler02.clusters.com  Tue Jun 16 16:53:35 2009 
     Date: Tue, 16 Jun 2009 16:52:14 -0400 
     From: root  
     To: root@cdlf2ler02.clusters.com 
     Subject: Backup Report 
    
     ==========Begin rsync: Tue Jun 16 16:52:14 EDT 2009=========== 
     16      /Backup/Current 
     =========================== 
     This is Critical Data Server 
     =========================== 
    
    
     receiving file list ... done 
     deleting b/ 
     ./ 
     Location/ 
     Name/ 
     Name/Namelist1 
    
     sent 214 bytes  received 317 bytes  1062.00 bytes/sec 
     total size is 3  speedup is 0.01 
     ==========End rsync: Tue Jun 16 16:52:14 EDT 2009=========== 
    





回页首


本文介绍了在 Unix/Linux 上广泛应用的实用命令和程序。随着磁盘的容量变得越来越大,要想跟踪所有的数据更加困难。只有更好的了解数据组成,进行数据分类,分析重要数据,结合工具的使用,才能低成本,高效率的进行数据备份与同步。自动化的实现同时也为数据备份与同步提供了很大的方便性,是另一种节省时间和精力并减少人工错误的方法。

阅读(1621) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~