Unix/Linux 系统自动化管理 数据备份与同步篇(3)
- UID
- 1066743
|
Unix/Linux 系统自动化管理 数据备份与同步篇(3)
数据备份与同步的自动化实现系统管理员必须执行的数据备份与同步任务大多牵涉到某种形式的系统配置,当管辖的任务比较庞大,数据量较多,但操作一样且有固定周期时,采用自动化脚本就成为必然。尤其是为多个操作系统提供支持时。
要实现自动化操作,脚本编制是必须掌握的基本技能。一个脚本由一系列命令构成,这些命令负责执行各种各样的任务。系统管理员在重复执行了几遍类似的命令后,通常就能准确地掌握要点,并希望利用脚本,将重复性的工作交给计算机去做。常用的脚本语言有 Shell,Perl,Tcl/Expect 等。
实用命令的自动化实现
本文的示例主要是通过 Shell 来实现的。Shell 是一种“解释性”语言,列出了管理员通过键盘敲入的相同命令, 并且每次执行一次这样的命令。
例如执行一条简单的 tar 命令,可以使用下面的一个简单的脚本。
清单 2. tar 自动化示例脚本1
2
| #!/bin/sh
tar -czvf backup.tar.gz /CriticalData/
|
如果我们想用其它的命令来实现数据备份,可以将以上的示例脚本中的命令部分替换掉,例如执行一条简单的 cpio 命令,可替换为下面一个简单的脚本。
清单 3. mksysb 自动化示例脚本1
2
| #!/bin/sh
find /CriticalData/ -depth | cpio -ov > backup.cpio
|
事实上我们可以通过 shell 中一些变量设置,条件测试以及流程控制语句来实现不同的需求。例如,管理员希望能够在周一到周日,通过 backup 命令做多级备份。
我们可以设置 Level 变量,当变量满足不同条件时,就可以实现多级备份。
清单 4. backup 自动化示例脚本1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| #!/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 配置文件创建 rsync.conf 作为服务器配置文件
假设我们在服务器端,设置需要备份的目录 /CriticalData, 但不需要备份 /CriticalData 目录下的 Common 目录。
先创建一个目录,用于存放 rsync 相关配置文件
创建 rsync.conf
1
| #touch /etc/rsyncd/rsyncd.conf
|
编辑 rsyncd.conf
清单 5.rsyncd.conf 配置文件
清单 5.rsyncd.conf 配置文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| 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 作为用户密码文件
1
2
| #touch /etc/rsyncd/rsyncd.secrets
#chmod 600 /etc/rsyncd/rsyncd.secrets
|
编辑 rsyncd.secrets, 格式为“用户 : 密码”
注意:rsync是服务器上存在的用户,同时将/CriticalData的使用者改为rsync
1
| #chown -R rsync /CriticalData/
|
创建 rsync.motd 作为登录消息文件
此文件是选择性配置文件,也可以不创建。
1
| #touch /etc/rsyncd/rsyncd.motd
|
编辑 rsyncd.conf
1
2
3
| ============================
This is Critical Data Server
=============================
|
- 启动 rsync将 rsync 启动
1
| #/usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf
|
可以将这个命令写入 /etc/rc.d/rc.local 中,当系统启动时,自动运行 rsync。
- 创建脚本在客户端创建一个 /root/rsync/ 目录用来存放自动化脚本和其它文件。
创建 /root/rsync/rsync.sh 自动化脚本,保证权限为 755。
清单 6. rsync 自动化示例脚本1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
| #!/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 的目录,用于存放已在服务器端删除的增量数据。目录的名称将根据脚本执行的日期定义。
1
2
3
4
| # pwd
/Backup
# ls
2009-06-16 Current
|
- 启用 cron 服务,实现定期自动备份如果系统管理员需要连续地定期地执行脚本,那么就需要借助 Unix/Linux 系统的 crontab 功能,使系统可以定期地调用 rsync.sh 脚本。
使用命令“crontab -e”编辑 crontab,添加一条类似于以下的项:
1
| 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 命令可读取这些邮件。
清单 7. 使用 mail 命令读取监控输出1
2
3
4
5
| # 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"
&
|
敲入回车,可显示具体的邮件内容。类似于:
清单 8. 邮件内容1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| 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 <root@cdlf2ler02.clusters.com>
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===========
|
|
|
|
|
|
|