Rsync是可以实现增量备份的工具,​使用同步算法,只比较数据变化。​配合任务计划。rsync能实现定时或间隔同步,配合inotify或sersync,可以实现触发式的实时同步。

Rsync还可实现scp的远程拷贝,cp的本地拷贝、rm删除和“ls -l”显示文件列表等功能,

但最终目的或原始目的是实现两端主机的文件同步。

Rsync有三种使用模式;

shell模式:本地复制功能;

远程shell模式:利用ssh实现数据的加密传输的远程主机;

守护进程模式(daemon模式):rsync工作在守护进程模式下。

背景说明:


       1、两台Centos7服务器,一台服务端,一台客户端;

   2、需要将服务端的 /data/ftp/server 目录的内容同步到客户端服务器的 /data/client 目录;

   3、需要将客户端服务器的 /data/client 目录的内容同步到服务端的/data/ftp/file 目录。

一、  配置rsync 
1. 配置前准备:
两台服务器,一台客户端,一台服务端
1) 关闭防火墙或配置好防火墙策略(rsync端口为873);
2) 关闭selinux;
3) 配置远程ssh免密登录;
4) 确保各个主机的时间一致(NTP)。
2.下载rsync、xinetd (两台服务器均需配置)
## yum –y install rsync xinetd
3.配置xinetd配置文件,将disable = yes改为no  (两台服务器均需配置)

Rsync+inotify实时同步配置_服务端

Rsync+inotify实时同步配置_服务端_02

4.服务端---编辑rsync配置文件,如rsyncd.conf文件不存在,则手动创建

Rsync+inotify实时同步配置_客户端_03

Rsync+inotify实时同步配置_客户端_04

全局参数:
uid:指定rsync进程以什么用户身份在后台运行,这个用户必须是系统用户,默认值为nobody;
gid: 指定rsync进程以什么用户组在后台运行,默认值为nobody;
pid file:指定rsync进程的pid文件的路径和名称;
lock file:指定rsync进程的锁文件的路径和名称;
log file:rsync的日志文件的路径和名称;
max connections:指定可以进行同时连接的用户的最大数量;
user chroot = yes | no:是否将用户锁定在家目录中

模块参数:(以下参数可以写在全局部分,如果写在全局部分,则对所有的模块都生效)
path:指定备份目录的路径;
read only = yes | no:只读;
write only = yes | no:只写;
list = true|false :设置是否可以显示全部的模块名称列表;
auth users:指定访问模块需要使用的用户名称,这里的是虚拟用户(不存在于/etc/passwd);
secrets file:指定保存虚拟用户名和密码的文件路径;
timeout:指定空闲超时时间;
exclude = 这里指定要排除的文件列表,列表中的内容以空格为分隔符;
hosts allow:指定可以访问模块或者rsync服务器端的ip地址(白名单);
hosts deny:黑名单;
补充:访问控制(allow | deny)
两个参数都没有的时候,那么所有用户都可以任意访问,
只有allow,那么仅仅允许白名单中的用户可以访问看模块;
只有deny,仅仅是黑名单的用户禁止访问模块;
两个参数都存在,则会首先检查白名单,如果匹配成功,则允许访问,
如果失败,就去检查黑名单,如果匹配成功则禁止访问;
如黑名单白名单都没有匹配成功,则允许访问(白名单比黑名单优先级高)
5.创建配置文件中相关目录:

Rsync+inotify实时同步配置_数据实时同步_05

Rsync+inotify实时同步配置_客户端_06

Rsync+inotify实时同步配置_rsync_07

mkdir /rsync    ##目录创建好,编辑rsync_passwd虚拟用户认证文件,并给予600权限(必须)

Rsync+inotify实时同步配置_客户端_08

Rsync+inotify实时同步配置_rsync_09

Rsync+inotify实时同步配置_inotify_10

6. 启动rsync

Rsync+inotify实时同步配置_客户端_11

7.启动xinetd服务

Rsync+inotify实时同步配置_客户端_12

补充:将4~7步骤在客户端也操作一遍

客户端:

Rsync+inotify实时同步配置_inotify_13

Rsync+inotify实时同步配置_客户端_14

Rsync+inotify实时同步配置_客户端_15

Rsync+inotify实时同步配置_inotify_16

Rsync+inotify实时同步配置_客户端_17

9. 测试
服务端测试:

Rsync+inotify实时同步配置_inotify_18

客户端测试:

Rsync+inotify实时同步配置_rsync_19

二、两台服务器中准备测试文件,进行整体测试
1.服务端和客户端创建测试文件

Rsync+inotify实时同步配置_inotify_20

Rsync+inotify实时同步配置_客户端_21

rsync命令参数:
-p:复制文件过程中,保持文件的属性不变
-v:显示详细信息(数据推送信息)
-a:使用归档模式(采取递归方式同步,且尽可能的保持各个方面的一致性;等同于-rlptgoD这一坨选项。如果复制目录必须使用此选项)
-z:再传输过程中,以压缩方式进行传输
-e“ssh 【-p22】”:指定所使用的传输通道
-r:递归复制
-t:保持文件原有时间
-g:保持属组
-o:保持属主
-l:复制原有的链接文件
-n:做测试同步,不做实际修改
-D:保持设备文件的原始信息
-W:拷贝所有的文件,不额外做检查(如作全备份可用-W,比增量传输效率要高)
--progress:rsync会显示出传输进度信息
--append-verify:文件传输时中断,可以接着中断的位置进行续传。(断点续传)会对已完成的文件进行校验,如果检验失败会重新传输。
文件排除:
--delete:让客户端和服务器端的文件完全一致,根据MD5值比较,删除同步端已经相同的文件信息,保留不存在和更新的文件,来构建新的文件列表;
--exclude:在进行文件传送的时候,排除指定的文件

