简介

  Rsync (remote sync)是一款开源、快速,多功能、可实现增量的本地或远程数据镜像同步备份优秀工具。它可通过 LAN/WAN 快速同步多台主机间的文件。rsync 当前由 rsync.samba.org 维护。rsync 使用所谓的“rsync演算法”来使本地和远程主机之间的文件达到同步,该算法只传送两个文件中的不同部分,而不是每次都整份传送,因此速度相当快。

特点:
  1、可以镜像保存整个目录树或文件系统;
  2、可实现增量同步,既只同步发生变化的数据,因此数据传输效率很高;
  3、可以借助于ssh实现安全数据传输,也可以通过直接的socket连接。;
  4、
支持匿名的或认证的进程模式传输,方便进行数据备份及镜像

rsync命令的工作模式:

  1、shell模式:也称作本地模式,类似cp;
  2、远程shell模式:可以利用ssh协议承载其远程传输过程;
  3、列表模式:仅列出源中的内容,使用选项-nv即可,类似ls;不仅可以看本地还可以看远端。
  4、服务模式:此时rsync工作为守护进程,能接收客户端的数据同步请求;在使用时,可以在客户端使用rsync命令把文件发送给守护进程,也可以向服务器请求获取文件。服务器模式非常适合创建中心备份服务器或项目存储库。

rsync命令的选项:
  -n: 同步测试,不执行真正的同步过程;
  -v:  --verbose,详细输出模式
  -q: --quiet, 静默模式
  -c:  --checksum,开启校验功能,强制对文件传输进行校验
  -r:  --recursive,递归复制;

注意:rsync命令中,如果源路径是目录,且给复制路径时末尾有/,则会复制目录中的内容,而非目录本向;

     如果末尾没有/,则会同步目录本身及目录中的所有文件;目标路径末尾是否有/无关紧要;

  -a: --archive,归档,保留文件的原有属性;等同于-rlptgoD,使用此选项常用
   -p:perms, 保留文件的权限;
   -t: times,保留文件的时间戳;
   -l: links,保留符号链接
   -g: 保留文件的属组
   -o: owner保留属主
   -D:保留设备文件

  -e ssh: 使用ssh作为传输承载;如果ssh端口不是22,可以用-e ‘ssh -p 522’ 
  -z: 压缩后传输;

  --progress: 显示进度条
  --stats: 显示如何执行压缩和传输
  --existing # 不同步新文件,只同步已存在目的端的文件
  --ignore-existing # 不更新已存在文件,只同步新文件
  --delete # 目的端删除源端不存在的文件,即保持和源端一致
  --delete-before # 默认删除策略,同步前删除目的端文件
  --delete-after # 删除策略,同步后删除目的端文件
  --delete-excluded # 专门指定需在目的端删除的文件,后跟--exclude选项
  --exclude=PATTERN # 源端匹配PATTERN模式的文件,屏蔽其同步
  --exclude-from=FILE # 从文件中读取PATTERN
更多的详细信息,请通过man rsync来进行查看。

rsync的服务器模式:

   rsync的服务模式,部署时分为rsync的服务端和rsync的客户端。需要注意的是,rsync 的服务端和客户端都是一个软件包,如果你启用了 rsync 的服务模式,则该主机就变成 rsync 服务器。因此我们需要将 rsync 分别安装于服务端和客户端,服务端和客户端使用同一个 rsync 软件包来实现远程镜像和定期同步更新。
    rsync 服务端可同时备份多个客户端的数据,多个服务端备份一个客户端的数据。rsync 默认端口为 873,服务器在该端口接收客户的匿名或者认证方式的备份请求。
    rsync 服务端在使用之前需要进行必要的配置,其配置文件为 /etc/rsyncd.conf,该文件默认没有,需要自己手动创建。rsync服务端通过/etc/rsyncd.conf进行认证、访问、日志记录等控制,该配置文件包括全局参数、模块参数等设置。

实验环境:a、防火墙iptables与Selinux已关闭        b、操作系统CentOS6.5-X86_64

1、设定rsync服务器端,安装xinted服务
    # yum -y install xinetd

2、为rsync提供配置文件
    /etc/rsyncd.conf

    配置文件分两段:
    全局配置段:1个
    共享配置段:多个           
        [SHARE_NAME]

配置示例:

创建配置文件

# vim /etc/rsyncd.conf

1 # Global Settings 2 uid = nobody # 运行rsync的用户gid = no 3 body # 运行rsync的组 4 port=873 # 默认端口,可以修改 5 use chroot = no # 关闭chroot;默认为true,修改为no,增加对目录文件软连接的备份 6 max connections = 10 # 最大连接数,超过限制的连接请求将被告知随后再试。默认值为 0,即没有限制。 7 strict mode = yes # 开启对密码文件权限的严格限制,不能被除rsync运行用户以外的用户访问,即密码文件权限一般得是600 8 pid file = /var/run/rsyncd.pid # pid文件 9 log file = /var/log/rsyncd.log # 日志文件 10 11 # Directory Settings 12 [tools] # 对于备份目录的模块名,在同步时使用 13 path = /data # 需备份的数据目录 14 ignore errors = yes # 同步时,忽略错误 15 read only = no # 非只读 16 write only = no # 非只写 17 hosts allow = 172.16.0.0/16 # 访问控制,允许访问的来源IP段 18 hosts deny = * # 访问控制,不允许访问的来源IP,此处*代表全部 19 list = false # 不允许列出目录 20 uid = root # 会覆盖global settings的相关配置 21 gid = root # 同上 22 23 ######## 服务端启用用户认证的功能 ######## 24 auth users = tom,jerry # 允许同步数据的用户名的列表,是以逗号分隔且与密码文件对应的用户名。 25 secrets file = /etc/rsyncd.passwd # 密码文件所有处

