lsyncd+inotify+rsync低延迟同步文件

inotify是linux内核用于通知用户文件系统变化的接口。需要内核版本2.6.13以上才可以支持。
这里是一篇介绍:http://www.ibm.com/developerworks/cn/linux/l-inotifynew/

Lsyncd是一个开源程序,使用C编写,通过调用inotify接口监控指定目录的文件变化情况,来调用rsync做数据传输。
这里是Lsyncd的github主页:https://github.com/axkibe/lsyncd

目前手上有个项目,其实很简单,其他业务向这里写入大量的图片,需要做一个冷备机器,最好实时备份图片,以免坏盘等丢失。
整体结构:主服务器上启动lsyncd,主服务器为文件源,使用inotify通知lsyncd,实现低延迟实时rsync备份数据写入备服务器。备服务器启动rsyncd服务监听,接受主服务器的连接。(日志用系统logrotate轮转)

1.需要lsyncd 2.0.7包,依赖lua包。

lua-5.1.4-1.el5.art.x86_64.rpm
lua-devel-5.1.4-1.el5.art.x86_64.rpm
lua-static-5.1.4-1.el5.art.x86_64.rpm

2.Lsyncd安装和其他程序的普通安装方式相同:

./configure --prefix=/usr/local/lsyncd make && make install

3.写入内核参数,用于大量文件同步,防止文件数目溢出(为防止重启丢失需要,写入rc.local)

echo "5000000000" >/proc/sys/fs/inotify/max_user_watches
echo "10000000" >/proc/sys/fs/inotify/max_queued_events
echo "8192" >/proc/sys/fs/inotify/max_user_instances

4.Lsyncd启动方式:/usr/local/lsyncd/bin/lsyncd /usr/local/lsyncd/conf/xxx.conf

5.Lsyncd某配置:

settings = { 
   logfile    = "/usr/local/lsyncd/log/lsyncd.log", 
   statusFile = "/usr/local/lsyncd/log/lsyncd.status", 
   nodaemon   = false, 
} 
sync{
default.rsync, 
rsyncBinary="/usr/bin/rsync",
source="/var/www",
target="$IP::$rsyncd_name",
rsyncOpts = {"-lcogP", "--log-file=/usr/local/lsyncd/log/rsync.log"}
}

6.rsync端配置:/etc/rsyncd.conf
使用rsync –daemon启动

uid=xxx
gid=xxx
comment= xxx
path=/var/www
ignore errors = true
read only = no
#secrets file=/etc/rsync.pass
#auth users=xxx
timeout = 600
transfer logging = true
log file=/var/log/rsyncd.log
log format="%o [%a] %m %P (%u) %f %l"
lock file=/var/run/rsyncd.lock

如需要密码验证,请把密码文件属主变更为启动rsyncd服务的用户,权限改为600,否则无法正常传输。

7.如果启动正常,在主服务器需要同步的目录内touch个空文件,20秒内,从服务器会同步完成。如果有错误,可以看之前的lsyncd和rsync日志,常见问题就是权限问题之类。请注意配置文件中的用户和同步目录本身权限匹配。