天天看点

Rsync结合Inotify 实时同步配置

 Rsync结合Inotify 实时同步配置

 系统环境:192.168.121.128(源) 192.168.121.129(目的)

 192.168.121.129(目的)安装rsync服务:

 yum install rsync 或者 wget rsync官网的rsync-3.1.2.tar.gz编译安装,不需要带参数 ./configure --prefix=/usr/local/rsync

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<code>cat</code> <code>/etc/rsyncd</code><code>.conf</code>

<code>uid=root</code><code>//RSYNC</code><code>守护进程的用户</code>

<code>git=root</code><code>////</code><code>运行RSYNC守护进程的组</code>

<code>use chroot = no </code><code>//</code> <code>//</code><code>不使用chroot</code>

<code>max connections = 10  </code><code>//</code><code>最大连接数限制</code>

<code>strict modes = </code><code>yes</code><code>//</code><code>如果为</code><code>true</code><code>,则密码文件只能被</code><code>rsync</code><code>服务器运行身份的用户访问,其他任何用户不可以访问该文件。默认值为</code><code>true</code><code>。</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/run/rsync</code><code>.lock </code>

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

<code>[svn] </code>

<code>path = </code><code>/data/svn</code><code>需要同步的目录</code>

<code>comment = </code><code>rsync</code> <code>from 192.168.121.128</code>

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

<code>write only = no </code>

<code>hosts allow = 192.168.121.128</code>

<code>hosts deny = * </code>

<code>list = </code><code>false</code>

<code>uid = root </code>

<code>gid = root </code>

<code>auth </code><code>users</code> <code>= webuser</code><code>//</code><code>此用户与系统用户无关</code>

<code>secrets </code><code>file</code> <code>= </code><code>/etc/rsync</code><code>.</code><code>passwd</code><code>//</code><code>定义认证的用户密码文件</code>

cat /etc/rsync.passwd 

<code>webuser:password</code>

<code>//</code><code>用户和密码以分号隔开</code>

并且设置600文件属性:

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

启动rsync服务:

<code>/usr/local/rsync/bin/rsync</code> <code>--port=873 --address=192.168.121.129 --daemon</code>

在192.168.121.128(源)主机做推送测试:

<code>rsync</code> <code>-avH --delete  --password-</code><code>file</code><code>=</code><code>/etc/rsync</code><code>.</code><code>passwd</code> <code>/data/svn</code> <code>[email protected]::svn</code>

#注意:/data/svn目录默认系统是已经有的,如果同步其他目录,源主机肯定有的,但目的主机可能没有,需要手动创建,否则会报错,找不到目录,同步失败。

192.168.121.128源主机安装inotify 服务

下载安装

<code># wget http://nchc.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz</code>

<code># tar xzvf inotify-tools-3.14.tar.gz</code>

<code># cd inotify-tools-3.13</code>

<code># ./configure  --prefix=/usr/local/inotify</code>

<code># make</code>

<code># make install</code>

创建inotify_rsync.sh脚本:

<code>cat</code> <code>inotify_rsync.sh</code>

<code>#!/bin/sh</code>

<code>#function:rysnc 192.168.121.128  to  192.168.121.129</code>

<code>if</code> <code>[ ! -f </code><code>/etc/rsync</code><code>.</code><code>passwd</code> <code>];</code><code>then</code>

<code>        </code><code>echo</code> <code>"password"</code><code>&gt;</code><code>/etc/rsync</code><code>.</code><code>passwd</code>

<code>        </code><code>/bin/chmod</code> <code>600 </code><code>/etc/rsync</code><code>.</code><code>passwd</code>

<code>fi</code>

<code>log=</code><code>/usr/local/inotify/logs/rsync</code><code>.log</code>

<code>src=</code><code>"/data/svn/"</code><code>#注意src如果为/tmp,将把tmp目录同步至目标主机,出现/tmp/tmp递归目录,所以需要同步那个目录下的文件,需要以/结尾。</code>

<code>host=</code><code>"192.168.121.129"</code>

<code>module=</code><code>"svn"</code>

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

<code>FILECHANGE=${DIR}${FILE}</code>

<code>/usr/bin/rsync</code> <code>-avH --delete  --progress --password-</code><code>file</code><code>=</code><code>/etc/rsync</code><code>.</code><code>passwd</code> <code>$src  --exclude-from=</code><code>"/usr/local/inotify/logs/rules.txt"</code> <code>webuser@$host::$module &amp;</code>

<code>echo</code> <code>"At ${TIME} on ${DATE}, file $FILECHANGE was backed up via rsync"</code> <code>&gt;&gt; $log</code>

<code>done</code>

#脚本中有delete参数,测试环境可以随便来,生产环境建议禁止delete参数。

<code>mkdir</code> <code>/usr/local/inotify/logs//</code><code>如果没有目录或文件需要手动创建</code>

<code>touch</code> <code>/usr/local/inotify/logs/rules</code><code>.txt</code>

相关注解如下:

/usr/local/bin/inotifywait -mrq -e modify,delete,create,attrib ${src}

-m 是保持一直监听

-r 是递归查看目录

-q 是打印出事件

-e close_write,modify,delete,create,attrib 是指 “监听 创建 移动 删除 写入 权限” 事件

/usr/bin/rsync -avH --delete  --progress --password-file

-a 存档模式

-H 保存硬连接

-delete 删除于多余文件

--password-file 密码文件

今天参数可以man rsync

要排除同步某个目录时,为rsync添加--exculde=PATTERN参数,注意,路径是相对路径,具体查看man rsync。

要排除某个目录的事件监听的处理时,为inotifywait添加--exclude或--excludei参数,具体查看man inotifywait。

--exclude-from="/usr/local/inotify/logs/rules.txt" 可以匹配过滤文件:

如排除包括 .svn的文件:

#cat /usr/local/inotify/logs/rules.txt

- *.svn*

inotifywait 命令产生三个返回值,分别是“日期,时间,文件” 这3个返回值会做为参数传给read,因此脚本中的“while read D E F” 写法细化了返回值。

赋予脚本可执行权限

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

运行

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

本文转自青衫解衣 51CTO博客,原文链接:http://blog.51cto.com/215687833/1883500