1.rsync简介
rsync 是一个快速增量文件传输工具,它可以用于在同一主机备份内部的备分,还可以把它作为不同主机网络备份工具之用。rsync使用"rsync算法"来使源端和目的端两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。
2.rsync命令的使用格式是:
rsync [option] source destination #其中source是数据源,destination是数据备份的目的地址
具体使用方式有:
rsync [OPTION] SRC DEST #本地目录同步 rsync [OPTION] SRC [USER@]HOST:DEST #使用ssh协议将本地文件同步到远程主机上,使用的是: rsync [OPTION] [USER@]HOST:SRC DEST #使用ssh协议将远程文件同步到本地主机上,使用的是: rsync [OPTION] [USER@]HOST::SRC DEST #将rsync服务器上的文件同步到本地主机上,使用的是:: rsync [OPTION] SRC [USER@]HOST::DEST #将本地的文件同步到rsync服务器上,使用的::
3.rsync同步算法简介
rsync的同步算法描述如下:
假定在SRC端有文件A,DEST端有文件B,使用rsync工具来同步这两端,具体算法描述如下:
1、DEST将文件B分割成一组不重叠的固定大小为S字节的数据块,最后一块可能会比S小。
2、DEST对每一个分割好的数据块执行两种校验:一种是32位的滚动弱校验,另一种是128位的MD4强校验。
3、DEST将这些校验结果发给SRC。
4、SRC通过搜索文件A的所有大小为S的数据块,来寻找与文件B的某一块有着相同的弱校验码和强校验码的数据块。
5、SRC发给DEST一串指令来生成文件A在DEST上的备份。这里的每一条指令要么是对文件B已经拥有某一个数据块而不须重传的证明,要么是一个数据块,这个数据块肯定是没有与文件B的任何一个数据块匹配上的。
4.rsync的使用方法
rsync有三种使用方式:
(1)本地同步
rsync可以在同一台主机上进行文件夹的同步。使用方法和cp命令几乎一样。举例如下:
rsync -av /etc /tmp #将/etc的数据备份到/tmp/etc中(2)使用其他的协议(例如ssh,rsh等)进行主机间的数据网络同步
rsync可以通过ssh或rsh的协议通道在server和client之间进行数据的同步传输。举例如下:
rsync -av -e ssh user@remotehost:/etc /tmp #将远程主机remotehost的/etc数据备份到本地主机的/tmp内 rsync -av -e ssh /etc user@remotehost:/tmp #将本地的/etc数据备份到远程主机remotehost的/tmp内备注:如果不加上-e选项也可以,默认使用的ssh的协议通道。
(3)使用rsync自身的server/client的结构来实现不同主机上的数据同步
我们可以直接使用rsync自身搭建起来的server/client结构来同步数据,但是我们需要配置rsync的服务端和客户端。详细的配置步骤如下:
A)rsync服务端的配置
步骤一:安装rsync工具
步骤二:创建/etc/rsyncd.conf文件,并作一定的配置填写,配置信息类似如下:
uid = root gid = root use chroot = no strict modes = yes address = 10.8.5.25 //指定本机IP地址,可以不设 port = 873 //指定rsync服务端口,默认是873 max connections = 10 //最大连接数 pid file = /var/run/rsyncd.pid //告诉进程,写到/var/run/rsyncd.pid中 motd file=/etc/rsyncd.motd //服务器信息文件,需算自行创建,可不设 lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log [home] //模块名称,即同步或备份的目录,客户端用这个关键字连接 path=/home //指定文件目录所在位置 comment = this is a test ignore errors //忽略IO错误 read only = yes //只读,不让客户端上传文件到服务器端 list = no auth users = root //登录用户,必须是服务器上存在的真实用户,多个用户用逗号隔开 secrets file = /etc/rsyncd.pas //密码文件,需自行创建 hosts allow = 10.8.5.24 //允许访问的客户端 hosts deny=* //禁止访问的客户端步骤三:创建/etc/rsyncd.pas文件,并作一定的配置填写,配置信息类似如下:
root:123456 #配置客户端登录服务端的用户密码值得注意的是,需要将 /etc/rsyncd.pas的权限修改为600,这一步很重要,要是不修改,客户端尝试连接时会报错。
步骤四:创建并编辑/etc/rsyncd.motd文件,该文件是定义服务器信息的,用于标识服务器,用户登录时会看到该信息,类似于欢迎信息。
步骤五:启动rsync服务器, 参见<<linux中的daemon进程>>
B)rsync客户端的配置
步骤一:安装rsync工具
步骤二:创建/etc/rsyncd.conf,内容为空也是可以的。否则会报错。
步骤三:创建并编辑rsyncd.pas文件,用于存放登录用户的登录密码,这样可以在使用rsync客户端的时候无需交互式地输入验证密码。如果没有此文件,每次使用rsync命令时,都会提示输入用户密码。
备注,rsync客户端发起同步的命令举例:
rsync -azvr --progress –delete --password-file=/etc/rsyncd.pas root@10.8.5.25::home /home/backup #其中home是服务端/etc/rsyncd.conf文件中配置的模块名称,注意主机名和模块名中间的2个冒号 #此命令表示将远程主机10.8.5.25的home模块同步到本地的/home/backup目录中。 当rsync服务器上的数据被毁坏后,可以使用本地的备份的数据来恢复远程rsync服务器的数据。命令使用方法是: rsync -azvr --progress --password-file=/etc/rsyncd.pas /home/backup root@10.8.5.25::home
值得注意的是,rsync的三种同步用法,不管是第一次同步还是之后的增量同步,都要手动的触发rsync同步命令。在实际的同步备份任务中,我们需要配合例行化调度任务来实现定时增量备份的工作。因此,如果要实时地同步,就可以考虑inotify+rsync解决方案,见下。
5.rsync命令常用的选项:
-v 打印rsync命令执行的过程信息
-q 与-v相反
-r 目录递归复制
-a 相当于rysnc命令的-rlptgoD的综合体,表示递归同步,并保持所有文件和目录的权限和属性等。
--delete 如果rsync服务端删除了某一文件,那么rsync客户端也会删除这一文件。
--progress 类似于-v选项
-z 将上此选项,rsync服务端和客户端在传输数据时会进行数据压缩
--bwlimit=num rsync的传输限速,默认单位是KBps
-l 对于软链接文件,rsync同步之后还是软链接
-L 对于软链接文件,rsync会将软链接指向的文件,直接同步过来。
6.inotify+rsync实时同步解决方案
inotify(inode notify),inotify是一种文件变化通知机制,Linux内核从2.6.13开始引入。inotify为用户态应用程序提供了文件系统通告机制,通过inotify可以实时了解文件系统发生的所有变化。例如它可以监控文件访问事件、文件修改事件、文件打开事件以及文件删除事件等等。然后inotify仅是内核提供的一种系统功能,用户如果需要使用该功能,还需要安装用户态应用软件。在centos系统中可以使用inotify-tools来实现文件系统的实时监控,inotify-tools提供了两个应用程序可以使用,即inotifywait和inotifywatch。
如下为一个用inotify+rsync配合的一个实时同步的脚本:
#!/bin/bash export PATH=/bin:/usr/bin:/usr/local/bin SRC=/web_data/ DEST1=web1 DEST2=web2 Client1=192.168.0.102 Client2=192.168.0.103 User=tom Passfile=/root/rsync.pass [ ! -e $Passfile ] && exit 2 #wait for change inotifywait -mrq --timefmt '%y-%m-%d %H:%M' --format '%T %w%f %e' --event modify,create,move,delete,attrib, $SRC | while read line do echo "$line" > /var/log/inotify_web 2>&1 /usr/bin/rsync -avz --delete --progress --password-file=$Passfile $SRC ${User}@Client1::$DEST1 >> /var/log/sync_web1 2&>1 /usr/bin/rsync -avz --delete --progress --password-file=$Passfile $SRC ${User}@Client2::$DEST2 >> /var/log/sync_web2 2&>1 done
学习资料来源于:
http://sunshyfangtian.blog.51cto.com/1405751/484945