rsync两种模式:远程shell模式和rsync守护进程模式;每种模式下又分为推和拉同步方式。语法如下。
Access via remote shell:
  Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
  Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
Access via rsync daemon:
  Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
        rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
  Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
        rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
rsync 安装:
 源码可以编译可以看README这个文件
 yum install rsync -y
rsync的选项
都是常用选项,想全面可以man下就能把所以的选项显示出来。
-v, --verbose 详细模式输出
-q, --quiet 精简输出模式
-c, --checksum 打开校验开关,强制对文件传输进行校验
-r, --recursive 对子目录以递归模式处理
-R, --relative 使用相对路径信息
-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。
--backup-dir 将备份文件(如~filename)存放在在目录下。
-suffix=SUFFIX 定义备份文件前缀
-p, --perms 保持文件权限
-o, --owner 保持文件属主信息
-g, --group 保持文件属组信息
-D, --devices 保持设备文件信息
-t, --times 保持文件时间信息
-S, --sparse 对稀疏文件进行特殊处理以节省DST的空间
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息
-C, --cvs-exclude 使用和CVS一样的方法自动忽略文件,用来排除那些不希望传输的文件
--existing 仅仅更新那些已经存在于DST的文件,而不备份那些新创建的文件
--delete 删除那些DST中SRC没有的文件
--delete-excluded 同样删除接收端那些被该选项指定排除的文件
--delete-after 传输结束以后再删除
-P 等同于 --partial 显示备份过程
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件。(不覆盖更新的文件)
-z, --compress 对备份的文件在传输时进行压缩处理
--exclude=PATTERN 指定排除不需要传输的文件模式
--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件
--password-file=FILE 从FILE中得到密码
The --password-file option may only be used when accessing an rsync daemon.
推:
/usr/bin/rsync -auzvP /data0/web/* root@10.200.185.181:/data0/web/ 这个类似ssh一样,需要输入10.1.1.1的密码。
拉:
/usr/bin/rsync -auzvP root@10.200.185.181:/data0/web/*  /data0/web/  
上面的模式如果想实现自动化,目前我只知道使用expect,参照http://gabylinux.blog.51cto.com/1593644/891557这个就能实现。
rsync -auzvP  --password-file=/path/passwd $localdir user::remotehost/remotedir
给出一个拉复制的例子
注意配置aa.com的模块,已经rsync同步使用的账户和对应密码,及密码权限
remotedir=user.aa.com
localdir=/www/aa.com/
rsync -avzuP --password-file=/data1/bash/rsync.pas rsync@8.10.6.10::aa.com/$remotedir $localdir
当然你可以把整个同步脚本写的更人性化,更完美点,也确实能做出来,在一个论坛上已经有这方面的代码了。
补充,rsync的原理方面内容,感谢netkiller老大。
rsync_rsync
基于ssh和基于daemon的区别在于,前者会登录到(用上图例子,主机1 --->主机2)对应端上开启rsync一个进程(所有你在rsync同步时候你会发现两个进程),把对应端口告知本地,建立通道。而后在是监听rsync请求,自己处理这个过程。
rsync的滚动哈希值的设计基于Adler32算法,大致过程如下。
1、如上图,由于主机2没有A文件内容,会执行一次完全同步。下次再在主机1上执行rsync的时候,主机1按固定大小将主机1分为多块,每块都计算出一个32位的滚动哈希值和一个128位的MD4(有些也用MD5),发给主机2一端。
2、主机2一端从位置0开始按的同样块大小的滚动哈希值,查找看是否命中主机1给的某个滚动哈希值,若匹配,则表明主机2文件中的这块内容与对应的主机1中的那块内容很可能是一致的,不更新,如果不一致,则更新对应内容。
3,主机2会追加对应主机1上没有的内容。