lsyncd实时同步搭建指南——取代rsync+inotify( 三 )

  • delete 为了保持target与souce完全同步,Lsyncd默认会delete = true来允许同步删除 。它除了false,还有startup、running值,请参考 Lsyncd 2.1.x ‖ Layer 4 Config ‖ Default Behavior 。
  • rsync
    (提示一下,delete和exclude本来都是rsync的选项,上面是配置在sync中的,我想这样做的原因是为了减少rsync的开销)
    • bwlimit 限速,单位kb/s,与rsync相同(这么重要的选项在文档里竟然没有标出)
    • compress 压缩传输默认为true 。在带宽与cpu负载之间权衡,本地目录同步可以考虑把它设为false
    • perms 默认保留文件权限 。
    • 其它rsync的选项
    其它还有rsyncssh模式独有的配置项,如host、targetdir、rsync_path、password_file,见后文示例 。rsyncOps={"-avz","--delete"}这样的写法在2.1.*版本已经不支持 。
    lsyncd.conf可以有多个sync,各自的source,各自的target,各自的模式,互不影响 。
    2.3 启动lsyncd使用命令加载配置文件,启动守护进程,自动同步目录操作 。
    lsyncd -log Exec /usr/local/lsyncd-2.1.5/etc/lsyncd.conf2.4 lsyncd.conf其它模式示例以下配置本人都已经过验证可行,必须根据实际需要裁剪配置:
    settings {logfile ="/usr/local/lsyncd-2.1.5/var/lsyncd.log",statusFile ="/usr/local/lsyncd-2.1.5/var/lsyncd.status",inotifyMode = "CloseWrite",maxProcesses = 8,}-- I. 本地目录同步,direct:cp/rm/mv 。适用:500+万文件,变动不大sync {default.direct,source= "/tmp/src",target= "/tmp/dest",delay = 1maxProcesses = 1}-- II. 本地目录同步,rsync模式:rsyncsync {default.rsync,source= "/tmp/src",target= "/tmp/dest1",excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst",rsync= {binary = "/usr/bin/rsync",archive = true,compress = true,bwlimit= 2000}}-- III. 远程目录同步,rsync模式 + rsyncd daemonsync {default.rsync,source= "/tmp/src",target= "syncuser@172.29.88.223::module1",delete="running",exclude = { ".*", ".tmp" },delay = 30,init = false,rsync= {binary = "/usr/bin/rsync",archive = true,compress = true,verbose= true,password_file = "/etc/rsyncd.d/rsync.pwd",_extra= {"--bwlimit=200"}}}-- IV. 远程目录同步,rsync模式 + ssh shellsync {default.rsync,source= "/tmp/src",target= "172.29.88.223:/tmp/dest",-- target= "root@172.29.88.223:/remote/dest",-- 上面target,注意如果是普通用户,必须拥有写权限maxDelays = 5,delay = 30,-- init = true,rsync= {binary = "/usr/bin/rsync",archive = true,compress = true,bwlimit= 2000-- rsh = "/usr/bin/ssh -p 22 -o StrictHostKeyChecking=no"-- 如果要指定其它端口,请用上面的rsh}}-- V. 远程目录同步,rsync模式 + rsyncssh,效果与上面相同sync {default.rsyncssh,source= "/tmp/src2",host= "172.29.88.223",targetdir = "/remote/dir",excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst",-- maxDelays = 5,delay = 0,-- init = false,rsync= {binary = "/usr/bin/rsync",archive = true,compress = true,verbose= true,_extra = {"--bwlimit=2000"},},ssh= {port=1234}}上面的内容几乎涵盖了所有同步的模式,其中第III个要求像rsync一样配置rsyncd服务端,见本文开头 。第IV、V配置ssh方式同步,达到的效果相同,但实际同步时你会发现每次同步都会提示输入ssh的密码,可以通过以下方法解决:
    在远端被同步的服务器上开启ssh无密码登录,请注意用户身份:
    user$ ssh-keygen -t rsa一路回车...user$ cd ~/.sshuser$ cat id_rsa.pub >> authorized_keys把id_rsa私钥拷贝到执行lsyncd的机器上
    user$ chmod 600 ~/.ssh/id_rsa测试能否无密码登录user$ ssh user@172.29.88.2233. lsyncd的其它功能lsyncd的功能不仅仅是同步,官方手册 Lsyncd 2.1.x ‖ Layer 2 Config ‖ Advanced onAction 高级功能提到,还可以监控某个目录下的文件,根据触发的事件自己定义要执行的命令,example是监控某个某个目录,只要是有jpg、gif、png格式的文件参数,就把它们转成pdf,然后同步到另一个目录 。正好在我运维的一个项目中有这个需求,现在都是在JAVA代码里转换,还容易出现异常,通过lsyncd可以代替这样的功能 。但,门槛在于要会一点点lua语言(根据官方example还是可以写出来) 。
    另外偶然想到个问题,同时设置了maxDelays和delay,当监控目录一直没有文件变化了,也会发生同步操作,虽然没有可rsync的文件 。
    TO-DO: