inotify-rsync实时同步脚本

标签: inotify rsync 实时 | 发表时间:2010-12-13 16:00 | 作者:(author unknown) lostsnow
出处:http://blog.leezhong.com/

2010-12-13

为什么要写这个脚本

rsync是linux下一款非常强大的同步工具,采用差异同步的方法,只上传文件/文件夹的不同部分,同时可以对上传部分先进行压缩,所以rsync的传输效率是很高的。

但rsync也有缺点,最大的问题就是每次执行rsync命令都会遍历目标目录,当文件不多时,这没什么问题,一旦文件数到了一定规模,那么每次遍历都会消耗很多资源。但事实上改动的文件并不多,如果可以只sync改动的文件,问题就迎刃而解了。

这时就得请出本文的另一个主角:inotify。inotify是一种文件系统的变化通知机制,如文件增加、删除等事件可以立刻让用户态得知。要使用inotify,linux的内核版本不能低于2.6.13

~$ uname -a
Linux lzyy-laptop 2.6.32-26-generic #48-Ubuntu SMP Wed Nov 24 09:00:03 UTC 2010 i686 GNU/Linux

但inotify只提供了C语言接口,不方便调用,所以我们需要先安装inotify-tools,大多数的linux发行版应该都可以直接通过apt-get或yum来安装。

脚本说明与使用

其实前人已经做了类似的工作,不过有些地方尚未完善(如删除文件的同步),于是我改进和简化了一下。

服务端

以下是服务端脚本,运行这段脚本后,这个机器上对应的文件夹将会同步到其他机器上

#!/bin/bash

###########################
# 在这里配置本地文件夹,目标host,目标的rsync_module。rsync_module在同步机器的/etc/rsyncd.conf文件中配置
# 逗号前后不要有空格
sync[0]='/path/to/local/dir,1.2.3.4,test' # localdir,host,rsync_module
# sync[1]='/path/to/local/dir,host,rsync_module'
###########################

for item in ${sync[@]}; do

dir=`echo $item | awk -F"," '{print $1}'`
host=`echo $item | awk -F"," '{print $2}'`
module=`echo $item | awk -F"," '{print $3}'`

inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w%f %e' \
 --event CLOSE_WRITE,create,move,delete  $dir | while read  date time file event
	do
		echo $event'-'$file
		case $event in
			MODIFY|CREATE|MOVE|MODIFY,ISDIR|CREATE,ISDIR|MODIFY,ISDIR)
				if [ "${file: -4}" != '4913' ]  && [ "${file: -1}" != '~' ]; then
					cmd="rsync -avz --exclude='*' --include=$file $dir $host::$module"
					# echo $cmd
					$cmd
				fi
				;;

			MOVED_FROM|MOVED_FROM,ISDIR|DELETE|DELETE,ISDIR)
				if [ "${file: -4}" != '4913' ]  && [ "${file: -1}" != '~' ]; then
					cmd="rsync -avz --delete-excluded --exclude="$file" $dir $host::$module"
					# echo $cmd
					$cmd
				fi
				;;
		esac
	done &
done

运行脚本

cd /path/to/inotify-rsync
chmod +x inotify-rsync.sh
./inotify-rsync

可以把这个脚本设置为开机启动,这样就可以自动同步了。

同步端

同步机器上要做两件事

1. 设置/etc/rsyncd.conf文件

# vim /etc/rsyncd.conf

uid=root
gid=root
# 这个test就是上面脚本中用到的rsync_module名
# path指定同步过来的文件存放的路径
# 如果只允许部分ip的机器进行同步的话,设置allow为 192.168.1.1/100 类似的格式
[test]
path=/path/to/your/dir
allow *

2. 启动rsync daemon

rsync --daemon

其他

金山的周洋同学用C++写了个Sersync,也是利用的inotify+rsync来实现实时同步,有兴趣的可以关注一下

相关 [inotify rsync 实时] 推荐:

inotify-rsync实时同步脚本

- lostsnow - 无网不剩
rsync是linux下一款非常强大的同步工具,采用差异同步的方法,只上传文件/文件夹的不同部分,同时可以对上传部分先进行压缩,所以rsync的传输效率是很高的. 但rsync也有缺点,最大的问题就是每次执行rsync命令都会遍历目标目录,当文件不多时,这没什么问题,一旦文件数到了一定规模,那么每次遍历都会消耗很多资源.

lsyncd实时同步搭建指南——取代rsync+inotify

- - SegmentFault 最新的文章
使用这两个组合的好处在于,它们都是最基本的软件,可以通过不同选项做到很精确的控制,比如排除同步的目录,同步多个模块或同步到多个主机. 搭建过程参考 Linux下同步工具inotify+rsync使用详解 或 这里. 后来听同事说 sersync 这么个工具可以提高同步的性能,也解决了同步大文件时出现异常的问题,所以就尝试了一下.

rsync+inotify-tools实现数据实时同步方案_Ljohn的技术博客_51CTO博客

- -
与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等. 随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足.

利用Inotify和Rsync将web工程文件自动同步到多台应用服务器

- - CSDN博客推荐文章
背景:需要搭建一套跟线上一模一样的环境,用来预发布,这是其中的web分发的一个小模块的实现过程. 1.1,Inotify工具. Inotify,它是一个内核用于通知用户空间程序文件系统变化的机制. 众所周知,Linux 桌面系统与 MAC 或 Windows 相比有许多不如人意的地方,为了改善这种状况,开源社区提出用户态需要内核提供一些机制,以便用户态能够及时地得知内核或底层硬件设备发生了什么,从而能够更好地管理设备,给用户提供更好的服务,如hotplug、udev 和 inotify 就是这种需求催生的.

翻译《The rsync algorithm》

- AWard - CSDN博客推荐文章
     最近在学习Rsync工具,在对Rsync算法大加赞赏之余,决定将《The rsync algorithm 》翻译,有不正之处 还请指正. 安德鲁Tridgell 保罗马克拉斯  部计算机科学 澳大利亚国立大学 堪培拉,ACT 0200,澳大利亚.        本报告介绍了将一台计算机上的文件内容同步到另一台机器上的文件的算法(同步后保证文件内容需要一致).

linux配置ssh+rsync

- - CSDN博客推荐文章
sftp    文件共享 类似ftp  ssh  secure file transfer client. scp    文件共享 类似cp. #PermitRootLogin yes    改成no 禁止root直接登录. #Port 22    改变ssh的默认端口号   要打开注释. 登录  ssh  [email protected]  然后输入密码就好了.

Rsync同步使用

- - 开源软件 - ITeye博客
rsync是类unix系统下的数据镜像备份工具——remote sync. /etc/rsyncd/rsyncd.conf 是你刚才编辑的rsyncd.conf的位置. 也可以在/etc/rc.d/rc.local里加入让系统自动启动等. rsync -参数 用户名@同步服务器的IP::rsyncd.conf中那个方括号里的内容 本地存放路径 如:.

rsync 的核心算法

- - 酷壳 - CoolShell.cn
rsync是unix/linux下同步文件的一个高效算法,它能同步更新两处计算机的文件与目录,并适当利用查找文件中的不同块以减少数据传输. rsync中一项与其他大部分类似程序或协定中所未见的重要特性是镜像是只对有变更的部分进行传送. rsync可拷贝/显示目录属性,以及拷贝文件,并可选择性的压缩以及递归拷贝.

rsync服务安装和配置

- - CSDN博客推荐文章
作者: javaboy2012. 如果安装了,则需要做如下配置和修改. 修改 /etc/xinetd.d/rsync 下的内容. disable = yes 改为 disable = no. 新建:vi /etc/rsyncd.conf.  注意:客户端必须执行同步命令触发同步操作..  要实现定时同步,可以通过crontab -e加入定时任务来实现..

Linux下监测目录或文件的变化---inotify

- - CSDN博客研发管理推荐文章
  inotify是用来监视文件系统事件的机制,在linux 2.6.13内核中引入. 该机制可以用来监视文件和目录,当文件或目录发生变化时,内核会将文件或目录的变化发送给inotify文件描述符,在应用层只需调用read()就可以读取这些事件,非常的方便. 更好的是,inotify文件描述符还可以使用select、poll、epoll这些接口来监听,当有事件发生是,inotify文件描述符会可读.