什么是rsync:

    rsync(remote sync) 是一个Unix及类Unix系统下的一个应用软件,是一个能实现主机与主机间数据远程同步的软件。rsync中一项与其他大部分类似程序或协议中所未见的重要特性,那就是镜像功能。镜像对源数据进行一次传送后,在源数据目录中文件发生改变后,在进行rsync同步时它只传输只发生改变的数据块,这样可以大大节约带宽,所以rsync可以执行完整备份或增量备份。更棒的是,在所有风格的 UNIX 上都可以使用,包括 Mac OS X,所以很容易连接任何系统。

rsync常见的3种工作模式:

1、shell模式,也称为本地模式;使用方法与cp命令相似。

2、远程shell模式,利用SSH执行底层连接和传输;使用方法与scp命令相似。

3、服务器模式,rsync以守护进程方式运行,接收文件传输请求。在使用时,可以使用rsync命令把文件发送给守护进程,也可以向它请求文件。服务器模式非常适合创建中心备份服务器或项目存储库。

4、列表模式,与“ls”相似,会列出源的内容。

注:远程shell模式和服务器模式的差异在于,后者在源和目标名中使用两个冒号 (:)


rsync的命令使用规范:(摘自manpage)

rsync is a file transfer program capable of efficient remote update  via a fast differencing algorithm.

rsync是一个高效可靠的文件传输程序,通过快速的差分算法实现数据的远程更新。

Usage: rsync [OPTION]... SRC [SRC]... DEST       本地模式的使用

 or rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST    把本地资源通过一个特定的用户同步到远程主机上

 or rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST   把本地资源通过一个特定的用户同步到一个以服务器模式工作的rsync服务器上,这里用了两个冒号,DEST是指rsync服务器的模块名

 or rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST

 or rsync [OPTION]... [USER@]HOST:SRC [DEST]

 or rsync [OPTION]... [USER@]HOST::SRC [DEST]

 or rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

The ':' usages connect via remote shell, while '::' & 'rsync://' usages connect  to an rsync daemon, and require SRC or DEST to start with a module name.

使用一个冒号表示连接到远程shell,使用两个冒号和“rsync://”表示连接到一个以daemon运行的rsync服务器,以这种方式连接时“SRC”与"DEST"是模块的名称。

rsync命令的常用选项(OPTION):

-v, --verbose 详细模式输出

-q, --quiet 精简输出模式

-c, --checksum 打开校验开关,强制对文件传输进行校验

-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD

-r, --recursive 对子目录以递归模式处理

-l, --links 保留符号链结

-p, --perms 保留文件权限

-t, --times 保留文件时间戳

-g, --group 保留文件属组信息

-o, --owner 保留文件属主信息

-D, --devices 保留设备文件即特殊文件信息

-e, --rsh=COMMAND 指定替代rsh的shell程序

-z, --compress 对备份的文件在传输时进行压缩处理

--delete 删除目标目录下附加的文件,让目录目录与源目录保持一样

还可以使用两个选项监视传输的状态:--progress和--stats。

 --progress 显示进度条

 --stats 显示如何执行压缩和传输

实战演练部份:

实验环境:一台centos 6.4_x64主机和一台centos 5.10_x64 ,默认安装后rsync已安装,如果没有安装,用yum命令进行安装即可

nod1 ip:192.168.1.201
nod2 ip:192.168.1.200

 rsync软件版本:

[root@nod2 ~]# rpm -qa rsync
rsync-3.0.6-9.el6_4.1.x86_64
[root@nod1 ~]# rpm -qa rsync
rsync-3.0.6-4.el5_7.1

rsync的远程shell模式(可实现两个主机间目录、档案的同步):

在nod2上准备要同步到nod1上的数据目录

[root@nod2 ~]# mkdir rsyncdoc[root@nod2 ~]# cp -R /etc/pam.d rsyncdoc/
[root@nod2 ~]# ls rsyncdoc/
pam.d

把nod2上的rsyncdoc目录同步到nod1的/root/test目录下

[root@nod2 ~]# rsync -rl /root/rsyncdoc/ [email protected]:/root/test[root@nod1 ~]# ls test/pam.d[root@nod2 ~]# rsync -rl /root/rsyncdoc [email protected]:/root/test1
[root@nod1 ~]# ls test1
rsyncdoc

看见区别了吗?在同步目录时多了一个“/”与少一个“/”结果是不一样的。有“/”是同步rsyncdoc这个目录下的目录及档案,如果没有“/”是同步rsyncdoc这个目录。


删除nod1上/root/test1/rsyncdoc/pam.d/passwd文件,再执行1中的rsync命令,passwd文件会存在吗?

[root@nod1 ~]# rm -f test1/rsyncdoc/pam.d/passwd
[root@nod2 ~]# rsync -rl /root/rsyncdoc [email protected]:/root/test1
[root@nod1 ~]# ls test1/rsyncdoc/pam.d/ | grep passwd
passwd

