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日志,常见问题就是权限问题之类。请注意配置文件中的用户和同步目录本身权限匹配。
我有两个服务器A和B,上面都启动了lsync和rsync,现在发现一个问题。
我1点启动同步任务,进程OK文件都是正常同步的,但是在2点的时候同步进程死掉,这期间文件发生了变化(文件夹里多了好多的新文件)。然后我3点的时候重启了同步任务,此时在A或者B上文件变化都会同步,但是2~3点进程死掉之间的文件变化,却迟迟不见同步,请问怎么办?
你可以尝试清除或者修改一下/usr/local/lsyncd/log/lsyncd.status这个文件,这是同步状态文件,应该是记录了同步状态