天天看点

linux sync server+inotify 1对多同步实例

需求:

    线上也业务需求,意思就是N台机器需要维护各自机器上的一个目录,并且他们都是相同滴。so,这两天想了下,决定使用rsync server+inotify来解决这个问题。当然有的人会用自动化工具来推,但是我这里这个文件可能每次只改里面1小点内容,推个一百来兆的东西(这句话有错也莫喷了亲 = =)。。反正出于种种原因决定要使用 rsync

作业环境:

CentOS 6.3 

rsync  version 3.0.6 (为系统自带版本 = = 当然编译的下面会说)

inotify-tools 3.14

-------------------

首先说明:

    其实rsync和inotify-tools使用yum或者系统自带的都可以的。

    inotify需要注意内核是否支持:(ls /proc/sys/fs/inotify 下是否有max_queued_events  max_user_instances  max_user_watches三个文件)

    rsync的编译安装也不过多介绍了,tar xf *** && cd *** && ./configure && make && make install

场景说明:

    我这里是1台server(rsync+inotify)来主动推送文件到N台机器(rsync守护进程),并且我N台机器配置文件配置都一样(喊密码认证文件)。

server端配置:

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

26

27

28

29

30

31

<code>mkdir</code> <code>/data/sync-server</code>

<code>cd</code> <code>/data/sync-server</code>

<code>yum -y </code><code>install</code> <code>inotify-tools </code><code>rsync</code>

<code>#然后编写inotify-tools脚本</code>

<code>vim </code><code>sync</code><code>.sh</code>

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

<code>#</code>

<code>source</code> <code>/etc/profile</code> <code>&amp;&gt;</code><code>/dev/null</code>

<code>basedir=$(</code><code>cd</code> <code>`</code><code>dirname</code> <code>$0`;</code><code>pwd</code><code>)</code>

<code>log=</code><code>"$basedir/sync.log"</code>

<code>synclog=</code><code>"$basedir/result.log"</code>

<code>file</code><code>=</code><code>"$basedir/iplist"</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,move </code><code>/data/karaf-sync/ccms-build/</code> <code>\</code>

<code>|</code><code>while</code> <code>read</code> <code>file</code> 

<code>do</code>

<code>while</code> <code>read</code> <code>line</code>

<code>echo</code> <code>"$line sync start..."</code>

<code>    </code><code>/usr/bin/rsync</code> <code>-vzrtopg --delete --progress </code><code>/data/karaf-sync/ccms-build/</code> <code>ccms@$line::ccms --password-</code><code>file</code><code>=</code><code>/data/karaf-sync/scripts/pwd</code> <code>&amp;&gt;&gt; $log</code>

<code>    </code><code>if</code> <code>[ $? -</code><code>eq</code> <code>0 ];</code><code>then</code>

<code>        </code><code>echo</code> <code>"`date +%F-%H:%M` $line was rsynced Success !!!"</code> <code>&amp;&gt;&gt; $synclog</code>

<code>        </code><code>echo</code> <code>"-----------------------------------------------------------"</code> <code>&amp;&gt;&gt; $synclog</code>

<code>        </code><code>echo</code> <code>""</code> <code>&amp;&gt;&gt; $synclog</code>

<code>    </code><code>else</code>

<code>        </code><code>echo</code> <code>"`date +%F-%H:%M` $line was rsynced Failed !!!"</code> <code>&amp;&gt;&gt; $synclog</code>

<code>    </code><code>fi</code>  

<code>done</code> <code>&lt; $basedir</code><code>/iplist</code>             <code>#我外面有相关的定时同步iplist的操作</code>

<code>done</code>

<code>inotifywait:</code>

<code>-r, --recursive递归查询目录。</code>

<code>-q, --quiet,打印出监控事件。</code>

<code>-e, --event,指定要监控的事件,常见的事件有move、modify、delete、create、attrib等。全量:(access、modify、 attrib、 close_write、 close_nowrite、close、</code><code>open</code><code>、 moved_to、 moved_from、move、 move_self、 create、delete、delete_self、unmount)</code>

<code>--timefmt:时间的输出格式</code>

<code>--</code><code>format</code><code>:指定变化文件的详细信息</code>

<code>------------------------------------------------------</code>

<code>inotify 可以监视的文件系统事件包括:</code>

<code>IN_ACCESS,即文件被访问</code>

<code>IN_MODIFY,文件被 write</code>

<code>IN_ATTRIB,文件属性被修改,如 </code><code>chmod</code><code>、</code><code>chown</code><code>、</code><code>touch</code> <code>等</code>

<code>IN_CLOSE_WRITE,可写文件被 close</code>

<code>IN_CLOSE_NOWRITE,不可写文件被 close</code>

<code>IN_OPEN,文件被 </code><code>open</code>

<code>IN_MOVED_FROM,文件被移走,如 </code><code>mv</code>

<code>IN_MOVED_TO,文件被移来,如 </code><code>mv</code><code>、</code><code>cp</code>

<code>IN_CREATE,创建新文件</code>

<code>IN_DELETE,文件被删除,如 </code><code>rm</code>

<code>IN_DELETE_SELF,自删除,即一个可执行文件在执行时删除自己</code>

<code>IN_MOVE_SELF,自移动,即一个可执行文件在执行时移动自己</code>

<code>IN_UNMOUNT,宿主文件系统被 </code><code>umount</code>

<code>IN_CLOSE,文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)</code>

<code>IN_MOVE,文件被移动,等同于(IN_MOVED_FROM | IN_MOVED_TO)</code>

<code>注:上面所说的文件也包括目录。</code>

<code>rsync</code><code>的命令请另外搜索。。</code>

client端配置:

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

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

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

<code>port = 873          </code><code>#监听端口</code>

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

<code>max connections = 100   </code><code>#最大连接数,0为不限制</code>

<code>timeout = 600        </code><code>#通过该选项可以覆盖客户指定的IP超时时间.通过该选项可以确保rsync服务器不会永远等待一个崩溃的客户端.超时单位为秒钟,0表示没有超时定义,这也是默认值.对于匿名rsync服务器来说,一个理想的数字是600.</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/rsyncd</code><code>.lock</code>

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

<code>#log format --- google</code>

<code>[ccms]</code>

<code>path = </code><code>/data/ccms-build/</code>       <code>#需要同步的路径</code>

<code>comment =  ccms </code><code>dir</code>           <code>#名称</code>

<code>ignore errors                </code><code>#可以忽略一些无关的IO错误</code>

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

<code>list = no                      </code><code>#不允许列文件</code>

<code>hosts allow = 192.168.***.***</code><code>/255</code><code>.255.255.0       </code><code>#允许的客户端</code>

<code>auth </code><code>users</code> <code>= ccms                   </code><code>#认证用户</code>

<code>secrets </code><code>file</code> <code>= </code><code>/etc/rsync</code><code>.</code><code>pwd</code>       <code>#密码文件:600</code>

<code>vim </code><code>/etc/rsync</code><code>.</code><code>pwd</code>

<code>ccms:********    </code><code>#同server端相同</code>

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

启动进程

<code>/usr/bin/rsync</code> <code>--daemon</code>

<code>echo</code> <code>"/usr/bin/rsync --daemon"</code> <code>&gt;&gt; </code><code>/etc/init</code><code>.d</code><code>/rc</code><code>.</code><code>local</code>

到这里就差不多了,我这里使用的是screen 启动之前的server的脚本,然后就可以两边写文件进行测试了。

另外一些命令的具体用法 ,可以搜一下,作为参考,这里就不再详细说明了,抱歉!

本文转自 陈延宗 51CTO博客,原文链接:http://blog.51cto.com/407711169/1536503,如需转载请自行联系原作者

继续阅读