博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
rsync + inotify 实现主机间数据实时同步的原理
阅读量:5902 次
发布时间:2019-06-19

本文共 4564 字,大约阅读时间需要 15 分钟。

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

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

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

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

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

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

例:

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

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

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

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

例:

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

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

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

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

说明:

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[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监控到的事件输出到标准输出来。

1
inotify-tools-3.14.
tar
.gz

安装步骤:

1
2
3
4
[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的联运。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[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服务

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

开启rsync服务

1
[root@stu13 web]
# chkconfig rsync  on

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

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

说明:在后台运行。

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

1
2
[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输

出的存储空间的数据文件

1
2
[root@stu13 web]
# ll
total 0

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

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

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

1
2
3
4
5
6
7
8
9
[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

OK!!!

     本文转自成长的小虫 51CTO博客,原文链接:http://blog.51cto.com/9528du/1545880,如需转载请自行联系原作者

你可能感兴趣的文章
Node.js 中文学习资料和教程导航
查看>>
查找(AVL平衡二叉树)
查看>>
Javascript函数调用的四种模式
查看>>
用 Asterisk 搭建自己的免费 VoIP 服务器
查看>>
lua笔记二 赋值语句
查看>>
Android 中 Internal Storage 和 External Storage 的区别
查看>>
移动端拖拽(模块化开发,触摸事件,webpack)
查看>>
spring配置和注解事务同时存在导致的事务嵌套
查看>>
AE要素选择(点选和拉框选择)
查看>>
AJAX-初学AJAX本地环境配置
查看>>
Java内存模型深度解析:顺序一致性--转
查看>>
VSCode调试配置
查看>>
前端MVC学习总结(三)——AngularJS服务、路由、内置API、jQueryLite
查看>>
Selenium Web 自动化 - 项目持续集成(进阶)
查看>>
java&javaweb学习笔记
查看>>
UML统一建模语UML2和EnterpriseArchitect
查看>>
C#编程(二十二)----------继承的类型
查看>>
【精选】Nginx负载均衡学习笔记(一)实现HTTP负载均衡和TCP负载均衡(官方和OpenResty两种负载配置)...
查看>>
在 Visual Studio 2017 中找回消失的“在浏览器中查看”命令
查看>>
ajaxupload 异步上传工具
查看>>