需求:
线上也业务需求,意思就是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>&></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>&>> $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>&>> $synclog</code>
<code> </code><code>echo</code> <code>"-----------------------------------------------------------"</code> <code>&>> $synclog</code>
<code> </code><code>echo</code> <code>""</code> <code>&>> $synclog</code>
<code> </code><code>else</code>
<code> </code><code>echo</code> <code>"`date +%F-%H:%M` $line was rsynced Failed !!!"</code> <code>&>> $synclog</code>
<code> </code><code>fi</code>
<code>done</code> <code>< $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>>> </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,如需转载请自行联系原作者