天天看点

Rsync+Inotify实现数据实时同步

1、环境及相关软件介绍

操作系统:ubuntu12.04_x64

源服务器(推送):192.168.18.10

目标服务器(备份):192.168.18.20

rsync:

  rsync是unix系统下的数据镜像备份工具,是一款快速增量备份工具(远程同步),支持本地复制,或者与其他ssh(安全传输)、rsync主机同步。

rsync有以下常用的参数:

    -v,--verbose 显示同步过程的详细信息

    -a,--archive 归档模式,表示以递归方传输文件,并保持所有文件属性,等同于-rlptgod

    -r,--recursive 对子目录以递归模式处理

    -z,--compress 对备份的文件在传输时进行压缩处理

    -l,--links 保留软连接

    -h,--hard-links 保留硬链接

    --delete 删除那些dst中src没有的文件(源服务器删除文件,目标服务器也同时删除)

    --progress 显示备份过程,等同于-p

    --port=port 指定rsync服务端口

    --exclude=file 排除一个目录或文件(排除多个目录时,可以写多个--exclude)

    --exclude-from=file  排除多个目录或文件,file里面写多个要排除的目录

inotify:

 inotify是一个linux特性,它监控文件系统操作,比如读取、写入和创建,当文件系统有变化时,则会触发inotify。inotify提供inotify-tools工具,这个工具包含两个功能,一个是inotifywait,用来监控文件系统变化的事件,另一个是inotifywatch,用来统计文件系统访问的次数。我们这次使用inotifywait结合rsync实现实时同步功能。

inotifywait有以下常用参数:

-m,--monitor 一直保持监听事件

-r,--recursive 递归监控目录

-q,--quiet 只打印触发的事件

-e,--event 指定监视时间

--timefmt 指定时间格式,用于-format选型中的%t格式

--format 指定输出格式。

%w 表示发生事件的目录

%f 表示发生事件的文件

%e 表示发生的事件

%t 使用由—timefmt定义的时间格式

inotifywait常用监视事件:

access 文件或目录读取

modify 文件或目录更改

attrib 文件或目录属性更改

move  文件或目录移动

create 文件或目录创建

delete 文件或目录删除

2、目标服务器安装与配置

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

<code># sudo apt-get install rsync    #ubuntu系统默认已安装</code>

<code># sudo cp/usr/share/doc/rsync/examples/rsyncd.conf /etc/</code>

<code># sudo vi /etc/rsyncd.conf</code>

<code># 以下是全局配置</code>

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

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

<code>lock </code><code>file</code> <code>= </code><code>/var/lock/rsyncd</code>

<code>#以下是模块选项配置</code>

<code>[home]     </code><code>#模块名,在源服务器指定这个名字</code>

<code>   </code><code>comment = </code><code>sync</code> <code>rsync</code><code>/home</code>      <code>#描述信息</code>

<code>   </code><code>path = </code><code>/home/rsync</code>      <code>#备份目录</code>

<code>   </code><code>use chroot=no           </code><code>#不使用chroot,不用root权限</code>

<code>   </code><code>read</code> <code>only = no          </code><code>#设置本地备份目录为读写权限</code>

<code>   </code><code>uid=root          </code>

<code>   </code><code>gid=root</code>

<code>   </code><code>max connections=10       </code><code>#客户端最大连接数</code>

<code>   </code><code>auth </code><code>users</code> <code>= </code><code>rsync</code>      <code>#指定数据同步用户</code>

<code>   </code><code>secrets </code><code>file</code> <code>= </code><code>/etc/rsyncd</code><code>.pass          </code><code>#指定数据同步用户信息文件</code>

<code>   </code><code>hosts allow=192.168.18.0</code><code>/24</code>     <code>#允许连接的客户端</code>

<code>   </code><code>ignore errors = </code><code>yes</code>     <code>#忽略出现i/o错误</code>

<code>   </code><code>timeout = 600</code>

 #创建认证文件

<code># sudo vi /etc/rsyncd.pass</code>

<code>rsync</code><code>:123456      </code><code>#格式是用户名:密码</code>

<code># sudo chmod 600 /etc/rsyncd.pass      #属主要有权限读这个文件,否则会报没权限</code>

<code># sudo /etc/init.d/rsync start     #如果启动报如下错误,则根据提示打开/etc/default/rsync文件,将rsync_enable=false该为rsync_enable=true,再重启即可。</code>

<code>* </code><code>rsync</code> <code>daemon not enabled </code><code>in</code><code>/etc/default/rsync</code><code>, not starting...</code>

<code>#,查看是否启动,有rsync监听端口说明正常:</code>

