Chinaunix首页 | 论坛 | 博客
  • 博客访问: 215101
  • 博文数量: 80
  • 博客积分: 213
  • 博客等级: 入伍新兵
  • 技术积分: 435
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-27 11:13
文章分类

全部博文(80)

文章存档

2012年(46)

2011年(34)

分类:

2012-01-10 22:47:23

原文地址:使用rsync做备份 作者:《一剑》飘香

关于rsync: 
rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync。它的特性如下:
可以镜像保存整个目录树和文件系统。
可以很容易做到保持原来文件的权限、时间、软硬链接等等。
无须特殊权限即可安装。
优化的流程,文件传输效率高。
可以使用rcp、ssh等方式来传输文件,当然也可以通过直接的socket连接。
支持匿名传输,以方便进行网站镜象。
软件下载
rsync的主页地址为:
目前最新版本为3.0.8。可以选择从原始网站下载:。
 
设定rsync server
假设Server这台主机名为bk.example.com
rsync server端要设定以下3项:
1.规划建立备份目录区
2.设定主要配置文件:/etc/rsyncd.conf
3.设定密码文件:/etc/rsyncd.secrets

依次说明如下:
1.建议你准备一个容量较大且独立的分区,并在其中开好备份目录,如此/bk/server
2.设定/etc/rsyncd.conf,以下区域,代表开放给某一台rsync client主机的设定,简单模板如下:
log file = /var/log/rsyncd.log
[mch1]
  path = /bk/server/mch1_backup
  auth users = mch1_backup
  uid = root
  gid = root
  secrets file = /etc/rsyncd.secrets
  read only = no
换言之,以下模板,代表两个主机mch1及mch2要备份进来:
[mch1]
  path = /bk/server/mch1_backup
  auth users = mch1_backup
  uid = root
  gid = root
  secrets file = /etc/rsyncd.secrets
  read only = no
[mch2]
  path = /bk/server/mch2_backup
  auth users = mch2_backup
  uid = root
  gid = root
  secrets file = /etc/rsyncd.secrets
  read only = no
3.设定密码文件/etc/rsyncd.secrets:
rsyncd.secrets的内容很简单,每一行的格式为:“账号:密码”,如以下例子:
mch1_backup:thispwd
 
注意:上述密码只是一个例子
接下来,要将rsyncd.secrets这个密码文件属性设为root拥有,且权限要设为600,否则无法备份成功,执行:
chown root:root rsyncd.secrets
chmod 600 rsyncd.secrets
至此,rsync server 这端已设定完成,接着请启动rsync server
service rsync start
启动之后,要检查一下rsync server 的port 873是否已开通:
netstat -tuln |grep 873
往后,rsync server的相关活动记录或备份日志,可查看/var/log/rsyncd.log这个文件。接下来时client端(要备份的网络主机)的设定。

设定rsync client
假设这台主机的IP为:11.22.33.44
1.设定密码文件
2.测试rsync执行指令
3.将rsync指令放入工作任务(crontab)
另外,假设mch1这台主机是网络主机,今打算把/var/www这个目录备份至backup server(bk.example.com),但不想备份上传临时文件(也就是说要把uplaod目录排除),整个操作方式如下:
1.假设把密码文件放在/root/rsyncd.secrets,内容只要含有一行密码即可:
thisispwd
 
注意:rsyncd.secrets的权限属性必须设为600才行:
cd /root
chmod 600 rsyncd.secrets
2.测试指令是否成功
rsync -avHS --numeric-ids --password-file=/root/rsyncd.secrets /var/www --exclude www/upload
如果出现传输目录文件的画面,即表示成功。
3.设置工作任务,假设每天凌晨5点开始备份:
先建立备份Script文件

范例:
#!/bin/bash
#
RSYNC="/usr/bin/rsync"
para="-avHS --numeric-ids"
pwdfile="--password-file=/root/rsyncd.secrets"
user="mch1_backup"
server="bk.example.com"
block="mch1"
$RSYNC $para $pwdfile /var/www --exclude www/upload
如果有其他目录(如/home)要备份,则如此模仿,再加以下设定:
/usr/bin/rsync -avHS --numeric-ids --password-file=/root/rsyncd.secrets /home
 
范例:
#!/bin/bash
#
RSYNC="/usr/bin/rsync"
para="-avHS --numeric-ids"
pwdfile="--password-file=/root/rsyncd.secrets"
user="mch1_backup"
server="bk.example.com"
block="mch1"
$RSYNC $para $pwdfile /var/www --exclude www/upload
$RSYNC $para $pwdfile /home
执行crontab:
crontab -e
加入:
0 5 * * * /root/bk.sh
 
如果觉得一台Backup Server不够,可再按上述方法自行添加任意多台Backup Server,以分散风险!
 
