linux下的rsync的使用

时间:2021-09-06 15:46:42

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