rsync(Remote Synchronize)是Unix/linux系统下一个快速、非常灵活的的文件同步和复制工具,支持本地复制和远程复制与同步,rsync使用著名的三角传输(delta-transfer)算法,只同步源文件和目标中现有文件之间有差异的部分,并且可以保持原文件的权限、时间、软硬链接等属性,rsync工具广泛用于备份和镜像,且作为一种改进的复制命令。
Rsync默认情况下,需要使用“quick check”算法,仅同步对于大小或最后一次修改时间已更改的文件,其他的文件属性保存,在目标文件的属性没有任何更改前,通过“quick check”,表明该文件的数据并不需要更新。
Note:rsync描述参考与官方站点http://rsync.samba.org/ftp/rsync/rsync.html
a)可以镜像保存整个目录树和文件系统;
b)文件同步复制时,可以保持文件原有的属性;
c)并不需要超级用户的权限
d)快速:第一次同步时会复制全部内容,下一次同步时只传输文件属性被修改过的文件;
e)安全:可以使用scp,ssh等方式来传输文件,当然也可以通过直接的socket连接;
f)支持匿名传输,以方便进行网站镜像;
Note:
1、开发人员上传论坛、网站更新代码至测试服务器,并以邮件通知相关的负责人;
2、相关负责人员收到邮件后,共同测试更新代码是否正常;
3、测试结果若正常,则运维人员执行svn更新,否则返回(反馈测试结果);
4、rsync通过‘quick check’算法检查到源文件与目标文件之间的属性差异,完成同步;
备注:此篇文档暂时利用crontab计划任务同步文件,后期会说到inotify+rsync。
# CentOS系统
[root@Rsync_Server ~]#rpm -qa | grep rsync #查询rsync是否安装
rsync-3.0.6-9.el6.x86_64
[root@Rsync_Server ~]#yum install rsync #安装rsync
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
c6-media| 4.0 kB00:00 ...
Setting up Install Process
Package rsync-3.0.6-9.el6.x86_64 already installed andlatest version
# Ubuntu系统
root@exiuxiu-web2:~# dpkg -l | grep rsync #查询rsync是否安装
iirsync3.0.9-1ubuntu1fast,versatile, remote (and local) file-copying tool
root@exiuxiu-web2:~# apt-get install rsync
Reading package lists... Done
Building dependency tree
Reading state information... Done
rsync is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 116 notupgraded. #安装rsync
[root@Rsync_Server ~]#rsync -avzP files.bz2 /tmp/ #本地复制
sending incremental file list
files.bz2
785100%0.00kB/s0:00:00 (xfer#1, to-check=0/1)
sent 863 bytesreceived 31 bytes1788.00bytes/sec
total size is 785speedup is 0.88
[root@Rsync_Server ~]# rsync -avzP files.bz2 [email protected]:/tmp #远程复制
[email protected]'s password:
sending incremental file list
files.bz2
785100%0.00kB/s0:00:00 (xfer#1, to-check=0/1)
sent 863 bytesreceived 31 bytes198.67bytes/sec
total size is 785speedup is 0.8
Note:安装Rsync软件之后,系统并不会自动生成服务的配置文件,需手动创建,步骤如下所示:
[root@Rsync_Server ~]# vim /etc/rsyncd.conf
uid = root
gid = root
use = chroot no
max connections = 3000
timeout = 300
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
[site]
path = /rsync/data
read only = false
ignore errors
list = true
hosts allow = 192.168.8.0/24
hosts deny = 0.0.0.0/24
auth users = rsync_nobody
secrets file = /etc/rsyncd.passwd
[root@Rsync_Server ~]# mkdir /rsync/data/-pv #递归创建
[root@Rsync_Server ~]# touch/rsync/data/index.html
[root@Rsync_Server ~]# vim /etc/rsyncd.passwd
rsync_nobody:admin
##提示:
客户端同步时,需要提供的验证文件,命名规则【用户:密码】。
[root@Rsync_Server ~]# chmod 600 /etc/rsyncd.passwd
[root@Rsync_Server ~]# rsync �Cdaemon #以守护进程的方式运行
[root@Rsync_Server ~]# netstat -lntp | grep rsync
tcp00 0.0.0.0:8730.0.0.0:*LISTEN43081/rsync
tcp00 :::873:::*LISTEN43081/rsync
[root@web1 ~]# vim /etc/rsyncd.passwd
admin
~
[root@web2 ~]# vim /etc/rsyncd.passwd
admin
~
#客户端web1
[root@web1 ~]# rsync -avzP --delete --progress [email protected]::site/--password-file=/etc/rsyncd.passwd /rsync/data/ #拉取
receiving incremental file list
./
index.html
45100%4.88kB/s 0:00:00 (xfer#1, to-check=0/2)
sent 78 bytesreceived 199 bytes554.00bytes/sec
total size is 45speedup is 0.16
[root@web1 ~]# tree /rsync/data/
/rsync/data/
¤¤ index.html
0 directories, 1 file
#客户端web2
[root@web2 ~]# rsync -avzP --delete --progress [email protected]::site/--password-file=/etc/rsyncd.passwd /rsync/data/ #拉取
receiving incremental file list
./
index.html
45100%21.97kB/s0:00:00 (xfer#1, to-check=0/2)
sent 78 bytesreceived 199 bytes554.00bytes/sec
total size is 45speedup is 0.16
[root@web2 ~]# tree /rsync/data/
/rsync/data/
¤¤ index.html
0 directories, 1 file
#客户端web1
[root@web1 data]#rsync -avzP --progress --password-file=/etc/rsyncd.passwd/rsync/data/ [email protected]::site/
sendingincremental file list
./
a
0 100%0.00kB/s0:00:00 (xfer#1, to-check=5/7)
b
0 100%0.00kB/s0:00:00 (xfer#2, to-check=4/7)
c
0 100%0.00kB/s0:00:00 (xfer#3, to-check=3/7)
d
0 100%0.00kB/s0:00:00 (xfer#4, to-check=2/7)
e
0 100%0.00kB/s0:00:00 (xfer#5, to-check=1/7)
f
0 100%0.00kB/s0:00:00 (xfer#6, to-check=0/7)
sent 299bytesreceived 125 bytes848.00 bytes/sec
total size is0speedup is 0.00
#客户端web2
[root@web2 ~]#rsync -avzP --progress --password-file=/etc/rsyncd.passwd/rsync/data/ [email protected]::site/
sending incrementalfile list
./
a
0 100%0.00kB/s0:00:00 (xfer#1, to-check=5/7)
b
0 100%0.00kB/s0:00:00 (xfer#2, to-check=4/7)
c
0 100%0.00kB/s0:00:00 (xfer#3, to-check=3/7)
d
0 100%0.00kB/s0:00:00 (xfer#4, to-check=2/7)
e
0 100%0.00kB/s0:00:00 (xfer#5, to-check=1/7)
f
0 100%0.00kB/s0:00:00 (xfer#6, to-check=0/7)
sent 281bytesreceived 125 bytes812.00 bytes/sec
total size is0speedup is 0.00
##提示:
rsync server端,配置文件rsyncd.conf中,uid,gid指定的site模块传输文件时所用的用户身份,那么需要为用户授权,超级管理员除外。
#客户端web1
[root@web1 data]#crontab -e
# auto sync sitefile
* * * * * /usr/bin/rsync-avzP --delete --progress --password-file=/etc/[email protected]::site /rsync/data/ > /dev/null 2>&1
#客户端web2
[root@web2 ~]#crontab -e
#auto sync sitefile
* * * * * /usr/bin/rsync-avzP --delete --progress --password-file=/etc/[email protected]::site /rsync/data/ > /dev/null 2>&1
#客户端web1
#客户端web2
#备注:
通过crontabl计划任务同步文件,两端的数据有一分钟的时间差距,数据肯定不能完全一致,你自己可以编写脚本让程序一直运行,也可以通过inotify+rsync的方式实时同步文件,此篇文档若有不足之处,请大家评论出来,感谢。