一、rsync介绍

1、rsync介绍:

Rsync(remote sync)是UNIX 及类UNIX 平台下一款神奇的数据镜像备份软件,它不像FTP 或其他文件传输服务那样需要进行全备份,Rsync 可以根据数据的变化进行差异备份,从而减少数据流量,提高工作效率。你可以使用它进行本地数据或远程数据的复制,Rsync 可以使用SSH 安全隧道进行加密数据传输。Rsync 服务器端定义源数据,Rsync 客户端仅在源数据发生改变后才会从服务器上实际复制数据至本地,如果源数据在服务器端被删除,则客户端数据也会被删除,以确保主机之间的数据是同步的。Rsync 使用TCP 873端口。

  • rsync功能
  • 作为命令,实现本地-远程文件同步
  • 作为服务,实现本地-远程文件同步
  • rsync特点
  • 可以镜像保存整个目录树和文件系统
  • 可以保留原有的权限(permission,mode),owner,group,时间(修改时间,modify time),软硬链接,文件acl,文件属性(attributes)信息等
  • 传输效率高,使用同步算法,只比较变化的
  • 支持匿名传输,方便网站镜像;也可以做验证,加强安全
  • rsync同类服务
  • sync 同步:刷新文件系统缓存,强制将修改过的数据块写入磁盘,并且更新超级块。
  • async 异步:将数据先放到缓冲区,再周期性(一般是30s)的去同步到磁盘。
  • rsync 远程同步:remote synchronous

2、安装

使用CentOS 7 系统安装部署Rsync 非常方便,安装光盘以及YUM 源中都提供了rsync
软件包,使用YUM 方式安装即可。

[root@centos7 ~]# yum -y install rsync
[root@centos7 ~]# vim /etc/rsync.conf

3、配置文件详解 

#/etc/rsyncd.conf
#设置服务器信息提示文件名称,在该文件中编写提示信息
motd file = /etc/rsyncd.motd
#开启Rsync 数据传输日志功能
transfer logging = yes
#设置日志文件名称,可以通过log format 参数设置日志格式
log file =/var/log/rsyncd.log
#设置Rsync 进程号保存文件名称
pid file =/var/run/rsyncd.pid
#设置锁文件名称
lock file =/var/run/rsync.lock
#设置服务器监听的端口号,默认为873
port = 873
#设置服务器所监听网卡接口的IP 地址,这里服务器IP 地址为192.168.0.254
address = 192.168.0.254
#设置进行数据传输时所使用的账户名称或ID 号,默认使用nobody
uid = nobody
#设置进行数据传输时所使用的组名称或GID 号,默认使用nobody
gid = nobody
#设置user chroot 为yes 后,rsync 会首先进行chroot 设置,将根映射到path
参数路径下,对客户
#端而言,系统的根就是path 参数所指定的路径。但这样做需要root 权限,并
且在同步符号
#连接资料时仅会同步名称,而内容将不会同步。
use chroot = no
#是否允许客户端上传数据,这里设置为只读。
read only = yes
#设置并发连接数,0 代表无限制。超出并发数后,如果依然有客户端连接请
求,则将会收
#到稍后重试的提示消息
max connections = 10
#模块,Rsync 通过模块定义同步的目录,模块以[name]的形式定义,这与Samba
定义共
#享目录是一样的效果。在Rsync 中也可以定义多个模块
[common]
#comment 定义注释说明字串
comment = Web content
#同步目录的真实路径通过path 指定
path = /common
#忽略一些IO 错误
ignore errors
#exclude 可以指定例外的目录,即将common 目录下的某个目录设置为不同步
数据
#exclude = test/

 4、rsync三种工作方式

4.1、本地文件系统上实现同步。命令行语法格式为上述"Local"段的格式。

Local:  rsync [OPTION...] SRC... [DEST]

4.2、本地主机使用远程shell和远程主机通信。命令行语法格式为上述"Access via remote shell"段的格式。

Access via remote shell:
         Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
         Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

4.3、本地主机通过网络套接字连接远程主机上的rsync daemon。命令行语法格式为上述"Access via rsync daemon"段的格式。

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

前两者的本质是通过管道通信,即使是远程shell。而方式(3)则是让远程主机上运行rsync服务,使其监听在一个端口上,等待客户端的连接。

