server端搭建

wget  http://rsync.samba.org/ftp/rsync/src/rsync-3.0.7.tar.gz
tar xf rsync-3.0.7.tar.gz
cd rsync-3.0.7
./configure --prefix=/usr/local/rsync
make && make install
修改配置文件
vim /etc/rsyncd.conf
#全局设置
uid = root #守护进程所属的uid,默认是nobody,可能会碰到文件或目录权限问题,可以用root
gid = root
port = 873 #指定监听端口,默认是873,可以自己指定
use chroot = no
max connections = 30
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock 设置rsync运行时lock文件的位置
log file = /var/log/rsyncd.log #记录传输文件的日志
transfer logging = yes #记录传输文件的日志
log format = %t%a%m%f%b #日志格式
syslog facility = local3 #日志级别
timeout = 300
ignore errors = yes #是否忽略错误
list = no #当查看服务器上提供了哪些目录时是否列出来,no比较安全

#模块定义
#主要是定义服务器哪个目录要被同步。
#每个模块都要以[name]形式。这个名字就是在 rsync 客户端看到的名字。
#但是服务器真正同步的数据是通过 path 指定的。可以依次创建多个模块。
#每个模块要指定认证用户、密码文件,但排除并不是必须的。
[script]
read only = yes  #只读,也就是客户端只能下载,不能上传
#write only = yes #只写选择,只让客户端到服务器上写入
path = /root/script #需要同步的路径
comment = script #本模块注释,可选
auth users = test  #认证的用户
secrets file = /etc/rsync.pas  #密码文件路径
hosts allow = 172.96.248.250  #允许访问的IP,可以指定单个IP,也可以指定整个网段,能提高安全性。格式是 ip 与 ip 之间、ip 和网段之间、网段和网段之间要用空格隔开;
exclude = error_log httpd.pid #忽略的文件或目录

[web]
read only = yes
path = /data/www
comment = web
auth users = test
secrets file = /etc/rsync.pas
hosts allow = 172.96.248.250 #白名单
hosts deny = ipaddress/netmask   #黑名单

此处需要注意:
(1)默认规则为允许访问,二者都不出现时
(2)只出现hosts allow:定义白名单;但没有被匹配到的由默认规则处理,即为允许
(3)只出现hosts deny:定义黑名单;出现在名单中的都被拒绝
(4)二者同时出现,先检查hosts allow,如果匹配就allow,否则,检查hosts deny 如果匹配则拒绝,如二者均无匹配,则使用默认的,即允许

vim /etc/rsync.pas
test:12345 #账号密码

chmod 600 /etc/rsync.pas
启动服务端rsync
  1. /usr/local/rsync/bin/rsync --daemon --config=/etc/rsyncd.conf 默认监听873端口
  2. xinet方式启动
1).修改 /etc/services,加入以下内容,如果已经有可以不加,如果端口改了,需要改掉 873 端口为指定端口

rsync  873/tcp  # rsync 
rsync  873/udp  # rsync

2).修改 /etc/xinetd.d/rsync,主要是要打开rsync這個daemon, 一旦有rsync client要连接時, xinetd会把它转介給 rsyncd(port 873)。
service rsync
{
    disable = no
    socket_type     = stream
    wait            = no
    user            = root
    server          = /usr/bin/rsync
    server_args     = --daemon --config=/etc/rsynd.conf
    log_on_failure  += USERID
}

3).重启 xinetd
service xinetd restart

client端安装配置

yum install rsync -y #如果yum安装的版本不行,则用源码安装并配置环境变量即可
vim /etc/rsync.pas
123456 #密码
chmod 600 /etc/rsync.pas
rsync -aP --delete /root/script [email protected]::script --password-file=/etc/rsync.pas

rsync 选项

-n:测试,在不确定命令是否能按照意愿执行时,务必要实现测试
-q:--quiet,静默模式
-P |--partial 保留那些因故没有完全传输的文件,以是加快随后的再次传输。
-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD。
-z, --compress 对备份的文件在传输时进行压缩处理。
-v, --verbose 详细模式输出。
-q, --quiet 精简输出模式。
-r, --recursive 对子目录以递归模式处理。
-l, --links 保留软链结。
-p, --perms 保持文件权限。
-o, --owner 保持文件属主信息。
-g, --group 保持文件属组信息。
-t, --times 保持文件时间信息。
-D, --devices 保持设备文件信息。
-e, --rsh=command 指定使用rsh、ssh方式进行数据同步。
--rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息。
--delete 删除那些接收端还有而发送端已经不存在的文件。
-R, --relative 使用相对路径信息。
-c, --checksum 打开校验开关,强制对文件传输进行校验。
-u, --update 仅仅进行更新,也就是跳过所有已经存在于DST,并且文件时间晚于要备份的文件,不覆盖更新的文件。
--address 绑定到特定的地址。
--config=FILE 指定其他的配置文件,不使用默认的rsyncd.conf文件。
--port=PORT 指定其他的rsync服务端口。
--progress:显示进度条

rsync基于ssh同步

rsync  -aP  --delete  [email protected]:/data/www/webapps  /data/www/webapps
#如果想每次同步不输入密码,需要做Linux主机之间免密码登录。
#如果ssh端口不是22,则需要使用如下方式执行
rsync -aP -e 'ssh -p 27209' [email protected]:/root/script  /root/script3

如果遇到该报错

bash: rsync: command not found
rsync: connection unexpectedly closed (0 bytes received so far) [receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(600) [receiver=3.0.6]

请在两台服务器上都执行yum install rsync -y,或者源码安装完后,做一个软连接,让rsync命令能在PATH路径中找到

注意点

1、如果使用命令时只指定源而不指定目标,仅会将源以列表的形式显示而不同步

2、rsync命令使用中,如果源参数的末尾有斜线,只会复制指定目录的内容,而不复制目录本身,没有斜线,则会复制目录本身,包括目录

rsync实时同步配置

rsync+inotify

Rsync安装完毕后,需要安装inotify文件检查软件。同时为了同步的时候不需要输入密码,这样可以使用ssh免密钥方式进行同步。

  • inotify安装
wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
tar xf inotify-tools-3.14.tar.gz
cd inotify-tools-3.14
./configure
make && make install
  • 监控脚本

#写一个脚本时刻监控同步目录的变化:
vim auto_inotify.sh
#!/bin/sh  
src=/data/webapps/www/
des=/var/www/html/
ip=192.168.0.11
inotifywait -mrq --timefmt '%d/%m/%y-%H:%M' --format '%T %w%f' -e modify,delete,create,attrib ${src} | while read file  
do
  rsync -aP --delete $src root@$ip:$des    
done

#后台一直执行
nohup sh auto_inotify.sh &