标题:lsyncd实时同步搭建指南——取代rsync+inotify 出处:向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除 时间:Tue, 15 Aug 2017 14:12:30 +0000 作者:jackxiang 地址:http://jackxiang.com/post/9413/ 内容: 背景:做同步有Rsyncd,有配置版本的sersync,使用过,这儿介绍了一个新的东西:lsyncd,值得尝试。 参考:http://www.datura.me/2017/09/22/lsyncd%E5%AE%9E%E7%8E%B0%E6%96%87%E4%BB%B6%E7%9B%AE%E5%BD%95%E5%90%8C%E6%AD%A5%E7%AE%80%E8%A6%81%E8%AF%B4%E6%98%8E/ Sync里面是定义同步参数,指定默认以直接模式direct运行。Lsyncd支持rsync、rsyncssh、direct三种模式。 default.rsync, sync{ default.rsync, --default.rsyncssh,or default.direct, source ="/usr/local/src/aa", rpm -qpl lsyncd-2.1.5-0.el6.x86_64.rpm /etc/logrotate.d/lsyncd /etc/lsyncd.conf /etc/rc.d/init.d/lsyncd /etc/sysconfig/lsyncd /usr/bin/lsyncd /var/log/lsyncd /var/run/lsyncd 实践如下: mkdir -p /usr/local/lsyncd-2.1.5/etc/ mkdir -p /usr/local/lsyncd-2.1.5/var/ touch /usr/local/lsyncd-2.1.5/var/lsyncd.log chmod -R 777 /usr/local/lsyncd-2.1.5/var/lsyncd.log chmod -R 777 /usr/local/lsyncd-2.1.5/var tail -f /usr/local/lsyncd-2.1.5/var/lsyncd.log Thu Oct 26 16:36:04 2017 Normal: recursive startup rsync: /backup/yum.qr.cntv.net/ -> /data/www/ Thu Oct 26 16:36:04 2017 Exec: /usr/local/rsync/bin/rsync [--delete] [--ignore-errors] [-gpzsoltD] [--bwlimit=2000] [-r] [/backup/yum.qr.cntv.net/] [/data/www/] 2.1 安装lsyncd 安装lsyncd极为简单,已经收录在ubuntu的官方镜像源里,直接通过apt-get install lsyncd就可以。 在Redhat系(我的环境是CentOS 6.2 x86_64 ),可以手动去下载 lsyncd-2.1.5-6.fc21.x86_64.rpm,但首先你得安装两个依赖yum install lua lua-devel。也可以通过在线安装,需要epel-release扩展包: # rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm # yum install lsyncd 源码编译安装 从源码编译安装可以使用最新版的lsyncd程序,但必须要相应的依赖库文件和编译工具:yum install lua lua-devel asciidoc cmake。 从 googlecode lsyncd 上下载的lsyncd-2.1.5.tar.gz,直接./configure、make && make install就可以了。 从github上下载lsyncd-master.zip 的2.1.5版本使用的是 cmake 编译工具,无法./configure: # uzip lsyncd-master.zip # cd lsyncd-master # cmake -DCMAKE_INSTALL_PREFIX=/usr/local/lsyncd-2.1.5 # make && make install 我这个版本编译时有个小bug,如果按照INSTALL在build目录中make,会提示: [100%] Generating doc/lsyncd.1 Updating the manpage a2x: failed: source file not found: doc/lsyncd.1.txt make[2]: *** [doc/lsyncd.1] Error 1 make[1]: *** [CMakeFiles/manpage.dir/all] Error 2 make: *** [all] Error 2 解决办法是要么直接在解压目录下cmake,不要mkdir build,要么在CMakeList.txt中搜索doc字符串,在前面加上${PROJECT_SOURCE_DIR}。 2.2 lsyncd.conf 下面都是在编译安装的情况下操作。 2.2.1 lsyncd同步配置 # cd /usr/local/lsyncd-2.1.5 # mkdir etc var # vi etc/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 = 7, -- nodaemon =true, } sync { default.rsync, source = "/tmp/src", target = "/tmp/dest", -- excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst", rsync = { binary = "/usr/bin/rsync", archive = true, compress = true, verbose = true } } 到这启动 lsycnd 就可以完成实时同步了,默认的许多参数可以满足绝大部分需求,非常简单。 2.2.2 lsyncd.conf配置选项说明 settings 里面是全局设置,--开头表示注释,下面是几个常用选项说明: logfile 定义日志文件 stausFile 定义状态文件 nodaemon=true 表示不启用守护模式,默认 statusInterval 将lsyncd的状态写入上面的statusFile的间隔,默认10秒 inotifyMode 指定inotify监控的事件,默认是CloseWrite,还可以是Modify或CloseWrite or Modify maxProcesses 同步进程的最大个数。假如同时有20个文件需要同步,而maxProcesses = 8,则最大能看到有8个rysnc进程 maxDelays 累计到多少所监控的事件激活一次同步,即使后面的delay延迟时间还未到 sync 里面是定义同步参数,可以继续使用maxDelays来重写settings的全局变量。一般第一个参数指定lsyncd以什么模式运行:rsync、rsyncssh、direct三种模式: default.rsync :本地目录间同步,使用rsync,也可以达到使用ssh形式的远程rsync效果,或daemon方式连接远程rsyncd进程; default.direct :本地目录间同步,使用cp、rm等命令完成差异文件备份; default.rsyncssh :同步到远程主机目录,rsync的ssh模式,需要使用key来认证 source 同步的源目录,使用绝对路径。 target 定义目的地址.对应不同的模式有几种写法: /tmp/dest :本地目录同步,可用于direct和rsync模式 172.29.88.223:/tmp/dest :同步到远程服务器目录,可用于rsync和rsyncssh模式,拼接的命令类似于/usr/bin/rsync -ltsd --delete --include-from=- --exclude=* SOURCE TARGET,剩下的就是rsync的内容了,比如指定username,免密码同步 172.29.88.223::module :同步到远程服务器目录,用于rsync模式 三种模式的示例会在后面给出。 init 这是一个优化选项,当init = false,只同步进程启动以后发生改动事件的文件,原有的目录即使有差异也不会同步。默认是true delay 累计事件,等待rsync同步延时时间,默认15秒(最大累计到1000个不可合并的事件)。也就是15s内监控目录下发生的改动,会累积到一次rsync同步,避免过于频繁的同步。(可合并的意思是,15s内两次修改了同一文件,最后只同步最新的文件) excludeFrom 排除选项,后面指定排除的列表文件,如excludeFrom = "/etc/lsyncd.exclude",如果是简单的排除,可以使用exclude = LIST。 这里的排除规则写法与原生rsync有点不同,更为简单: 监控路径里的任何部分匹配到一个文本,都会被排除,例如/bin/foo/bar可以匹配规则foo 如果规则以斜线/开头,则从头开始要匹配全部 如果规则以/结尾,则要匹配监控路径的末尾 ?匹配任何字符,但不包括/ *匹配0或多个字符,但不包括/ **匹配0或多个字符,可以是/ 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.conf 摘自:https://segmentfault.com/a/1190000002737213 Generated by Jackxiang's Bo-blog 2.1.1 Release