天天看点

rsync+inotify 实现数据实时同步

一、原理简介(原理内容来自网络)

1.rsync

与传统的 cp、tar 备份方式相比,rsync 具有安全性高、备份迅速、支持增量备份等优点,通过 rsync 可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等,随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync 在高端业务系统中也逐渐暴露出了很多不足,首先,rsync 同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync 不能实时的去监测、同步数据,虽然它可以通过 linux 守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify 组合出现了!

2.inotify

Inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,linux 内核从 2.6.13 起,加入了 Inotify支持,通过 Inotify 可以监控文件系统中添加、删除,修改、移动等各种细微事件,利用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而 inotify-tools 就是这样的一个第三方软件。 在上面章节中,我们讲到,rsync 可以实现触发式的文件同步,但是通过 crontab 守护进程方式进行触发,同步的数据和实际数据会有差异,而 inotify 可以监控文件系统的各种变化,当文件有任何变动时,就触发rsync 同步,这样刚好解决了同步数据的实时性问题。

注:

rsync inotify 需要逆向思考,当只做rsync不实时同步时,我们一般是从rsync服务端向rsync客户端同步数据。当需要添加inotify实现实时同步数据时,我们就需要从rsync客户端向各rsync服务端同步数据,这样rsync客户端就变成了master,而rsync服务端就变成了slave。

原理:当web3的本地目录,也就是需要同步的目录发生变化时,比如有文件改名、更新、删除、权限变化,此时就使用inotify命令查找这些变化,进行相应的轮询工作

二、系统环境

操作系统

CentOS release 6.5 (Final)

rsync client

rsync server

三、拓扑图

<a href="http://s3.51cto.com/wyfs02/M00/23/7E/wKiom1M4TP2i5i2xAAISvId5NTA396.jpg" target="_blank"></a>

四、配置过程

1、安装Rsync服务端(FTP:192.168.1.30)

1

<code>#yum -y install xinetd rsync</code>

2、为rsync服务提供配置文件

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

<code>uid = nobody</code>

<code>gid = nobody</code>

<code>use chroot = no</code>

<code>max connections = 3</code>

<code>timeout = 800</code>

<code>pid </code><code>file</code> <code>= </code><code>/var/run/rsyncd</code><code>.pid</code>

<code>lockfile = </code><code>/var/run/rsyncd</code><code>.lock</code>

<code>log </code><code>file</code> <code>= </code><code>/var/log/rsyncd</code><code>.log</code>

<code>[</code><code>ftp</code><code>]</code>

<code>path = </code><code>/var/ftp</code>

<code>ignore errors = </code><code>yes</code>

<code>read</code> <code>only = no</code>

<code>write only = no</code>

<code>hosts allow = 192.168.1.200</code>

<code>hosts deny = *</code>

<code>list = </code><code>yes</code>

<code>uid = root</code>

<code>gid = root</code>

<code>auth </code><code>users</code> <code>= </code><code>ftp</code>

<code>secrets </code><code>file</code> <code>= </code><code>/etc/ftp</code><code>.</code><code>passwd</code>

3、创建同步的目录

<code>#mkdir /</code><code>var</code><code>/ftp</code>

<code># cat /etc/ftp.passwd</code>

<code>ftp:</code><code>123</code>

<code># chmod </code><code>600</code> <code>/etc/ftp.passwd</code>

<code># ll /etc/ftp.passwd</code>

<code>-rw------- </code><code>1</code> <code>root root </code><code>8</code> <code>Mar </code><code>23</code> <code>15</code><code>:</code><code>47</code> <code>/etc/ftp.passwd</code>

4、添加启动脚本

<a href="http://s3.51cto.com/wyfs02/M01/23/7E/wKiom1M4Vf_y5r4eAALWq6eBQgU128.jpg" target="_blank"></a>

5、查启xinetd守护进程

<a href="http://s3.51cto.com/wyfs02/M00/23/7F/wKioL1M4Vnrj_GXYAAEn-GtPzu0465.jpg" target="_blank"></a>

7、配置Rsync服务端(WEB:192.168.1.200)

(1)、安装并编辑配置文件

21

22

23

<code>#yum install -y rsync xinetd</code>

<code>#vim /etc/rsyncd.conf</code>

<code>#Global Settings</code>

<code>[web]</code>

