0.介绍
Lsyncd实际上是lua语言封装了inotify和rsync工具,采用了Linux内核(2.6.13及以后)里的inotify触发机制,然后通过rsync去差异同步,达到实时的效果。特别适合大批量文件级别的实时同步,且不需要对底层做任何修改,目前在redhat linux 6.5的生产环境上已经使用了大半年了,非常稳定。
这次在生产录音文件服务器上部署,主要是为了同步录音文件到异地备份服务器上。
1.环境说明
SUSE Linux Enterprise Server 11 SP3
2.部署lsyncd命令
1)从当前redhat linux 6的生产环境下拷贝lsyncd、liblua-5.1.so文件下来(因为在这个版本的SUSE上从0开始配置非常麻烦,耗时不说,还不一定成功,经过多次尝试都不行之后,忽然想到能否直接拷贝现成的过来,因为内核版本相近,理论上是没问题的!)
$ (which lsyncd) .
/usr/lib64/liblua-5.1.so
2)将以上文件放到原位置并测试,只要不报错,基本上就没问题
$ ./lsyncd -version
Version: 2.1.5
3) 可执行文件和so文件
链接:https://share.weiyun.com/hCPSWH1a 密码:zazwq2
3.同步配置
1)服务端rsyncd配置
$ cat /etc/rsyncd.conf
uid = bkadmin
gid = bkadmin
address = 10.1.1.1
port = 873
log file = /var/log/rsyncd.log
pidfile = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
secrets file = /etc/rsync.pass
motd file = /etc/rsyncd.Motd
[server_bak]
path = /backup_2/server_bak
auth users = bkadmin
read only = no
$ cat /etc/rsync.pass
bkadmin:123456
#必须设置权限为600
$ chmod 600 /etc/rsync.pass
#重启xinetd服务
$ /etc/init.d/xinetd restart
2)本机创建lsyncd配置
$ echo '123456' > /etc/rsync.pass
#必须设置权限为600
$ chmod 600 /etc/rsync.pass
$ cat /etc/lsyncd.conf
settings {
-- 传输日志文件
logfile ="/var/log/lsyncd_zz.log",
statusFile ="/var/run/lsyncd.status",
inotifyMode = "CloseWrite or Modify",
maxProcesses = 1,
init=false,
nodaemon=false
}
-- 同步至异地备份服务器
sync {
default.rsync,
source = "/share/", -- 需要同步的目录
target = "[email protected]::server_bak",
delete="running",
-- exclude = { ".*", ".tmp" },
-- delay = 30, -- 传输密度,30s传输一次
delay = 60,
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
verbose = true,
password_file = "/etc/rsync.pass",
_extra = {"--bwlimit=256"} -- 限制传输带宽
}
}
3) 启动
#前台启动,检查服务是否正常传输文件
$ lsyncd -nodaemon /etc/lsyncd_zz.conf
#后台启动
$ lsyncd /etc/lsyncd_zz.conf
4.问题
当需要同步的数据量上百G时,进程起来一会后,自动停了。查看日志:因为同步的数据量较大,需要lsyncd监测的inode数量超过了自身默认的最大监控数量,所以报错
$ tail -f /var/log/lsyncd/lsyncd.log
遇到:Error: Terminating since out of inotify watches.
Consider increasing /proc/sys/fs/inotify/max_user_watches
解决办法:
echo 65535000 > /proc/sys/fs/inotify/max_user_watches
这个值改成多少需要根据源目录所在分区的的inode多少来定(使用df -i查看该分区总的inode数量)
$ sysctl -p
最后重启 lsyncd进程