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;ls
lbash.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.conf
settings {
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.log
Tue 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.log
Tue 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 user
fs.inotify.max_user_watches = 1048576
# sysctl -p

现在他就没有这个限制了^^