<code>path = </code><code>/var/www</code>

<code>hosts allow = 192.168.1.100</code>

<code>auth </code><code>users</code> <code>= web</code>

<code>secrets </code><code>file</code> <code>= </code><code>/etc/web</code><code>.</code><code>passwd</code>

8、创建目录、密码文件及权限

<code>#mkdir /var/www</code>

<code>#echo "web:web" &gt;/etc/web.passwd</code>

<code>#chmod 600 /etc/web.passwd</code>

<code># ll /etc/web.passwd</code>

<code>-rw------- 1 root root 8 Mar 21 22:54 </code><code>/etc/web</code><code>.</code><code>passwd</code>

五、配置rsync客户端(192.168.1.100)

1、设置 rsync 客户端的密码文件,客户端只需要设置 rsync 同步的密码即可,不用设置用户名

<code>#echo "web" &gt; /etc/web.passwd</code>

<code>#echo "123" &gt; /etc/ftp.passwd</code>

<code>chomd 600 </code><code>/etc/web</code><code>.</code><code>passwd</code>

<code>chmod</code> <code>600 </code><code>/etc/ftp</code><code>.</code><code>passwd</code>

2、安装inotify-tools

<code>#yum install -y inotify*</code>

3、在192.168.1.100上测试下能否同步文件

1)第1条是是从rsync客户端192.168.1.200上传文件到rsync服务端192.168.1.100,这里必须要指定密码文件

<a href="http://s3.51cto.com/wyfs02/M00/23/85/wKiom1M5eUegpSMwAADv64OuQiw663.jpg" target="_blank"></a>

2)第2条是从rsync服务端(192.168.1.100)下载文件到rsync客户端(192.168.1.200)

<a href="http://s3.51cto.com/wyfs02/M00/23/85/wKiom1M5f-3RtXkQAAEApR4ib5g422.jpg" target="_blank"></a>

3)以上两条说明了,rsync服务端和客户端是可用的;经测试,另一台rsync服务端也可用,不再贴图了。接下来的任务就是编写服务脚本了,能够让rsync客户端自动监测目录的变动情况,并自动同步到rsync服务端,完全实现自动化。

六、编写rsync脚本,实现数据实时同步

1、在rsync客户端(192.168.1.200)编写rsync脚本

<code>#vim /etc/init.d/rsyncd</code>

<code>#!/bin/bash</code>

<code>src=</code><code>/var/web/</code>

<code>des1=web</code>

<code>des2=</code><code>ftp</code>

<code>host1=192.168.1.100</code>

<code>host2=192.168.1.30</code>

<code>user1=web</code>

<code>user2=</code><code>ftp</code>

<code>/usr/bin/inotifywait</code> <code>-mrq --timefmt </code><code>'%d/%m/%y %H:%M'</code> <code>--</code><code>format</code> <code>'%T %w %f'</code> <code>-e modify,delete,create,attrib $src | </code><code>while</code> <code>read</code> <code>file</code> <code>DATE TIME DIR;</code>

<code>do</code>

<code>/usr/bin/rsync</code> <code>-vzrtopg --delete --progress $src $user1@$host1::$des1 --password-</code><code>file</code><code>=</code><code>/etc/web</code><code>.</code><code>passwd</code>

<code>/usr/bin/rsync</code> <code>-vzrtopg --delete --progress $src $user2@$host2::$des2 --password-</code><code>file</code><code>=</code><code>/etc/ftp</code><code>.</code><code>passwd</code>

<code>echo</code> <code>"${files} was rsynced"</code> <code>&gt;&gt; </code><code>/var/log/rsync</code><code>.log 2&gt;&amp;1</code>

<code>done</code>

 2、把脚本加入到开机自动启动文件

<code>#chmod +x /etc/init.d/rsyncd</code>

<code>#echo "/etc/init.d/rsyncd"&gt;&gt;/etc/rc.d/rc.local</code>

3、查看结果:

<a href="http://s3.51cto.com/wyfs02/M00/23/86/wKioL1M5hVLSrEuCAADpJ3rrlHo392.jpg" target="_blank"></a>

由于两端正确信息一致,所以不多截图了

===================================完=======================================

本文转自 jinlinger 51CTO博客,原文链接:http://blog.51cto.com/essun/1387715,如需转载请自行联系原作者

继续阅读