3、创建密码文件

vim /etc/rsyncd.passwd
# 格式:username:password
# vi /etc/rsyncd.passwd
  tom:123456
  jerry:123456 

# chmod 600 /etc/rsyncd.passwd

注意:此文件不能允许其它用户有访问权限,且密码不能超过8个字符,每一行一个用户;

 

4、启动服务

  # chkconfig rsync on
  # service xinetd start

 :rsync被xinetd调用后监听在873/tcp端口

客户端配置

客户端也必须配置密码文件,该文件里面仅存放密码即可

格式:password
# vim  /etc/rsyncd.passwd
   123456
   123456

# chmod 600 /etc/rsyncd.passwd

 

rsync 在服务器端以doemon形式存在时,客户端同步文件的命令
 Pull: 拉取
  rsync [OPTION...] [USER@]HOST::SRC... [DEST]
  rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
  例如:
  # rsync -arv --password-file=/etc/rsyncd.passwd tom@172.16.19.11::tools /tmp
  # rsync -arv --password-file=/etc/rsyncd.passwd rsync://tom@172.16.19.11/tools /tmp

Push: 推送
   rsync [OPTION...] SRC... [USER@]HOST::DEST
   rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST    
  例如:
  # rsync -va --password-file=/etc/rsyncd.passwd /root/install.log tom@172.16.19.11::tools
  # rsync -va --password-file=/etc/rsyncd.passwd /root/install.log rsync://tom@172.16.19.11/tools


在客户端,使用周期性任务计划crontab;

   在生产环境中,我们可以专门部署一台rsync服务器,专门负责接收业务服务器的日志归档和配置文件归档。我们也可以让一台web服务器专门用来做分发的时候。 但是我们知道,我们的日志归档都是在凌晨,因此我们不可能天天晚上去做向rsync服务端的推送操作。并且,如果日常web内容做分发的次数频繁的话,我们不可能每时每刻都盯着它去做手动推送。因此我们可以借助crontab计划任务来实现定时推送。

# crontab -e
*/10 * * * * /usr/bin/rsync -a --password-file=/etc/rsyncd.passwd tom@172.16.19.11::tools  /data &>/dev/null

rsync+inotify实现数据实时同步

简介

    rsync的传输效率是很高的,但rsync也有缺点,最大的问题就是每次执行rsync命令都会遍历目标目录,当文件不多时,这没什么问题,一旦文件数到了一定规模,那么每次遍历都会消耗很多资源,如果只对经常改动的目录进行同步,也可以忽略这个问题,如果每次改动的目录多较大,那么就要用到inotify了,Inotify是一种强大的、细粒度的、异步的文件系统事件监控机制,Linux内核从2.6.13起,加入了对Inotify的支持,通过Inotify可以监控文件系统中的添加、删除、修改、移动等各种事件

    inotify是Linux核心子系统之一,做为文件系统的附加功能,它可监控 文件系统并将异动通知应用程序。inotify的主要应用于桌面搜索软件,得以针对有变动的文件重新索引,而不必没有效率地每隔几分钟就要扫描整个文件系统。相较于主动轮询文件系统,通过操作系统主动告知文件异动的方式,可以在文件更动后一秒内更新索引。此外,诸如:更新目录查看、重新加载设置文件、追踪变更、备份、同步甚至上传...等许多自动化作业流程,都可因而受惠。

原理说明

因为是发起rsync的主动同步,而且是推送(即PUSH)数据,只能是从rsync客户端向rsync服务器端推送数据,这点与rsync+crontab形式的从服务器端拉取(即PULL)数据不同,区别如下

image
 参考:http://xxrenzhe.blog.51cto.com/4036116/1393047

配置inotify服务

1、rsync的服务器端和客户端的配置与上面所述基本相同
2、安装inotify-tools

  在rsync客户端不再是拉取数据,而是推送数据,首先安装inotify-tools,其中包含所需的inotifywait文件系统监控工具

    # yum install inotify-tools

然后配置运行一个后台程序,用以实时监控待备份的数据目录,下面用例中监控本地/tmp目录,将数据同步至rsyns服务器的tools模块对应的目录下

# vim /etc/init.d/rsyncd

1 #!/bin/bash 2 #rsync server端模块名称 3 SModule=tools 4 # rsync client端同步目录 5 DDIR=/tmp 6 7 /usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' -e modify,delete,create,attrib $DDIR | while read file ; 8 do /usr/bin/rsync -va --password-file=/etc/rsyncd.passwd --delete $DDIR tom@172.16.19.11::$SModule 9 done

# chmod +x /etc/init.d/rsyncd

inotifywait参数解释
-m:持续监控;若无-m选项,则inotifywait服务监控到一个文件事件后即退出;
-r:递归监控,监控DDIR目录及其子目录
-q:静默输出,不显示inotifywait启动时的提示信息
-e: 定义需要监控的事件,包括修改、删除、创建、属性改变等