一、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,如需转载请自行联系原作者