描述
Lsyncd监视本地目录树事件监视器接口(inotify或fsevents)。它聚集并组合事件几秒钟,然后生成一个(或多个)进程(es)来同步这些更改。默认情况下,这是rsync。因此Lsyncd是一个轻量级的实时镜像解决方案,相对而言易于安装,不需要新的文件系统或块设备,也不会影响本地文件系统的性能。
Rsync + ssh是一种高级操作配置,它使用SSH来操作文件和目录,直接在目标上移动,而不是通过线路重新传输移动目标。
细粒度的定制可以通过配置文件来实现。自定义操作配置甚至可以从层级层次(从shell脚本到用Lua语言编写的代码)从头开始编写。这样可以实现简单,强大和灵活的配置。
Lsyncd 2.2.1在所有源计算机和目标计算机上都需要rsync> = 3.1。
许可证:GPLv2或任何后续的GPL版本。
何时使用
Lsyncd旨在将本地目录树与对远程镜像的预期更改的低配置文件进行同步。Lsyncd特别适用于将数据从安全区域同步到不太安全的区域。
其他同步工具
DRBD在块设备级别上运行。这对同步负载较重的系统很有用。另一方面,Lsyncd不要求您更改块设备和/或挂载点,允许您更改传输文件的uid / gid,通过rsync的单向性质分隔接收器。如果您要同步数据库,DRBD可能是更好的选择。
GlusterFS和BindFS使用FUSE-Filesystem来插入内核/用户空间文件系统事件。
镜像是一种异步同步工具,它使用类似Lsyncd的inotify通知。主要区别在于:它是专门为master-master开发的,因此在两个系统上运行守护进程,使用自己的传输层而不是rsync,而使用Java代替Lsyncd的C核和Lua脚本。
Lsyncd使用示例
lsyncd -rsync /home remotehost.org::share/
这将监视并rsyncs本地目录/ home与所有子目录,并使用rsync-share'share'将它们传输到'remotehost'。
lsyncd -rsyncssh /home remotehost.org backup-home/
这也将rsync / watch'/ home',但它使用ssh连接在远程主机上进行本地移动,而不是通过网络重新传输移动的文件。
放弃
除了许可证中通常的免责声明之外,我们还要特别强调,作者或任何与作者相关的组织都不能并且将对因Lsyncd可能出现的故障而导致的数据丢失负责。
编译
要求
Lua> = 5.2
Lsyncd依赖于Lua 5.2或更高版本; 即5.2或5.3。对于大多数发行版,您需要安装liblua ??,liblua ?? - dev和lua ?? 包,用?? 作为相应的Lua版本。
cmake> = 2.8
要将Lsyncd配置到您的系统,需要cmake> = 2.8
rsync> = 3.1
在运行期间,Lsyncd需要在源系统和目标系统上同时安装rsync> 3.1。
编译
满足这些要求Lsyncd应该是一个直接的过程。解压下载的tar.gz文件并运行:
cmake .
make
sudo make install
调用
作为大多数Unix工具,Lsyncd将在用-help调用时打印其命令行选项的摘要。
lsyncd --help
lsyncd -help
Lsyncd中的两个连字符是冗余的。它没有短的一个字母选项,并且一个连字符总是与指定两个相同。
也像大多数Unix工具一样,--version
或者-version
让Lsyncd打印它的版本号。
lsyncd -version
Lsyncd 2.1被设计为主要通过配置文件进行配置(见下文)。配置文件因此可以是唯一的命令行选项。
lsyncd CONFIGFILE
尽管对于标准使用或快速测试,它可以通过命令行选项进行光标配置。以下内容将使用rsync保持本地源和目标目录同步:
lsyncd -rsync /home/USER/src /home/USER/dst
目标可以是Rsync可以识别的任何东西。
lsyncd -rsync /home/USER/src remotehost:dst
通过调用两次(或多次)-rsync配置两个(或更多)目标。
lsyncd -rsync /home/USER/src remotehost1:dst -rsync /home/USER/src remotehost2:dst
Rsync同步的一个缺点是,通常目录和文件移动会导致移动源的删除和导线移动目标的重新传输。但是,Lsyncd 2可以使用ssh命令在目标上本地移动目录和文件。要-rsyncssh
在本地源目录,远程主机和目标目录之后使用此用法。REMOTEHOST可以包含一个用户[email protected]
。
lsyncd -rsyncssh /home/USER/src REMOTEHOST TARGETDIR
测试Lsyncd配置时-nodaemon
是一个非常方便的标志。使用此选项,Lsyncd不会分离,并且不会成为守护进程。所有日志消息都是在控制台上打印的配置日志记录工具(stdout和stderr)之外的。
lsyncd -nodaemon CONFIGFILE
使用-nodaemon运行时的行为有所不同。Lsyncd不会/
像它在成为守护程序时那样将其工作目录更改为。因此,相对目标./target
会起作用,-nodaemon
但必须指定绝对路径才能在守护进程模式下工作。源目录也将由Lsyncd转换为绝对路径。源代码不解析为绝对路径的原因是因为Lsyncd本身并不关心目标说明符的格式,该目标说明符也可以是远程主机,rsyncd模块等。它不透明地传递给rsync。它关心观察到的目录。
所有日志消息按类别排序。默认情况下,Lsyncd缺少日志消息。通过指定,您可以将Lsyncd转换为motormouth -log all
。
lsyncd -log all CONFIGFILE
这可能很容易变得太多。一个特别有用的类别是“Exec”,它将记录Lsyncd产生的所有进程的命令行。
lsyncd -log Exec CONFIGFILE
当默认初始启动同步失败时,Lsyncd将以错误消息终止。它是这样设计的,所以配置故障可见地报告给可能的初始用户。但是,在生产过程中可能会完成远程目标,但是您希望Lsyncd始终启动并不断尝试同步到远程目标,直到它启动。
lsyncd -insist -rsync /home/USER/src remotehost:dst
在生产模式下,建议坚持。它也可以在配置文件中的settings {}命令中指定。
配置文件
Lsyncd配置文件是有效的Lua语法。它的设计简单而有力。虽然丰富的配置和简单性本身并不是对立的,但一些折衷是不可避免的。为了尽可能实现这两个目标,Lsyncd配置可以在不同的层完成。较低的层次增加了适应性,而界面变得更有吸引力。
设置
对于所有图层的脚本,settings
可以使用该调用来更改守护程序范围的配置。
例如,以下代码将指示Lsyncd登录/tmp/lsyncd.log
,定期/tmp/lsyncd.status
使用其状态更新该文件,并且不会将其作为守护程序分离。
settings {
logfile = "/tmp/lsyncd.log", statusFile = "/tmp/lsyncd.status", nodaemon = true, }
警告 如果你从2.0.x升级,请注意它settings
是一个变量的函数,所以你必须删除settings
和之间的等号'=' {
。
有效的设置键是:
日志文件 | = | 文件名 | 登录到此文件 |
pidfile进程文件 | = | 文件名 | 将PID记录到此文件中 |
nodaemon | = | BOOL | 不分离 |
statusFile | = | 文件名 | 定期向该文件写入状态报告 |
statusInterval | = | 数 | 在经过此秒数后最短写入状态文件(默认值:10) |
logfacility类似 | = | 串 | 系统日志设施,默认“用户” |
logident | = | 串 | 系统日志标识(标签),默认“lsyncd” |
咬定 | = | BOOL | 尽管一个或多个目标由于无法访问而失败,但仍会在启动时继续运行。 |
inotifyMode | = | 串 | 在inotify系统上指定要监听的更改类型。可以是“修改”,“CloseWrite”(默认)或“CloseWrite或Modify”。 |
进程数 | = | 数 | Lysncd不会产生比这些数量更多的进程。这增加了所有同步{}。 |
此外,还可以配置一些参数,这些参数由所有Syncs继承(请参阅第3层)
maxDelays | = | 数 | 当这个延迟事件的数量排队时,动作将被产生,甚至低于延迟计时器。 |
配置第4层:默认配置
您可以简单地从三个默认实现中选择:rsync,rsyncssh和direct。
要使用默认的rsync行为来同步本地目录,只需将其添加到配置文件即可:
sync {
default.rsync, source = "DIRNAME", target = "DIRNAME" }
论点的顺序并不重要。如果target是本地目录,请注意它是绝对路径名。您可以通过这种方式添加多个同步。源目录可能相同或不同,没有问题。source
是每个同步必须给出的通用参数。所有其他sync
参数可能因所选行为而异。或者,您可以覆盖默认或设置值maxDelays
或maxProcesses
每次同步。
也可以通过将默认init
功能设置为false来跳过初始rsync过程:
sync {
default.rsync, source = "DIRNAME", target = "DIRNAME", init = false }
这是一个危险的优化; 因此,请仅在确定源和目标在Lsyncd启动时同步的情况下使用它。
您可以选择的默认行为如下:
default.rsync
默认的rsync配置会将事件聚合到delay
秒或1000个独立的不可折叠事件,这些事件首先发生。然后它会产生一个Rsync,并带有所有已更改文件的过滤器。过滤器列表通过管道传输到Rsync。从Lsyncd到Rsync的调用将如下所示:
/usr/bin/rsync -ltsd --delete --include-from=- --exclude=* SOURCE TARGET
您可以更改调用Rsync的选项以及与rsync
参数调用的Rsync二进制文件。
例:
sync {
default.rsync, source = "/home/user/src/", target = "foohost.com:~/trg/", delay = 15, rsync = { binary = "/usr/local/bin/rsync", archive = true, compress = true } }
以下是rsync
参数选项的表格。请查看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. | 如果绝对需要,可以将其他参数指定为STRINGS表(例如:{“--omit-dir-times”,“--omit-link-times”})。请注意,下划线将此解释为解决方法。如果您需要上述选项未涵盖的内容,请通过项目网站上的功能请求申请。最值得注意的是,不要添加-r递归或-a这意味着递归,因为Lsyncd会自己处理它。另外,不要为相对添加-R,这会破坏Lsyncd < - > Rsync通信。 |
default.rsyncssh
此配置不同于标准rsync配置,因为它使用ssh命令在目标主机本地移动文件或目录,而不是再次删除和传输。这种配置产生了类似于default.rsync的Rsync进程,但是会产生/usr/bin/ssh HOST mv ORIGIN DESTINATION
命令。
与default.rsync不同,它不需要统一的target
参数,但需要host
并targetdir
分开。
Rsync的选项可以通过rsync
上面所描述的default.rsync中的参数进行更改。
除此之外,可以通过ssh
参数配置ssh 。
binary | = | FILENAME | Lsyncd calls this binary as ssh (default: /usr/bin/ssh) |
identityFile | = | FILE | Uses this file to identify for public key authentication. |
options | = | TABLE | A table of addition extended options to pass to ssh's -o option. |
port | = | PORT | Adds --port=PORT to the ssh call. |
_extra | = | STRING TABLE | Similar to rsync._extra this can be used as quick workaround if absolutely needed. |
例:
settings {
logfile = "/var/log/lsyncd.log", statusFile = "/var/log/lsyncd-status.log", statusInterval = 20 } sync { default.rsyncssh, source="/srcdir", host="remotehost", excludeFrom="/etc/lsyncd.exclude", targetdir="/dstdir", rsync = { archive = true, compress = false, whole_file = false }, ssh = { port = 1234 } }
请注意rsync
参数集和ssh
参数集之间的逗号。
警告 如果你从2.0.x升级,请注意它settings
是一个变量的函数,所以你必须删除settings
和之间的等号'=' {
。
Lsyncd将调用xargs
远程主机来处理单个连接中的多个任务。Xargs选项可以由xargs参数指定。
binary | = | FILENAME | Lsyncd calls this binary as xargs on the remote host (default: /usr/bin/xargs) |
delimiter | = | DELIMITER | delimiting character to separate filenames. By default the 0 character is used. Very old holds may need newline instead. |
_extra | = | STRING TABLE | By default { '-0', 'rm -rf' }. Remove the -0 if you chose newline delimiter instead. Otherwise leave it as is. |
sync {例:
default.rsyncssh, source = "/home/user/src/", host = "foohost.com", targetdir = "~/trg/", }
default.direct
Default.direct可以用来保持两个本地目录同步,比使用default.rsync更好的性能。Default.direct在启动时使用(就像default.rsync一样)rsync来初始化目标目录与源目录的同步。但是,在正常操作期间,default.direct使用/ bin / cp,/ bin / rm和/ bin / mv来保持同步。所有参数就像default.rsync一样。
例:
sync {
default.direct, source = "/home/user/src/", target = "/home/user/trg/" }
排除
可以指定两个附加参数来同步{}:
excludeFrom | = | FILENAME | loads exclusion rules from this file, on rule per line |
exclude | = | LIST | loads exclusion rules from this list of strings |
排除规则在rsync的排除模式之后建模,但稍微简单一些。Lsyncd支持这些功能:
- 通常,如果某个事件的路径名的任何部分(参见第3层以下)与文本匹配,则将其排除。例如文件“/ bin / foo / bar”匹配规则“foo”。
- 如果规则以斜杠开始,则只会在路径名的开头匹配
- 如果规则以斜线结尾,则只会在路径名的末尾匹配
- ?匹配不是斜杠的任何字符。
*
匹配零个或多个不是斜线的字符**
匹配零个或多个字符,这可以是斜杠。
例:
sync {
default.rsync, source = "/home/user/src/", targetdir = "/home/user/dst/", exclude = { '*.bak' , '*.tmp' } }
缺失
默认情况下,Lsyncd将删除目标上不存在的文件,因为这是保持目标与源同步的基本部分。但是,由于各种原因,许多用户请求例外,因此所有默认实现都delete
作为附加参数。
有效值为delete
:
删除 | = | 真正 | 默认。Lsyncd将在目标上删除不在源代码中的任何东西。在启动时以及在正常操作过程中被删除的内容。 |
删除 | = | 假 | Lsyncd不会删除目标上的任何文件。不在启动或正常运行。(虽然可以覆盖) |
删除 | = | '启动' | Lsyncd将在启动时删除目标上的文件,但不会进行正常操作。 |
删除 | = | “跑步” | Lsyncd在启动时不会删除目标上的文件,但会删除那些在正常操作期间被删除的文件。 |