可见passwd被同步过来,与cp命令的区别是rsync只是同步了这一个文件,如果复制syncdoc这个目录到目标,那全部的文件都会被覆盖,当然passwd这个文件也会被复制过来,但两者实现的原理不一样,由于rsync只是同步了一个文件,那效率当然要比cp的效率高。


在nod1上复制/etc/fstab文件到/root/test1/rsyncdoc目录下,请问再执行1中的rsync命令后,fstab文件是否存在?

[root@nod1 ~]# cp /etc/fstab test1/rsyncdoc/
[root@nod1 ~]# ls test1/rsyncdoc/
fstab pam.d
[root@nod2 ~]# rsync -rl /root/rsyncdoc [email protected]:/root/test1
[root@nod1 ~]# ls test1/rsyncdoc/
fstab pam.d
root@nod2 ~]# rsync -rl --delete /root/rsyncdoc [email protected]:/root/test1
[root@nod1 ~]# ls test1/rsyncdoc/
pam.d

可见在不加“--delete”这个参数时,同步后目标目录下的fstab档案是存在的,但有“--delete”这个参数后,会删除目标中多余的文件,目标目录和源目录保持完全相同。

rsync的服务器模式:

    以服务器模式运行时,客户机与服务器间的数据传输是明文传输,可加入用户验证机制,只能用在一些对安全性要求不高的场景。

nod1 ip:192.168.1.201作为服务端,nod2 ip:192.168.1.200作为客户端

服务器端的设置:

[root@nod1 ~]# mkdir /etc/rsyncd
[root@nod1 ~]# echo "This is a rsync server." > /etc/rsyncd/rsyncd.motd
[root@nod1 ~]# echo "rsync1:111111" > /etc/rsyncd/rsyncd.secrets
[root@nod1 ~]# echo "rsync2:111111" >> /etc/rsyncd/rsyncd.secrets
[root@nod1 ~]# cat /etc/rsyncd/rsyncd.secrets
rsync1:111111
rsync2:111111
[root@nod1 ~]# chomd 600 /etc/rsyncd/rsyncd.secrets   #这一步很重要,不然不能完成同步操作
[root@nod1 ~]# vi /etc/rsyncd.conf

uid = root
gid = root
use chroot = yes
read only = yes
hosts allow=192.168.1.0/255.255.255.0
max connections = 5
motd file = /etc/rsyncd/rsyncd.motd
log file = /var/log/rsync.log
transfer logging = yes
log format = %t %a %m %f %b
syslog facility = local3
timeout = 300
[home]
path = /home
list = no
ignore errors
auth users = rsync1
secrets file = /etc/rsyncd/rsyncd.secrets
comment = linuxsir home
exclude = samba/
[opt]
path = /opt
list = yes
ignore errors
auth users = rsync2
secrets file = /etc/rsyncd/rsyncd.secrets

[root@nod1 ~]# rsync --list-only 192.168.1.201:: #列出本地服务器哪些模块可以同步(配置文件中"list = yes")
This is a rsync server.
opt      linuxsir opt

客户端同步操作:

[root@nod2 ~]# rsync -avzP [email protected]::opt /tmp/test
This is a rsync server.
Password:
输入密码后即可完成同步。

客户端免密码同步设置:

[root@nod2 ~]# echo "111111" > rsync2.passwd
[root@nod2 ~]# chmod 600 rsync2.passwd
[root@nod2 ~]# rsync -avzP --password-file=rsync2.passwd [email protected]::opt    /tmp/test

利用crontab自动完成同步任务:

场景1:当一服务器上的数据非常重要,需要定期对数据进行备份,并且想每次作的备份都想在服务器上的数据丢失后直接从备份数据中拿来就可以使用,那每次的备份就是对服务器数据做了一个镜像,即完成备份。那这样的场景我们可以用以下的脚本来完成。

[root@nod2 ~]# mkdir /etc/rsyncd
[root@nod2 ~]# vim /etc/rsyncd/autoback.sh
#!/bin/sh
#linux home backup
/usr/bin/rsync -avzP --delete --password-file=/etc/rsyncd/rsync2.passwd [email protected]::home /data/$(date +'%m-%d-%y')   #这里的“--delete”可以省掉

[root@nod2 ~]# echo "111111" > /etc/rsyncd/rsync2.passwd
[root@nod2 ~]# chmod 600 /etc/rsyncd/rsync2.passwd
[root@nod2 ~]# chmod 755 /etc/rsyncd/autoback.sh
[root@nod2 ~]#  crontab -e
5 11 * * * /usr/bin/run-parts /etc/rsyncd 1> /dev/null    #在设定时间点用run-parts把/etc/rsyncd目录下的可执行文档抓取出来执行
格式为
分 时 日 月 周
[root@zhaochj rsyncd]# service crond restart

场景2:如果是要保持两服务器的数据的一致性,每一次数据同步后,源与目标的数据都是一样的,那只要适当的修改上边的脚本,把“$(date +'%m-%d-%y')”删除即可。