<code># sudo netstat -antp |grep rsync</code>

<code>tcp        0     0 0.0.0.0:873            0.0.0.0:*               listen      29605</code><code>/rsync</code>

博客地址:http://lizhenliang.blog.51cto.com

3、源服务器安装与配置

<code># sudo apt-get install rsync inodify-tools</code>

<code>#rsync不用配置,因为我们只使用rsync命令,紧接着创建认证文件</code>

<code>123456     </code><code>#只写密码</code>

<code># sudo chmod 600/etc/rsyncd.pass</code>

 #此时基本配置完成,测试下是否能推送吧!

<code># rsync -avzp --password-file=/etc/rsyncd.pass --delete /home/rsync [email protected]::home   #home即是目标服务器上rsync里面的模块名</code>

<code>sending incremental </code><code>file</code> <code>list</code>

<code>rsync</code><code>/a</code>

<code>           </code><code>0 100%    0.00kb</code><code>/s</code>   <code>0:00:00 (xfer</code><code>#1, to-check=5/7)</code>

<code>sent 354 bytes  received 126 bytes  960.00 bytes</code><code>/sec</code>

<code>total size is 0  speedup is 0.00</code>

 #出现以上信息说明同步正常,接下来,就该编写shell脚本,使用inotifywait做实时监控源目录,加个while循环判断源目录是否有触发,如果有变化则执行rsync同步,并记录日志:

<code># vi inotify_rsync.sh</code>

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

<code>src=</code><code>'/home/rsync'</code>

<code>dst=</code><code>'[email protected]::home'</code>

<code>/usr/bin/inotifywait</code> <code>-mrq --timefmt </code><code>'%y-%m-%d %h:%m'</code> <code>--</code><code>format</code> <code>'%t %w %f %e'</code> <code>-e create,delete,move,modify $src|</code><code>while</code> <code>read</code> <code>files</code>

<code>do</code>

<code>    </code><code>rsync</code> <code>-avzp --password-</code><code>file</code><code>=</code><code>/etc/rsyncd</code><code>.pass --delete $src $dst</code>

<code>    </code><code>echo</code> <code>"$files was rsynced."</code><code>&gt;&gt; </code><code>/tmp/rsync</code><code>.log</code>

<code>done</code>

4、测试实时同步

 #先打印形式查看脚本执行情况

<code># bash -x inotify_rsync.sh </code>

<code>+ src=</code><code>/home/rsync/</code>        <code>#目录结尾一定要加个/,否则会再目标服务器再创建个目录</code>

<code>+dst=</code><code>rsync</code><code>@192.168.18.213::home</code>

<code>+ </code><code>read</code> <code>files</code>

<code>+ </code><code>/usr/bin/inotifywait</code> <code>-mrq --timefmt </code><code>'%y-%m-%d %h:%m'</code> <code>--</code><code>format</code> <code>'%t %w%f %e'</code> <code>-e create,delete,move,modify,attrib </code><code>/home/loongtao</code>

<code>+ </code><code>rsync</code> <code>-avzp --password-</code><code>file</code><code>=</code><code>/etc/rsyncd</code><code>.pass --delete </code><code>/home/rsync</code> <code>rsync</code><code>@@192.168.18.213::home</code>

<code>rsync</code><code>/</code>

<code>rsync</code><code>/test</code><code>.txt</code>

<code>           </code><code>0 100%    0.00kb</code><code>/s</code>   <code>0:00:00 (xfer</code><code>#1, to-check=2/11)</code>

<code> </code> 

<code>sent 349 bytes  received 32 bytes  762.00 bytes</code><code>/sec</code>

<code>total size is 9380  speedup is 24.62</code>

<code>+ </code><code>echo</code> <code>'15-04-24 13:33/home/rsync/test.txt create was rsynced.'</code>

<code>+ </code><code>rsync</code> <code>-avzp--password-</code><code>file</code><code>=</code><code>/etc/rsyncd</code><code>.pass --delete </code><code>/home/rsync</code> <code>rsync</code><code>@192.168.18.213::home</code>

<code>sent 310 bytes  received 10 bytes  640.00 bytes</code><code>/sec</code>

<code>total size is 9380  speedup is 29.31</code>

<code>+ </code><code>echo</code> <code>'15-04-24 13:33/home/rsync/test.txt attrib was rsynced.'</code>

#可以看到以上信息,无任何报错,说明已经推送成功。

然后,把脚本放到后台运行:

<code># chmod +x inotify_rsync.sh</code>

<code># ./inotify_rsync.sh &amp;</code>

#此时当源服务器/home/rsync目录文件有更新,则会同步到目标服务器/home/rsync目录