分类:
2009-09-06 19:14:34
本文是 Unix/Linux 系统管理自动化系列中的一篇,主要讲述如何实现自动化备份与同步系统数据。
数据是 Unix/Linux 系统中最重要的组成部分 , 但是数据的备份与同步却是最容易被忽略的任务。通过定期的数据备份与同步,可以在磁盘出现故障时,最大程度的降低数据损失。当用户误操作导致数据损坏或者丢失时,可以快速恢复。
数据的备份不同于整个系统备份,将不同数据按照优先级分类,根据用户需求,备份重要文件。
从而使数据独立于操作系统,降低备份成本与时间。
不同的操作系统可能使用不同的数据备份方式,本文介绍了通用的 Unix/Linux 实用程序(tar 和 cpio),标准的 AIX 实用程序 (mksysb 和 backup),以及远程备份工具 rsync。
|
在商业环境中,必须首先确定需要备份哪些文件以及备份所消耗的时间。如果备份过多的文件,会导致备份系统的成本过于庞大,从而带来不必要的开支。如果没有备份足够的数据,那么可能导致重要数据的丢失,反而带来更大的损失。
当然,备份整个系统是简单易行的,但是通常这样的备份是浪费的且缺乏意义的。从减少备份系统的成本出发,只有当某些数据足够重要,需要共享,才具有备份的必要。
基本数据一般分为以下几类:
简单的数据备份是指一次性备份所有数据,然后再备份上次备份之后所做的修改。第一次备份是指“完全备份”,后一次备份是“增量备份”。通常适用于个人或者小型网站。对于机构或者大型网站来说,需要采用“多级备份”。将完全备份设定为 0 级,增量备份的级别分别是 1,2,3 等。在每个增量备份级别上,可备份同级或上一级的上次备份以来的变动。
比如,如果我们有 1 0 盘磁带,如果使用简单备份进行日备份,则可恢复两周内的数据。
如果使用多级备份,例如:
磁带 1-2, 月备份,每月第一个星期五
磁带 3-6, 周备份,每周星期五(排除第一周)
磁带 7-10,日备份,每周星期一到四,则可以将备份历史扩展到两个月。
|
mkinsttape 镜像包括以下重要文件:
表 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 是 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 |
如果将数据备份与远程传输结合起来,譬如 scp,就可以实现数据的远程备份。但通常的备份方法,都无法对本地和远程目录中的内容进行同步。
rsync(Remote Sync)是 Unix/Linux 系统下一款优秀的数据备份与同步工具。它可以对文件集进行同步。然而更有价值的是,rsync 使用文件的增量,也就是说,它在网络中仅发送两个文件集合有区别的部分。这样可以占用更少的带宽,并且速度更快。
rsync 的特性:
表 5. rsync 命令的常用参数:
参数 | 含义 |
---|---|
-a | 该参数表示以递归方式传输文件,并保持所有文件属性 |
-v | 该参数显示详细的传输处理 |
-z | 该参数对备份的文件在传输时进行压缩处理 |
-P | 该参数将显示备份过程 |
如果在客户端对服务器上的重要数据进行备份的话,可使用下列的命令:
#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 服务,就可以定期对主服务器的数据进行自动备份与同步。
创建 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 ============================= |
将 rsync 启动
#/usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf |
可以将这个命令写入 /etc/rc.d/rc.local 中,当系统启动时,自动运行 rsync。
在客户端创建一个 /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 |
如果系统管理员需要连续地定期地执行脚本,那么就需要借助 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 服务的运行情况。
如果配置正确 , 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 |
|
本文介绍了在 Unix/Linux 上广泛应用的实用命令和程序。随着磁盘的容量变得越来越大,要想跟踪所有的数据更加困难。只有更好的了解数据组成,进行数据分类,分析重要数据,结合工具的使用,才能低成本,高效率的进行数据备份与同步。自动化的实现同时也为数据备份与同步提供了很大的方便性,是另一种节省时间和精力并减少人工错误的方法。