当前位置:首页>Linux>Lsyncd 实现两台Linux服务器实时单向同步文件部署文档

Lsyncd 实现两台Linux服务器实时单向同步文件部署文档

  • 2026-10-11 07:18:46
Lsyncd 实现两台Linux服务器实时单向同步文件部署文档

场景:两台 openEuler 24.03 LTS 服务器,将主机 /upload 目录下的所有文件实时单向同步到备机 /upload。
方案:lsyncd(inotify 监听文件变化)+ rsync(增量传输)+ ssh(加密通道)。


1. 架构与原理

Lsyncd(Live Syncing Daemon)常驻于主机,通过内核的 inotify 机制监听 /upload 目录的增、删、改事件,将变化批量聚合后调用 rsync 经由 SSH 通道推送到备机,实现准实时的单向同步(主 → 备)。

角色
主机名(示例)
IP(示例)
说明
主机(Master / 源端)
node1192.168.10.11
运行 lsyncd,监听并推送 /upload
备机(Slave / 目标端)
node2192.168.10.12
接收数据,仅需 rsync + sshd

数据流向为单向:主机的改动会覆盖到备机;备机上对 /upload 的本地改动不会同步回主机,且可能在下一次同步时被主机内容覆盖,因此备机的 /upload 应视为只读副本。

请将下文所有 192.168.10.11、192.168.10.12、用户名等替换为你的实际环境。


2. 前置准备(主备两台都执行)

2.1 确认系统版本

cat /etc/openEuler-release
# 期望输出类似:openEuler release 24.03 (LTS)

uname
 -r

2.2 配置主机名与 hosts(可选,便于识别)

# 主机执行
hostnamectl set-hostname node1
# 备机执行

hostnamectl set-hostname node2

# 主备都执行,写入 /etc/hosts

cat
 >> /etc/hosts <<'EOF'
192.168.10.11 node1
192.168.10.12 node2
EOF

2.3 时间同步(强烈建议)

文件时间戳一致可避免 rsync 误判,建议启用 chrony:

dnf install -y chrony
systemctl enable --now chronyd
chronyc sources -v

2.4 创建同步目录

# 主备都执行
mkdir
 -p /upload
chmod
 755 /upload

3. 安装软件

3.1 备机:安装 rsync 与 sshd

备机只做接收,无需安装 lsyncd。

dnf install -y rsync openssh-server
systemctl enable --now sshd
rsync --version

3.2 主机:安装 rsync 与 lsyncd

dnf install -y rsync

安装 lsyncd 有两种方式,优先尝试 dnf 直装;若仓库中没有再用源码编译。

方式 A:dnf 直接安装(先尝试)

# 部分 openEuler 版本将 lsyncd 收录在 EPOL/everything 仓库
dnf install -y lsyncd

若提示 No match for argument: lsyncd,先确认 EPOL 仓库已启用再重试:

dnf repolist all | grep -i epol
# 如未启用,可编辑 /etc/yum.repos.d/openEuler.repo 将 [EPOL] 段的 enabled 改为 1

dnf clean all && dnf makecache
dnf install -y lsyncd

方式 B:源码编译(dnf 找不到时使用)

# 1) 安装编译依赖(lsyncd 基于 Lua)
dnf install -y gcc make cmake lua lua-devel rsync git

# 2) 获取源码(任选其一)

cd
 /usr/local/src
git clone https://github.com/lsyncd/lsyncd.git
cd
 lsyncd
# 或下载发布包:

# wget https://github.com/lsyncd/lsyncd/archive/refs/tags/release-2.3.1.tar.gz


# 3) 编译安装

mkdir
 -p build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
make
make install

# 4) 验证

/usr/local/bin/lsyncd --version
ln
 -sf /usr/local/bin/lsyncd /usr/bin/lsyncd   # 方便直接调用

编译报错多为 Lua 版本不匹配,确保已安装 lua-devel;如系统为 Lua 5.4,新版 lsyncd(2.3.x)已支持。


4. 配置 SSH 免密(主机 → 备机)

lsyncd 通过 SSH 推送数据,必须实现主机到备机的免密登录。以下在主机以 root 身份操作(生产环境建议改用专用同步账户,见第 8 节)。

# 1) 主机生成密钥(已有可跳过,一路回车)
ssh-keygen -t ed25519 -N "" -f /root/.ssh/id_ed25519

# 2) 将公钥分发到备机

ssh-copy-id -i /root/.ssh/id_ed25519.pub root@192.168.10.12

# 3) 验证免密(应能直接登录,不提示输入密码)

ssh root@192.168.10.12 "hostname && date"

首次连接会询问是否信任主机指纹,输入 yes。务必在配置 lsyncd 前手动 ssh 一次,确保 known_hosts 已记录,否则 lsyncd 启动时会因指纹确认卡住。


5. 配置 Lsyncd(主机)

5.1 创建目录

mkdir -p /etc/lsyncd
mkdir
 -p /var/log/lsyncd

5.2 编写配置文件 /etc/lsyncd/lsyncd.conf.lua

-- /etc/lsyncd/lsyncd.conf.lua
-- 两台 openEuler 24.03 单向同步 /upload


settings {
    logfile    = "/var/log/lsyncd/lsyncd.log",   -- 运行日志
    statusFile = "/var/log/lsyncd/lsyncd.status", -- 状态文件
    statusInterval = 10,                          -- 状态刷新间隔(秒)
    nodaemon   = false,                           -- 由 systemd 接管,设为 false
    insist     = true,                            -- 启动时目标不可达也不退出,持续重试
    maxProcesses = 4,                             -- 并发 rsync 进程数
}

sync {
    default.rsync,

    source = "/upload/",                          -- 源目录,结尾的 / 表示同步目录内容

    -- 目标:备机 IP:目标目录

    target = "192.168.10.12:/upload/",

    delay  = 5,                                   -- 事件聚合延迟(秒),减少频繁触发
    delete = true,                                -- 主机删除的文件,备机也删除(保持镜像一致)

    rsync = {
        binary      = "/usr/bin/rsync",
        archive     = true,                       -- -a:保留权限/属主/时间/软链等
        compress    = true,                       -- -z:压缩传输(局域网带宽充足可设 false)
        verbose     = true,
        owner       = true,
        group       = true,
        perms       = true,
        times       = true,
        -- 通过 ssh 传输,并指定密钥

        rsh = "/usr/bin/ssh -i /root/.ssh/id_ed25519 -o StrictHostKeyChecking=accept-new",
    },
}

关键说明:

  • • source 与 target 结尾都带 /,表示同步「目录内容」而非目录本身。
  • • delete = true 会让备机成为主机的精确镜像(主机删了备机也删);若只想增量保留、不删除,改为 false。
  • • delay = 5 表示积攒 5 秒内的变化合并一次传输,可按需调小(更实时)或调大(更省资源)。

5.3 校验配置语法

lsyncd -nodaemon /etc/lsyncd/lsyncd.conf.lua
# 看到持续运行、无报错即说明配置正确,按 Ctrl+C 退出,再交给 systemd 托管

6. 配置 systemd 服务(主机)

dnf 安装通常自带 lsyncd.service;源码编译需手动创建。统一使用下面的单元文件,确保配置路径一致。

创建 /etc/systemd/system/lsyncd.service:

[Unit]
Description
=Live Syncing (Mirror) Daemon
After
=network-online.target sshd.service
Wants
=network-online.target

[Service]

Type
=simple
ExecStart
=/usr/bin/lsyncd -nodaemon /etc/lsyncd/lsyncd.conf.lua
Restart
=on-failure
RestartSec
=5

[Install]

WantedBy
=multi-user.target

源码编译若安装在 /usr/local/bin,请将 ExecStart 改为 /usr/local/bin/lsyncd,或保留第 3.2 节创建的软链接。

启动并设为开机自启:

systemctl daemon-reload
systemctl enable --now lsyncd
systemctl status lsyncd --no-pager

7. 防火墙与 SELinux

7.1 防火墙(备机需放行 SSH/22)

数据走 SSH(22 端口),只需保证备机放行 22 即可:

# 备机执行
firewall-cmd --permanent --add-service=ssh
firewall-cmd --reload
firewall-cmd --list-all

若 SSH 改了非标准端口,需在防火墙放行对应端口,并在 lsyncd 的 rsh 中加 -p <端口>。

7.2 SELinux

openEuler 默认开启 SELinux。lsyncd 经 ssh 调用 rsync 通常不受策略阻拦,但若日志出现权限拒绝,可排查:

getenforce
# 查看是否有 lsyncd/rsync 相关 AVC 拒绝

ausearch -m avc -ts recent | grep -iE 'lsyncd|rsync'

如确认是 SELinux 拦截,可针对性生成放行策略(推荐)而非直接关闭:

dnf install -y policycoreutils-python-utils setroubleshoot-server
ausearch -m avc -ts recent | audit2allow -M lsyncd_local
semodule -i lsyncd_local.pp

8. 安全加固(生产建议)

生产环境不建议用 root 直连,可改用专用账户与受限命令:

# 备机:创建同步账户并赋予 /upload 写权限
useradd -m -s /bin/bash syncuser
chown
 -R syncuser:syncuser /upload

# 主机:生成 syncuser 专用密钥并下发到备机 syncuser

# 然后将 lsyncd.conf.lua 中:

#   target = "syncuser@192.168.10.12:/upload/"

#   rsh    = "/usr/bin/ssh -i /home/syncuser/.ssh/id_ed25519 ..."

进一步可在备机 ~/.ssh/authorized_keys 中用 command= 与 rrsync 限制该密钥只能执行受限 rsync,缩小攻击面。


9. 验证测试

# 1) 主机写入测试文件
echo
 "hello $(date)" > /upload/test_$(date +%s).txt
mkdir
 -p /upload/subdir && echo "sub" > /upload/subdir/a.txt

# 2) 等待 delay(约 5 秒)后,到备机检查

ssh root@192.168.10.12 "ls -lR /upload/"

# 3) 删除测试(验证 delete=true 同步删除)

rm
 -f /upload/test_*.txt
ssh root@192.168.10.12 "ls -l /upload/"   # 备机对应文件应已消失

# 4) 观察主机日志

tail
 -f /var/log/lsyncd/lsyncd.log

看到备机文件随主机变化即同步成功。


10. 运维与排错

常用命令

systemctl status lsyncd          # 服务状态
systemctl restart lsyncd         # 改完配置后重启生效
journalctl -u lsyncd -f          # 跟踪 systemd 日志
tail
 -f /var/log/lsyncd/lsyncd.log   # 跟踪运行日志
cat
 /var/log/lsyncd/lsyncd.status    # 查看实时同步状态/积压队列

常见问题排查表

现象
可能原因
处理方法
服务启动即退出
配置语法错误
lsyncd -nodaemon /etc/lsyncd/lsyncd.conf.lua
 前台跑看报错
一直不同步
SSH 免密未配好 / 首次指纹未确认
手动 ssh root@备机 确认免密成功,known_hosts 已记录
报 rsync: command not found
备机未装 rsync
备机 dnf install -y rsync
权限相关失败
目标目录无写权限 / 属主不符
检查备机 /upload 属主与权限
大量文件首次同步慢
初次全量 + 压缩开销
局域网可在 rsync 中关 compress;首次可先手动 rsync 打底
删除未生效
delete = false
改为 true 后重启服务
文件多、监听失效
inotify 监听数上限
调大内核参数(见下)

调大 inotify 监听上限(目录文件量很大时)

cat >> /etc/sysctl.conf <<'EOF'
fs.inotify.max_user_watches = 1048576
fs.inotify.max_user_instances = 1024
EOF
sysctl -p

首次全量打底(可选,海量文件建议)

文件量很大时,可先用 rsync 手动同步一次,再启动 lsyncd 负责后续增量,避免启动瞬间压力过大:

rsync -avz -e "ssh -i /root/.ssh/id_ed25519" /upload/ root@192.168.10.12:/upload/
systemctl restart lsyncd

附录:部署速查清单

步骤
主机 node1
备机 node2
安装软件
rsync
 + lsyncd
rsync
 + openssh-server
目录
mkdir -p /uploadmkdir -p /upload
SSH 免密
生成密钥并 ssh-copy-id 到备机
启用 sshd,放行 22 端口
配置
/etc/lsyncd/lsyncd.conf.lua
—
服务
systemctl enable --now lsyncdsystemctl enable --now sshd
验证
写入 /upload 文件
ls -lR /upload
 检查

最新文章

随机文章