如何对不同机器上目录进行实时同步

Posted by 刘勇(lyonger) on 2020-03-17

背景说明

  • 在某些业务场景下,我们可能需要对位于不同机器上的某个目录进行实时同步。本文主要简要介绍debian8系统下如何使用lsyncd工具进行同步。同时附上同类型工具sersync的对比测试情况。

安装lsyncd

  • 确保你的apt源可以正常使用,接着执行如下命令。
1
2
3
4
5
6
7
# apt-get install luarocks
# apt-get install lua-socket
# apt-get install lua-filesystem
# apt-get install -y lua5.1 liblua5.1-dev pkg-config rsync asciidoc
# apt-get install lsyncd
# mkdir /etc/lsyncd
# mkdir -p /usr/local/lsyncd/etc/
  • 设置配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
settings  {
logfile = "/usr/local/lsyncd/logs/lsyncd.log",
statusFile = "/usr/local/lsyncd/logs/lsyncd.status",
maxDelays = 100,
delay = 5,
exitcodes = {[0] = "ok", [1] = "again", [2] = "die"},
maxProcesses = 5,
insist = true,
statusInterval = 5
}

-- 同步到其他同步机器
sync {
default.rsync,
source = "/home/source_dir/",
target = "${user_name}@ip::rsync_mod",

-- 排除隐藏文件及临时文件,可以按具体需求修改
exclude={ ".*", "*.tmp", "*.bak", "*.swp" },
rsync = {
compress = false,
archive = true,
verbose = true,
-- _extra用于手动指定rsync参数,默认建议设置超时,避免rsync进程卡死
_extra = {"--timeout=3600","--port=873"}
-- 设置rsync_mod对应的认证密码,文件权限为600
password_file = "/usr/local/lsyncd/etc/lsyncd.pass"
}
}
  • 启动对应的lsyncd服务。
1
/etc/init.d/lsyncd start
  • 查看/usr/local/lsyncd/logs/lsyncd.log日志文件,判断同步是否正常。

lsyncd与sersync比较

  • 这里基于lsyncd(2.1.5)sersync(2.5.4)进行比较。

特性比较

lsyncd sersync
监听inotify事件 Modify CloseWrite(默认) delete / createFolder(默认)/ createFile closeWrite(默认)/moveFrom(默认)/ moveTo(默认) attrib / modify
失败重传 支持,具体机制未知 支持, 默认写在/tmp/rsync_fail_log.sh,每60min重试
全局同步 启动时同步; 可以在logrotate里每天重启 启动时同步, 可以开启crontab功能,默认每600min执行一次 。
默认rsync参数 gpsoltD artuz
实时性 每经过delay(默认15)秒或maxDelay(默认1000)个事件后触发同步 每个事件触发同步
日志输出 支持 不支持
合并配置 支持 不同源目录的同步必须写在不同配置文件

性能比较

  • 测试目录包含8215个子目录,51587个文件,共 4.3G

  • 源机和目标机均为标配816G内存146G硬盘,内网通过1000M交换机互联。

  • 源机服务开启sshdlsyncd/sersync

  • 目标机服务开启sshdrsync daemon

测试结果

lsyncd sersync
全局同步(不带z) 45s 44s
全局同步(带z) 70s 71s
解压/cp 解压约耗时1min(同时开始同步), 继续同步耗时21~23s 解压约耗时1min(同时开始同步), 继续同步耗时2min 24s~2min 26s
rm <60s >4min, 实际同步完成后仍有同步操作(应该是大量失败重试), 约8min才完全停止同步
mv 约10min后同步, 实际同步耗时约1min 40s 接近全局同步

总结

  • lsyncd在通常情况下拥有更好的性能,应该与它并非每次触发inotify就调用rsync同步有关。因为累积一定事件或经过一定时间后才触发同步,极大减少了rsync调用次数,从而在业务量较大的情况下表现更好。在大量操作的情况下,sersync的实际同步次数是lsyncd的10倍以上。

  • 但在大量目录的mv操作中,lsyncd的性能明显不如sersync,估计与其不监听moveFrommoveTo操作有关。



支付宝打赏 微信打赏

赞赏一下