安全性
1.如果是使用rsync daemon模式,建议在rsync server中使用iptables指令来限制rsync client的链接范围,如:
iptables -A INPUT -p tcp -s ! 11.22.33.44 --dport 873 -j DROP
2.如果希望在传输过程能更安全一点,可直接使用rsync和openssh来操作。这种运行方式,备份Server端就不需要启动rsync server。
首先,让Client端可以自动登录SSH.
接下来,执行以下指令进行测试:
rsync -avHS -e ssh /root/tmp
rsync 选项-e调试ssh来做链接加密的操作。如果要加上压缩文件功能,可加上选项-z.

rsync设定产生器
范例,读取使用者由命令行提供的主机名,然后自动建立服务器端和client端需要的配置文件,并建立一个安装程序install.sh,最后把整份设定目录压成.tgz的文件,供管理者上传至服务器主机和client端备用。
范例:gen_rsync.sh

#!/bin/bash
#
#变量要先声明后才能使用
shopt -s -o nounset
 
#备份服务器的主机名,将作为产生器制作的配置文件的存储目录。
server_name=${1:?'请提供备份服务器的名称,例如:bksvr'}
 
#client端要备份出去的目录,请用空格隔开
bk_dirs="/home /etc /var/lib/mysql"
#client端主机名
mach="mch1"
 
#备份服务器的完整主机名或IP
server_addr="bk.example.com"

#账号
act="$mach"_backup

#密码
pwd="thisispwd"
#server端备份存储区
BK_SAVE="/bk"
 
#rsync的参数
para="-avHS --numeric-ids"
 
#client端如果有不存在的文件,亦删去备份主机上对应的文件
#如果你要使用这样的功能,请改用这个参数
#para="-avHS --numeric-ids --delete"
 
#备份服务器的主要配置文件
server_conf="$server_name/svr/rsyncd.conf"
#备份服务器的授权账号密码文件
server_pwdfile="$server_name/svr/rsyncd.secrets"
 
#给client端执行的备份Script
client_Script="$server_name/clt/bk-$mach-to-$server_name.sh"
#client端需用到密码文件
client_pwdfile="$server_name/clt/rsyncd.secrets"
#备份client端的工作任务文件
client_cron="$server_name/clt/cron.tab"
#安装用的Script
installer="$server_name/install.sh"
 
#以client端主机名为存盘的目录
cr_client_dir() {
  if [ -f "$server_name" ] ; then
      echo "$server_name这个文件已经存在,请改名或移开它."
      exit 1
  fi
  if [ ! -d "$server_name" ] ; then
      mkdir -p "$server_name/svr"
      mkdir -p "$server_name/clt"
  fi
}
 
#建立client端需用到的密码文件
cr_client_pwdfile() {
  cat < $client_pwdfile
$pwd
EOF
  chmod 600 $client_pwdfile
}
 
#建立client端用的备份Script
cr_run_Script() {
  cat < $client_Script
#!/bin/bash
RSYNC="/usr/bin/rsync"
EOF
 
#建立备份指令
  for dir in $bk_dirs
  do
    cat <>$client_Script
\$RSYNC $para --password-file=/root/rsyncd.secrets $dir
EOF
  done
  chmod +x $client_Script
}
 
#建立client端的工作任务
cr_crontab() {
  cat < $client_cron
0 5 * * * /root/bk-$mach-to-$server_name.sh
EOF
}
 
#建立备份服务器的主要配置文件
cr_rsync_conf() {
  cat < $server_conf
log file = /var/log/rsync.log
[$mach]
  path = $BK_SAVE/$act
  auth users = $act
  uid = root
  gid = root
  secrets file = /etc/rsyncd.secrets
  read only = no
EOF
}
 
#建立备份服务器的密码文件
cr_rsync_pwdfile() {
  cat < $server_pwdfile
$act:$pwd
EOF
 
  chmod 600 $server_pwdfile
}

#建立server端的安装软件
cr_installer() {
  cat < $installer
#!/bin/bash
#
target=\${1:?"请提供要安装的对象。使用法:\$0 server 或 \$0 client"}
install_to_server() {
  cp -pf ../$server_conf /etc
  cp -pf ../$server_pwdfile /etc
  if [ ! -d "$BK_SAVE/${mach}_backup" ] ; then
    mkdir -p "$BK_SAVE/${mach}_backup"
  fi
}
 
usage() {
  echo "请提供安装的对象。使用法:\$0 server或\$0 client"
  exit 1
}
 
#主程序区
case \$target in
  server)
    install_to_server
    ;;
  client)
     install_to_client
    ;;
  *)
    usage
    ;;
esac
EOF
 
  chmod +x $installer
}
 
tar_it() {
  tar cvzf $server_name.tgz $server_name
}

#主程序区
cr_client_dir
cr_client_pwdfile
cr_crontab
cr_run_Script
 
cr_rsync_conf
cr_rsync_pwdfile
cr_installer
 
tar_it
 
阅读(1121) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~