但是,通过远程shell也能临时启动一个rsync daemon,这不同于方式(3),它不要求远程主机上事先启动rsync服务,而是临时派生出rsync daemon,它是单用途的一次性daemon,仅用于临时读取daemon的配置文件,当此次rsync同步完成,远程shell启动的rsync daemon进程也会自动消逝。此通信方式的命令行语法格式同"Access via rsync daemon",但要求options部分必须明确指定"--rsh"选项或其短选项"-e"。

5、常用参数

由于rsync支持一百多个选项,所以此处只介绍几个常用选项

-a 包含-rtplgoD
-r 同步目录时要加上,类似cp时的-r选项
-v 同步时显示一些信息,让我们知道同步的过程
-l 保留软连接
-L 加上该选项后,同步软链接时会把源文件给同步
-p 保持文件的权限属性
-o 保持文件的属主
-g 保持文件的属组
-D 保持设备文件信息
-t 保持文件的时间属性
--delete 删除DEST中SRC没有的文件
--exclude 过滤指定文件,如--exclude “logs”会把文件名包含logs的文件或者目录过滤掉,不同步
-P 显示同步过程,比如速率,比-v更加详细
-u 加上该选项后,如果DEST中的文件比SRC新,则不同步
-z 传输时压缩

6、示列

6.1、本地传输

[root@ansible-server /]# rsync /tmp/ /home/   #将/tmp下所有文件传输到/home下
[root@ansible-server /]# rsync /tmp /home/    #将/tmp下所有文件包含文件夹tmp传输到/home下
#使用rsync一定要注意的一点是,源路径如果是一个目录的话,带上尾随斜线和不带尾随斜线是不一样的,不带尾随斜线表示的是整个目录包括目录本身,带上尾随斜线表示的是目录中的文件,不包括目录本身。

6.2、从服务器到本地

[root@ansible-server /]# rsync -r 172.16.3.40:/tmp /tmp  #将远程服务器172.16.3.40上的/tmp目录传输到本地服务器/tmp路径下

6.3、从本地到远程服务器

[root@ansible-server /]# rsync -r /tmp 172.16.3.40:/tmp  # 将本地/tmp目录拷贝到远程主机172.16.3.40的/tmp下,以保证远程/tmp目录和本地/etc保持

二、inotify介绍:

inotify可以监控文件,也可以监控目录。当监控目录时,它可以同时监控目录及目录中的各子目录及文件的。此外,inotify 使用文件描述符作为接口,因而可以使用通常的文件I/O操作select、poll和epoll来监视文件系统的变化。

inotify可以监视的文件系统常见事件包括:
2IN_ACCESS:文件被访问
2IN_MODIFY:文件被修改
2IN_ATTRIB,文件属性被修改
2IN_CLOSE_WRITE,以可写方式打开的文件被关闭
2IN_CLOSE_NOWRITE,以不可写方式打开的文件被关闭
2IN_OPEN,文件被打开
2IN_MOVED_FROM,文件被移出监控的目录
2IN_MOVED_TO,文件被移入监控着的目录
2IN_CREATE,在监控的目录中新建文件或子目录
2IN_DELETE,文件或目录被删除
2IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己
2IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己

三、inotify-tools

inotify是一个API,需要通过开发应用程序进行调用,对于大多数用户来讲这有着许多不便,inotify-tools的出现弥补了这一不足。inotify-tools是一套组件,它包括一个C库和几个命令行工具,这些命令行工具可用于通过命令行或脚本对某文件系统的事件进行监控。

inotify-tools提供的两个命令行工具:

  • notifywait:通过inotify API等待被监控文件上的相应事件并返回监控结果,默认情况下,正常的结果返回至标准输出,诊断类的信息则返回至标准错误输出。它可以在监控到对应监控对象上指定的事件后退出,也可以进行持续性的监控。
  • inotifywatch:通过inotify API收集被监控文件或目录的相关事件并输出统计信息。

inotifywait命令使用简介:
inotifywait尤其适用于在脚本中等待某事件的发生,并可基于特定的事件执行相应操作。如将其用于脚本中监控某指定目录中的文件上的修改、新建、删除、属性信息的改变,而后使用rsync命令将某事件对应的文件同步至其它主机上。其常用选项如下:
l-m, --monitor:inotifywait的默认动作是在监控至指定文件的特定事件发生一次后就退出了,而使用此选项则可实现持续性的监控;
l-r, --recursive:递归监控指定目录下的所有文件,包括新建的文件或子目录;如果要监控的目录中文件数量巨大,则通常需要修改/proc/sys/fs/inotify/max_users_watchs内核参数,因为其默认值为8192。
l-e <event>, --event<event>:指定要监控的特定事件,默认是监控所有的事件;此处<event>包括access, modify, attrib,close_write, close_nowirte, close, open, moved_to, moved_from, move, create,delete, delete_selt等;
l--timefmt <fmt>:当在--format选项中使用%T时,--timefrt选项则可以用来指定自定义的符合strftime规范的时间格式,此时间格式可用的格式符可以通过strftime的手册页获取;--timefrt后常用的参数是'%d/%m/%y %H:%M';
l--format <fmt>:自定义inotifywait的输出格式,如--format '%T %w %f';常用的格式符如下:
%w:显示被监控文件的文件名;
%f:如果发生某事件的对象是目录,则显示被监控目录的名字;默认显示为空串;
%T:使用--timefmt选项中自定义的时间格式;

 四、rsync实现两台服务器数据同步的原理

Rsync 是基于rsync算法校验源(SRC)与目标(DEST)之间的差异实现数据同步的。也就是说,当使用rsync工具同步数据时候,只复制源(SRC)发生改变的文件,到目标(DEST),这类似于增量备份。所以rsync同步数据的速度是很快的。但是rsync的传输性能有点差,在海量小文件需要同步时,表现很差劲。因为rsync是基于文件同步的(不是块级别的),在传输之前还要进行校验。

   Rsync的工作模式有多中,使用rsync的服务模式来构建:主/从服务器的数据同步。此时rsync工作为守护进程监听在:TCP/873, 能接收客户端的数据同步请求。

客户端发出的数据同步请求方式有两种:

1、  从远程rsync服务器拉取数据到本地

Pull:
    rsync [OPTION...] [USER@]HOST::SRC... [DEST]
    rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]

例:

  从远程rsync服务器拉取数据(把rsync导出的存储空间中的所有文件镜像到本地)到本地的/web目录

[root@node1 web]# rsync -aprtogzl192.168.60.99::web/   /web
[root@node1web]# rsync -arogtpz rsync://192.168.60.99/web/  /web

2、往远程服务器推送数据   

Push:
    rsync [OPTION...] SRC... [USER@]HOST::DEST
    rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST

例:

   往远程rsyn服务器导出的存储空间(web)推送数据(文件fstab)

[root@node1/]# rsync /etc/fstab 192.168.60.9::web

 使用rsync协议向远程rsync服务器导出的存储空间(web)推送数据(镜像目录/etc)

[root@node1/]# rsync -a /etc rsync://192.168.60.99/web

 

五、那么如何实现:实现两台服务器的数据同步呢?

要点:只要当数据改变时,rsync客户端往rsync服务器推送数据或从主服务器拉取数据,就可以实现两台服务器数据同步了。

1、选择rsync客户端的工作模式:

因为:rsync客户端向服务端发出的数据同步请求命令的方式有两种(推送数据/拉取数据):那么,Rsync客户端是从rsync服务器拉取数据(镜像数据)还是rsync客户端推送(上传)数据,这要视,同步数据源放在rsync服务器端还是放在rsync客户端?

说明:本实验的同步数据源存放在rsync客户端192.168.60.40所在文件系统的:/web目录中,所以

使用“推送模式”。

2、选择触发rsyc客户端从rsync服务器端拉取数据或推送数据的方式?

(1)、把rsync客户端发出的数据同步请求命令做成周期性任务计划,每隔一段时间同步一次数据。  不管有没有数据变化都发出一次数据同步请求命令。
(2)、使用内核提供的inotify机制,当数据发生改变时(删除、修改等)就触发rsync客户端发出数据  同步请求。

说明:

    第1种方式,不能保证两台服务器的数据是实时同步的,因为数据发生改变与rsync客户端发出同步请求命令不能联运起来。如果,我们的数据更新频度很快的话,往往会造成某台服务器的数据落后很多另一台服务器的。而第2种解决方案,只要数据发生改变就会发生数据同步请求,它是实时的。

Rsync + inotify 机制实现的两台服务器数据同步如下图如示:

centOS重启rsync centos7 rsync_服务器

六、在192.168.60.99主机搭建rsync服务器

Rsync工作于服务模式,要为其提供配置文件,配置文件如下:

[root@stu13 /]# cat /etc/rsyncd.conf
#
#
uid = nobody   
gid = nobody
use chroot = no
max connections = 10             # 最大并发连接数
strict modes = yes               # 当启用基于口令认证客户端时,是否检查口令文件的权限
pid file = /var/run/rsyncd.pid
log file = /var/log/rsyncd.log   # 日志文件的输出路径

[web]                            # rsync服务器输出的存储空间叫啥名
path = /web                      # 定义rsync服务器输出的存储空间的位置
ignore errors  =yes              # 在数据传输中,出现错误是否忽略继续传输数据
read only = no                   # 允许客户端上传数据(往rsync服务器推送数据)
write only = no                  # 允许客户端下载数据(从rsync服务器拉取数据)

hosts allow = 192.168.60.0/24    # 允许访问rsync服务器的客户端地址
hosts deny = *                   # 只允许hostsallow指令定义的客户端访问,其它的都不允许

list = false                     # 当客户端请求服务器输出的存储空间列表时,是否列出来。
uid = root
gid = root

 

七、在192.168.60.40安装inotifywatch工具;

要使用inotifywatch工具定义inotify监控的对象和监控事件。Inotify工作在内核空间。

Inotifywatch会把inotify监控到的事件输出到标准输出来。

inotify-tools-3.14.tar.gz

安装步骤:

[root@node1 admin]# tar -xf  inotify-tools-3.14.tar.gz
[root@node1 admin]#cd inotify-tools-3.14
[root@node1 inotify-tools-3.14]#./configure --prefix=/usr/local/inotify-tools
[root@node1 inotify-tools-3.14]#Make && make install

八、在客户端192.168.60.40设置inotify 与 rsync联动;

联动原理:

    可以通过管道,把innotify监控到的事件送到while循环,由read读取到有监控事件发生,就执行while循环体内的rsync同步数据请求命令。这样就实现了inotify与rsync的联运。代码如下:

[root@node1 ~]# cat inotify.sh
#/bin/bash
# rsync服务器
rsyncServer=192.168.60.99
# 初监控的文件系统(也就是同步数据源)
src=/web/
# 远程rsync服务器导出的存储空间
dst=web
# 一开始就进行数据同步
rsync -azrtopg --delete $src $rsyncServer::$dst

/usr/local/inotify-tools/bin/inotifywait -mrq  -e create,move,delete,modify  $src | while read files;do
   # 监测的事件为:create,move,delete,modify
   rsync -azrtopg --delete $src $rsyncServer::$dst
done

 

九、测试;

1、启用服务

  说明:这里选择rsync由超级守护进行xinetd管理。所以,要启用xinetd服务。

启动 xinetd服务

[root@stu13 web]# service xinetd start
Starting xinetd:                                           [  OK  ]

开启rsync服务

[root@stu13 web]# chkconfig rsync  on

2、在rsync服务端运行inotify.sh脚本

[root@node1 ~]# ./inotify.sh &
[1] 6237

说明:在后台运行。

注意:rsync服务器监听的端口为:TCP/873

[root@stu13 web]# netstat -anpt | grep rsync
tcp        0      0 192.168.60.99:873           192.168.60.40:37795         ESTABLISHED 14681/rsync

3、查看rsync服务器192.168.60.99输出的存储空间的数据文件

[root@stu13 web]# ll
total 0

4、在rsync客户端192.168.60.40,复制一些文件到被inotify监控的目录/web中

[root@node1 web]# cp -r /var/log/* ./

5、查看rsync服务器输出的存储空间/web是否有对应的文件

[root@stu13 web]# ls
anaconda.ifcfg.log    btmp           dracut.log        messages-20140817  sa                 spooler-20140824
anaconda.log          ConsoleKit     gdm               messages-20140824  samba              tallylog
anaconda.program.log  cron           httpd             mysqld.log         secure             wpa_supplicant.log
anaconda.storage.log  cron-20140817  lastlog           ntpstats           secure-20140817    wtmp
anaconda.syslog       cron-20140824  maillog           pm-powersave.log   secure-20140824    Xorg.0.log
anaconda.yum.log      cups           maillog-20140817  ppp                spice-vdagent.log  yum.log
audit                 dmesg          maillog-20140824  prelink            spooler
boot.log              dmesg.old      messages          rhsm               spooler-20140817