Lsyncd | 使用lsyncd同步文件目录
一、lsyncd是什么?
前几天有个同事问道说怎么去同步远程服务器上的文件或目录,第一反应当然是想到说用rsync,但是时效性有点差(调用cron),刚好在vpsee的博客看到有介绍说用lsyncd,它采用了Linux内核(2.6.13 及以后)里的inotify触发机制,这种机制可以做到只有在需要(变化)的时候才去同步。lsyncd密切监测本地服务器上的参照目录,当发现目录下有文件或目录变更后,立刻通知远程服务器,并通过rsync 或rsync+ssh方式实现文件同步。
二、lsyncd安装
CentOS官方源没有包含lsyncd,需要去安装epel源才有
# yum install lsyncd
三、lsyncd使用
lsyncd安装完后默认并没有提供配置文件,不过我们可以去/usr/share/doc/lsyncd/examples找相关例子
# cd /usr/share/doc/lsyncd-*/examples;lslbash.lua lecho.lua lgforce.lua lpostcmd.lua lrsync.lua lrsyncssh.lua# vim lrsyncssh.lua-- Simple example for default rsync.settings = { statusFile = "/tmp/lsyncd.stat", statusInterval = 1,}sync{ default.rsync, source="src", target="trg",}
备注
lsyncd的配置文件使用的是lua风格的。更多详情请访问 Lua
了解完之后我们就来实验一番先。首先先配置lsyncd,格式很简单,注意source、host、targetdir部分即可
# vim /etc/lsyncd.confsettings { logfile = "/var/log/lsyncd/lsyncd.log", statusFile = "/var/log/lsyncd/lsyncd.status"}sync { default.rsyncssh, source = "/root/clavinli", host = "10.2.68.38", targetdir = "/tmp/clavinli", ssh = { port = 36000 }}
因为这里使用rsyncssh进行同步,所以还需要配置root账号无密码ssh登录,然后在远程机器上创建目录/tmp/clavinli
# ssh-keygen -t rsa# ssh-copy-id root@10.2.68.38# ssh -p36000 root@10.2.68.38# mkdir /tmp/clavinli
配置好之后在本地机器上启动lsyncd服务,这时本地机器的/root/clavinli目录就会同步到10.2.68.38的/tmp/clavinli目录了
# tail -f /var/log/lsyncd/lsyncd.logTue Nov 12 14:09:27 2013 Normal: --- TERM signal, fading ---Tue Nov 12 14:09:28 2013 Normal: recursive startup rsync: /root/clavinli/ -> 10.2.68.38:/tmp/clavinli/
备注
lsyncd使用rsyncssh同步的时候是调用ssh的22端口,但因为我这边使用了非常规的ssh端口,因此这里需要额外添加个ssh的选项
四、lsyncd优化
在使用lsyncd的时候做了个测试,创建大量的文件(超过10000)会提示:
# tail -f /var/log/lsyncd/lsyncd.logTue Nov 12 14:56:23 2013 Error: Terminating since out of inotify watches.Consider increasing /proc/sys/fs/inotify/max_user_watches
刚开始就提到说lsyncd使用了inotify触发机制,但是监控的文件数是有限的(默认是8192)
# vim /etc/sysctl.conf# Controls the maximum inotify watches per userfs.inotify.max_user_watches = 1048576# sysctl -p
现在他就没有这个限制了^^