rsync + lsyncd 实现文件实时同步
此前,我们曾经介绍过文件同步常用的几种方案。
- rsync + crontab
- rsync + inotify
- rsync + sersync
它们都有各自的应用场景,每一种方案都有其应用场景。
在 rsync + inotify 或 rsync + sersync 解决方案中,有一个共同的缺点,就是当文件修改的比较频繁时,会不断的产生同步操作。比如说程序的日志文件,日志文件的修改频率是非常频繁的,如果是用上述的两种方案,则会不断的触发同步操作。
lsyncd 有一个非常好的特性,它支持延时同步,即会把修改次数累积到一定的数量或时间后再触发同步操作,这样一来,使得同步不那么的频繁了。
lsyncd 配置
以下是 lsyncd 的一个完整的配置示例及配置项说明。
settings {
--定义日志文件
logfile ="/var/log/lsyncd/lsyncd.log",
--定义状态文件
statusFile ="/var/log/lsyncd/lsyncd.status",
--将lsyncd的状态写入上面的statusFile的间隔,默认10秒
statusInterval = 10,
--指定inotify监控的事件,默认是CloseWrite,还可以是Modify或CloseWrite or Modify
inotifyMode = "CloseWrite or Modify",
--同步进程的最大个数。假如同时有20个文件需要同步,而maxProcesses = 8,则最大能看到有8个rysnc进程
maxProcesses = 15,
--累计到多少所监控的事件激活一次同步,即使后面的delay延迟时间还未到。
maxDelays=10,
}
sync {
--default.rsync:连接远程rsyncd进程
--default.direct:本地目录间同步
--default.rsyncssh:同步到远程主机目录,rsync的ssh模式,需要使用key来认证
default.rsync,
--同步的源目录,使用绝对路径。
source = "/usr/local/sersync/data",
--定义目的地址,对应不同的模式有不同的写法。这里是远程rsync,使用“用户名@ip::模块名”写法。
target = "192.168.4.23::gzb",
--这是一个优化选项,当init = false,只同步进程启动以后发生改动事件的文件,原有的目录即使有差异也不会同步。默认是true
init = true,
--是否同步删除,除了running选项,还有true、false和startup
--true是删除
--false是不删除
--startup是仅在启动时将源目录和目的目录来一次完全同步,lsyncd运行时的源目录的删除文件在目的目录中不做删除操作
--running是启动时不对源、目的目录进行完全同步,lsyncd运行时源目录删除的文件,目的目录也会被删除。
delete="running",
--排除的文件,这里排除了一些隐藏文件,和文件打开是时的临时文件
exclude = { ".tmp","*.swp","*.swx", "*.*~", "*.swpx" },
--排除选项,后面指定排除的列表文件,如excludeFrom = "/etc/lsyncd.exclude",如果是简单的排除,可以使用exclude选项
--这里的排除规则写法与原生rsync有点不同,更为简单:
--监控路径里的任何部分匹配到一个文本,都会被排除,例如/bin/foo/bar可以匹配规则foo
-- 如果规则以斜线/开头,则从头开始要匹配全部
-- 如果规则以/结尾,则要匹配监控路径的末尾
-- ?匹配任何字符,但不包括/
-- *匹配0或多个字符,但不包括/
-- **匹配0或多个字符,可以是/
--excludeFrom = "/etc/lsyncd.exclude"
-- 累计事件,等待rsync同步延时时间,默认15秒。为0即实时同步。
delay = 15,
rsync = {
--本地rsync命令路径
binary = "/usr/bin/rsync",
archive = true,
compress = true,
verbose = true,
--远程rsyncd的密码
--password_file = "/etc/rsyncd/rsync.passwd",
}
}
除此之外,rsync 配置段还有一些高级的选项参数。
parameter | = | TYPE | default value | comment |
---|---|---|---|---|
acls | = | BOOL | false | |
append | = | BOOL | false | (Lsyncd >= 2.2.0) |
append-verify | = | BOOL | false | (Lsyncd >= 2.2.0) |
archive | = | BOOL | false | |
backup | = | BOOL | false | (Lsyncd >= 2.2.0) |
backup_dir | = | DIR | false | (Lsyncd >= 2.2.0) |
binary | = | FILENAME | "/usr/bin/rsync" | Lsyncd calls this binary as rsync |
checksum | = | BOOL | false | |
chmod | = | STRING | (Lsyncd >= 2.2.0) | |
chown | = | USER:GROUP | (Lsyncd >= 2.2.0) | |
compress | = | BOOL | false | |
copy_dirlinks | = | BOOL | false | (Lsyncd >= 2.2.0) |
copy_links | = | BOOL | false | |
cvs_exclude | = | BOOL | ||
dry_run | = | BOOL | false | |
exclude | = | PATTERN | TABLE of PATTERNs also allowed | |
excludeFrom | = | FILENAME | ||
executability | = | BOOL | false | |
existing | = | BOOL | false | (Lsyncd >= 2.2.0) |
group | = | BOOL | false | |
groupmap | = | STRING | (Lsyncd >= 2.2.0) | |
hard_links | = | BOOL | false | |
ignore_times | = | BOOL | false | |
inplace | = | BOOL | false | (Lsyncd >= 2.1.6) |
ipv4 | = | BOOL | false | |
ipv6 | = | BOOL | false | |
links | = | BOOL | true | |
one_file_system | = | BOOL | false | |
owner | = | BOOL | false | |
password_file | = | FILENAME | (Lsyncd >= 2.1.2) | |
perms | = | BOOL | false | |
protect_args | = | BOOL | true | |
prune_empty_dirs | = | BOOL | false | |
quiet | = | BOOL | false | |
rsh | = | COMMAND | ||
rsync_path | = | PATH | (path to rsync on remote host) | |
sparse | = | BOOL | false | |
suffix | = | SUFFIX | (Lsyncd >= 2.2.0) | |
temp_dir | = | DIR | ||
times | = | BOOL | true | |
update | = | BOOL | false | |
usermap | = | STRING | (Lsyncd >= 2.2.0) | |
verbose | = | BOOL | false | |
whole_file | = | BOOL | false | |
xattrs | = | BOOL | false | |
_extra | = | TABLE of STRINGS. | If absolutely needed, additional arguments can be specified as a TABLE of STRINGS(example: { "--omit-dir-times", "--omit-link-times" } ). Note that the underscore highlights this as workaround. If you need something that is not covered by the above options, please request it via a feature request on the project website. Most notably, do not add -r for recursive or -a which implies recursive, since Lsyncd will handle that by itself. Additionally do not add -R for relative, which will ruin Lsyncd <-> Rsync communication. |
lsyncd 的其他功能
lsyncd
的功能不仅仅是同步,官方手册 Config Layer 2: Advanced onAction 高级功能提到,还可以监控某个目录下的文件,根据触发的事件自己定义要执行的命令,example是监控某个某个目录,只要是有jpg、gif、png格式的文件参数,就把它们转成pdf,然后同步到另一个目录。