Lsyncd 简介
Lsyncd (Live Syncing Daemon) 是一个轻量级的实时目录同步守护进程。它通过监控本地目录树(使用 inotify 或 fsevents),聚合一段时间内的事件变化,然后调用一个或多个进程(默认为 rsync)来同步这些变更。Lsyncd 易于安装,无需新的文件系统或块设备,也不会影响本地文件系统的性能。
核心特性与适用场景
Lsyncd 的核心是将 inotify 机制与 rsync 工具相结合,通过 Lua 脚本进行封装和配置。其主要优势在于:
- 解决海量文件同步问题:通过延迟或累计事件次数触发同步,避免了 inotify + rsync 方案中频繁发送文件列表导致的性能问题。
- 配置简单灵活:使用 Lua 语言作为配置文件,可读性强,支持多种同步模式(如本地目录复制、本地 rsync、远程 rsync/rsyncssh)。
- 设计目标:适用于将本地目录树同步到远程镜像,尤其适合从安全区域向非安全区域同步数据。
相较于其他工具:
- DRBD:工作在块设备层,适合高负载系统(如数据库)的同步,但配置更复杂。
- inotify+rsync / sersync:在处理大量或大文件时效率较低,且 sersync 已停止开发。
准备工作:SSH 密钥认证
为实现免密同步,需在主从服务器间配置 SSH 密钥认证。
- 生成密钥对(在发送端执行):
ssh-keygen -t rsa -f /root/.ssh/Lsyncd_rsa - 分发公钥(在发送端执行,将
PUBLIC_IP和PORT替换为接收端信息):ssh-copy-id -p PORT -i /root/.ssh/Lsyncd_rsa.pub root@PUBLIC_IP若接收端已使用密钥登录,可能需要手动将公钥文件
Lsyncd_rsa.pub内容追加到接收端的/root/.ssh/authorized_keys文件中。 - 双向同步:如需双向同步,请在接收端重复以上步骤。
安装 Lsyncd 与依赖
以下以 CentOS/RHEL 系统为例,使用 yum 包管理器安装。
- 安装 rsync:
yum install rsync -y - 安装 EPEL 扩展源(如果系统未安装):
yum install epel-release -y yum clean all && yum makecache - 安装 Lsyncd 及其依赖:
yum install lua lua-devel lsyncd -y
配置 Lsyncd
Lsyncd 的主配置文件为 /etc/lsyncd.conf。以下是一个基础配置示例,用于将本地 /download 目录同步到远程服务器的相同路径。
settings {
logfile = "/var/log/lsyncd.log",
statusFile = "/tmp/lsyncd.stat",
inotifyMode = "CloseWrite or Modify",
maxProcesses = 5,
maxDelays = 1
}
sync {
default.rsync,
source = "/download",
target = "root@REMOTE_IP:/download",
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
verbose = true
}
}
关键配置参数说明
- settings {}:全局设置。
logfile,statusFile:日志和状态文件路径。inotifyMode:监控的事件类型。maxProcesses:最大同步进程数。maxDelays:累计事件数量阈值,达到即触发同步。
- sync {}:同步任务定义,可配置多个。
default.rsync:同步模式,还可选default.direct(本地 cp/rm)或default.rsyncssh。source:本地源目录。target:目标地址,格式因模式而异(本地路径、user@host:path、host::module)。delay:事件等待时间(秒),用于合并短时间内的多次变更。delete:是否同步删除操作,可选true,false,"startup","running"。rsync {}:rsync 专用参数,如bwlimit(限速)、_extra(附加参数)。
启动与管理服务
- 启动 Lsyncd 服务:
systemctl start lsyncd - 设置开机自启:
systemctl enable lsyncd - 查看同步日志:
tail -f /var/log/lsyncd.log
接收端配置(Rsync Daemon 模式)
若使用 rsync daemon 模式(配置中的 target = "host::module"),需在接收端配置 rsyncd。
- 安装 rsync:
yum install rsync -y - 编辑配置文件
/etc/rsyncd.conf:[module_name] path = /path/to/target/dir comment = Lsyncd Sync Module read only = no auth users = syncuser secrets file = /etc/rsyncd.secrets - 创建密码文件并设置权限:
echo "syncuser:password" > /etc/rsyncd.secrets chmod 600 /etc/rsyncd.secrets - 启动 rsync daemon 并开放端口:
systemctl start rsyncd systemctl enable rsyncd firewall-cmd --permanent --add-port=873/tcp firewall-cmd --reload
进阶配置示例
配置文件支持定义多个 sync 块,实现向不同目标同步。模式选择:
- 本地目录同步(direct 模式):使用 cp/rm/mv 命令,适合文件数量多但变动少的场景。
- 本地目录同步(rsync 模式):使用 rsync 在本地或挂载的目录间同步。
- 远程目录同步(rsync + daemon):目标格式为
user@host::module,需配置 rsyncd。 - 远程目录同步(rsync + ssh):目标格式为
user@host:path,利用 SSH 通道。 - 远程目录同步(rsyncssh 模式):与上一种效果类似,配置写法不同。
具体配置示例请参考 Lsyncd 官方手册或社区文档。
注意事项与排错
- 确保同步目录的写权限,特别是非 root 用户运行时。
- 使用
ssh -v测试密钥认证是否成功。 - 监控系统日志(
/var/log/messages或journalctl -u lsyncd)以排查问题。 - Lsyncd 2.2.1 及以上版本要求所有机器的 rsync 版本 ≥ 3.1。