远程⽂件同步详解(RemoteFileSync)
1. 远程⽂件同步的常见⽅式:
1、cron + rsync
优点: 简单
缺点:定时执⾏,实时性⽐较差;另外,rsync同步数据时,需要扫描所有⽂件后进⾏⽐对,进⾏差量传输。如果⽂件数量达到了百万甚⾄千万量级,扫描所有⽂件将是⾮常耗时的。远程对⽐时发送所有的⽂件树or⽬录树属性,⽽且正在发⽣变化的往往是其中很少的⼀部分,这是⾮常低效的⽅式。
2. inotify + rsync
优点:⽐较简单
缺点:每个变更⽂件都使⽤了rsync。⽽每⼀次rsync都要建⽴SSH链接,这个其实是⽐较费时间的。⽂件频繁更新会产⽣不必要的rsync、进程or线程,⽐如不⽀持批量定时同步等。
3. lsyncd (python版本叫inosync)
优点:实时性⾼,速率可控,兼容了rsync协议,以及lua语⾔的灵活⾼效。
缺点:需要了解inotify,rsync的原理、运⽤,需要多引⼊⼀个lua,定制业务稍复杂。
4. Linux watchdog 事件监控⽂件
缺点:过于底层
5. 使⽤sersync , lipsync等类似⼯具
缺点:不利于统⼀标准运维,可⾃⾏研究
2. ⼏⼤实时同步⼯具⽐较
2.1 inotify + rsync
最近⼀直在寻求⽣产服务服务器上的同步替代⽅案,原先使⽤的是inotify + rsync,但随着⽂件数量的增⼤到100W+,⽬录下的⽂件列表就达20M,在⽹络状况不佳或者限速的情况下,变更的⽂件可能10来个才⼏M,却因此要发送的⽂件列表就达20M,严重减低的带宽的使⽤效率以及同步效率;更为要紧的是,加⼊inotifywait在5s内监控到10个⼩⽂件发⽣变化,便会触发10个rsync同步操作,结果就是真正需
要传输的才2-3M的⽂件,⽐对的⽂件列表就达200M。使⽤这两个组合的好处在于,它们都是最基本的软件,可以通过不同选项做到很精确的控制,⽐如排除同步的⽬录,同步多个模块或同步到多个主机。
搭建过程参考  。
2.2 sersync2
后来听同事说  这么个⼯具可以提⾼同步的性能,也解决了同步⼤⽂件时出现异常的问题,所以就尝试了⼀下。sersync是国内的⼀个开发者开源出来的,使⽤c++编写,采⽤多线程的⽅式进⾏同步,失败后还有重传机制,对临时⽂件过滤,⾃带crontab定时同步功能。⽹上看到有⼈说性能还不错,说⼀下我的观点:
国产开源,⽂档不是很全,在2011年之后就没更新了(googlecode都要快关闭了,其实可以转交其他⼈维护),⽹上关于它的使⽤和讨论都⽌于10年了
采⽤xml配置⽂件的⽅式,可读性⽐较好,但是有些原⽣的有些功能没有实现就没法使⽤了
⽆法实现多⽬录同步,只能通过多个配置⽂件启动多个进程
⽂件排除功能太弱。这个要看需求,不是每个⼈都需要排除⼦⽬录。⽽对于我的环境中,这个功能很重
要,⽽且排除的规则较多虽然提供插件的功能,但很鸡肋,因为软件本⾝没有持续更新,也没有看到贡献有其它插件出现(可能是我知识⾯不够,还⽤不到⾥⾯的refreshCDN plugin)。
只要执⾏rsync命令,就会对整个⽬录进⾏遍历,发送要⽐对的⽂件列表,然后再发送变化的⽂件。sersync只是减少了监听的事件,减少了rsync的次数——这已经是很⼤的改进,但每次rsync没办法改变。⽬前使⽤sersync2没什么问题,⽽且看了它的设计思路应该是⽐较科学的,特别是过滤队列的设计。双向同步看起来也是可以实现, 只是使⽤的不多。
2.3 lsyncd
Lysncd 实际上是lua语⾔封装了 inotify 和 rsync ⼯具,采⽤了 Linux 内核(2.6.13 及以后)⾥的 inotify 触发机制,然后通过rsync去差异同步,达到实时的效果。我认为它最令⼈称道的特性是,完美解决了 inotify + rsync海量⽂件同步带来的⽂件频繁发送⽂件列表的问题—— 通过时间延迟或累计触发事件次数实现。另外,它的配置⽅式很简单,lua本⾝就是⼀种配置语⾔,可读性⾮常强。lsyncd也有多种⼯作模式可以选择,本地⽬录cp,本地⽬录rsync,远程⽬录rsyncssh。
实现简单⾼效的本地⽬录同步备份(⽹络存储挂载也当作本地⽬录),⼀个命令搞定。
3. 使⽤ lsyncd 本地⽬录实时备份
这⼀节实现的功能是,本地⽬录source实时同步到另⼀个⽬录target,⽽在source下有⼤量的⽂件,并且有部分⽬录和临时⽂件不需要同步。
3.1 安装lsyncd
安装lsyncd极为简单,已经收录在ubuntu的官⽅镜像源⾥,直接通过apt-get install lsyncd就可以。
在Redhat系,可以⼿动去下载安装,但⾸先你得安装两个依赖yum install lua lua-devel。也可以通过在线安装,需要epel-release扩展包:
1
2# yum install lsyncd
源码编译安装
从源码编译安装可以使⽤最新版的lsyncd程序,但必须要相应的依赖库⽂件和编译⼯具:yum install lua lua-devel asciidoc cmake。
从  上下载的lsyncd-2.1.,直接./configure、make && make install就可以了。
从github上下载 的2.1.5版本使⽤的是 cmake 编译⼯具,⽆法./configure:
1 2 3 4# uzip lsyncd-master.zip
# cd lsyncd-master
# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/lsyncd-2.1.5 # make && make install
我这个版本编译时有个⼩bug,如果按照INSTALL在build⽬录中make,会提⽰:
1 2 3 4 5 6[100%] Generating doc/lsyncd.1
Updating the manpage
a2x: failed: source file not found: doc/ make[2]: *** [doc/lsyncd.1] Error 1
make[1]: *** [CMakeFiles/manpage.dir/all] Error 2 make: *** [all] Error 2
解决办法是要么直接在解压⽬录下cmake,不要mkdir build,要么在中搜索doc字符串,在前⾯加上${PROJECT_SOURCE_DIR}。
3.f
下⾯都是在编译安装的情况下操作。
3.2.1 lsyncd同步配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23# cd /usr/local/lsyncd-2.1.5
# mkdir etc var
# vi f
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 就可以完成实时同步了,默认的许多参数可以满⾜绝⼤部分需求,⾮常简单。
3.2.f配置选项说明
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为什么现在都用cmake
delay 累计事件,等待rsync同步延时时间,默认15秒(最⼤累计到1000个不可合并的事件)。也就是15s内监控⽬录下发⽣的改动,会累积到⼀次rsync同步,避免过于频繁的同步。(可合并的意思是,15s内两次修改了同⼀⽂件,最后只同步最新的⽂件)
excludeFrom 排除选项,后⾯指定排除的列表⽂件,如excludeFrom = "/lude",如果是简单的排除,可以使⽤exclude = LIST。
这⾥的排除规则写法与原⽣rsync有点不同,更为简单:
监控路径⾥的任何部分匹配到⼀个⽂本,都会被排除,例如/bin/foo/bar可以匹配规则foo
如果规则以斜线/开头,则从头开始要匹配全部
如果规则以/结尾,则要匹配监控路径的末尾
匹配任何字符,但不包括/
*匹配0或多个字符,但不包括/
**匹配0或多个字符,可以是/
delete 为了保持target与souce完全同步,Lsyncd默认会delete = true来允许同步删除。它除了false,还有startup、running值,请参考 。
rsync
(提⽰⼀下,delete和exclude本来都是rsync的选项,上⾯是配置在sync中的,我想这样做的原因是为了减少rsync的开销)bwlimit 限速,单位kb/s,与rsync相同(这么重要的选项在⽂档⾥竟然没有标出)
compress 压缩传输默认为true。在带宽与cpu负载之间权衡,本地⽬录同步可以考虑把它设为false
perms 默认保留⽂件权限。
其它rsync的选项
其它还有rsyncssh模式独有的配置项,如host、targetdir、rsync_path、password_file,见后⽂⽰例。rs
yncOps={"-avz","--delete"}这样的写法在2.1.*版本已经不⽀持。
3.3 启动lsyncd
使⽤命令加载配置⽂件,启动守护进程,⾃动同步⽬录操作。
lsyncd -log Exec /usr/local/lsyncd-2.1.5/f
3.f其它模式⽰例
以下配置本⼈都已经过验证可⾏,必须根据实际需要裁剪配置:
1 2 3 4 5 6settings {
logfile ="/usr/local/lsyncd-2.1.5/var/lsyncd.log",
statusFile ="/usr/local/lsyncd-2.1.5/var/lsyncd.status",    inotifyMode = "CloseWrite",
maxProcesses = 8,
}
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 }
-- I. 本地⽬录同步,direct:cp/rm/mv。适⽤:500+万⽂件,变动不⼤sync {
default.direct,
source = "/tmp/src",
target = "/tmp/dest",
delay = 1
maxProcesses = 1
}
-- II. 本地⽬录同步,rsync模式:rsync
sync {
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 daemon
sync {
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 shell
sync {
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,效果与上⾯相同

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。