文件完全一致原理:在文件传输过程中,发送方有的,会直接传输到接收方
发送方没有的,但是接收方有的文件,则会删除
排除一个文件 --exclude=file
排除多个文件 --exclude={file1,file2,file3}
通配符的方式实现 --exclude=*.txt
2. 将服务端的 /data/ftp/server 目录的内容同步到客户端服务器的 /data/client 目录;
命令:rsync -avz 本地源目录 虚拟用户名@客户端ip::模块名
或:
rsync –avz 本地源目录 客户端ip:目的目录

Rsync+inotify实时同步配置_rsync_22

Rsync+inotify实时同步配置_数据实时同步_23

3. 需要将客户端服务器的 /data/client 目录的内容同步到服务端的/data/ftp/file 目录。

Rsync+inotify实时同步配置_rsync_24

Rsync+inotify实时同步配置_数据实时同步_25

4.假如两台服务器没有设置ssh免密,也可以创建密码文件,写入目标主机的虚拟用户密码,通过密码推送文件。

Rsync+inotify实时同步配置_服务端_26

先将服务端/data/ftp/file中的客户端数据删除,做测试:还是将客户端的/data/client中的数据推送到服务端的/data/ftp/file

Rsync+inotify实时同步配置_rsync_27


rsync -avz --password-file=/rsync/file_passwd /data/client/ file_user@10.19.15.160::file

Rsync+inotify实时同步配置_rsync_28

Rsync+inotify实时同步配置_inotify_29


二、安装监控工具(配置inotify)
inotify软件(监控程序),功能:可以监控指定目录下的文件,当文件发生了更改,则会触发事件,这样就可以输出出发时间的文件的信息
监控事件:创建、删除、修改、移动等。
Inotify由inotify-tools工具(监控linux内核的工具)提供,在安装inotify-tools之前,
请确保内核版本高于2.6.13,且在/proc/sys/fs/inotify/下有以下三项,表示系统支持inotify监控。

Rsync+inotify实时同步配置_服务端_30

1.  安装inotify-tools
inotify软件被收录到了epel源,如有epel源可以直接yum –y install inotify-tools
注:客户端往服务端同步数据, inotify配置在客户端。
inotify-tools工具提供的两个应用程序:
/usr/bin/inotifywait --用于等待文件发生变化,所以可以实现监控(watch)的功能,inotifywait的命令是inotify的核心命令;

/usr/bin/inotifywatch --用于收集文件系统的统计数据,例如发生了多少次inotify时间,某文件被访问了多少次等等。
2.  Inotifywait基本用法
例如(常用命令):inotifywait -mrq --timefmt “%F%T” --format ‘%T %w%f %e’ -e create,delete,modify,attrib /data/client
命令选项:
-r:递归,对目录中的子目录中的文件做监控
-q:仅仅打印少量信息(仅仅打印监控的事件)
-m:一直处于监控状态 (默认是在前台进行监控)
-d:以守护进程的方式来运行(运行在后台)
-o file:将监控到的文件输出到一个文件当中(默认时输出到标准输出)
-s:将错误信息输出到系统日志中(默认是将错误信息输出标准输出)
--excludei:通过模式匹配来指定不被监控的文件,忽略文件的大小写
-e <event>:指定要监控的事件,如:create、delete、attrib、modify
--timefmt <fmt>:指定输出发生这个事件的时间点的显示格式,一般设置为【-- timefmt '%Y/%m/%d %H:%M:%S'】
--format <fmt>:指定的当发生事件以后输出的信息以及输出的格式,如
【--format '%w%f %e%T'】
%f:输出发生事件的文件名
%w:输出发生事件的文件所在目录的绝对路径
%e:输出发生事件的名称(如果有多个事件,多个事件用空格分隔)
%Xe:输出发生事件的名称(如果有多个事件,多个事件用X分隔)
%T:输出发生事件的时间(时间的格式由--timefmt <fmt>)
3.  inotifywait -e可监控的事件:
access:文件的访问事件
modify:文件的编辑事件
attrib:修改文件属性事件(修改文件的元数据)
close_write:当文件从写模式关闭的时候,会触发该事件
close_nowrite:当文件从只读模式下关闭的时候,会触发该事件
close:无论以什么方式打开文件,在关闭文件的时候,都会触发该事件
open:当文件被打开的时候,会触发该事件
moved_to:当一个文件被移动到监控的目录下。就会触发该事件
moved_form:当一个文件从监控目录下移走的时候,就会触发该事件
move:主要发生了文件的移动,就会触发该事件
moved_self:在监控目录下执行移动操作就会触发该事件
create:创建文件的事件
delete:删除文件的事件
delete_self:被监控的文件或目录发生了移动 ,移动结束后将不再监控此文件或目录
umount:挂载在被监控目录上的文件系统被umount,umount后不再监控此目录
isdir:监控目录相关操作
4.  写inotify实时同步数据脚本

Rsync+inotify实时同步配置_客户端_31

Rsync+inotify实时同步配置_客户端_32

配合定时计划任务,定时执行该脚本