概述
lsyncd 是基于 inotify + rsync 的实时文件同步工具:
- 监控本地目录文件增删改事件
- 触发 rsync 增量同步到远程 / 本地目录
- 相比单纯 inotify+rsync 脚本,自带延迟聚合、限流、重试、日志,稳定适合生产
适用场景
- 业务代码 / 静态文件实时多机同步
- 本地目录实时备份
- 集群节点文件一致性同步
lsyncd的学习依赖rsync服务,如果你对rsync服务不熟悉,可以参考这篇文章:rsync服务使用
lsyncd服务搭建
机器配置:
- rsync服务端:备份的机器,也就是将文件推送到这台机器上进行备份
- rsync客户端:需要备份到机器,该机器上的文件需要推送到服务端
配置rsync服务的守护进程模式
因为lsyncd依赖rsync,所以需要先配置rsync服务。
服务端配置
-
服务端下载rsync
CentOS/RHEL
yum install rsync -y
Ubuntu/Debian
apt install rsync -y
-
服务端修改配置文件
root@master:~# cat /etc/rsyncd.conf
全局配置字段
#用户名
uid = rsync用户组
gid = rsync
是否使用root传输,yes表示是,no表示否
use chroot = no
只读开启/关闭,true表示开启,false表示关闭
read only = false
最大连接数
max connections = 2000
超时时间
timeout = 600
pid文件
pid file = /var/run/rsyncd.pid
并发锁文件
lock file = /var/run/rsync.lock
日志文件
log file = /var/log/rsyncd.log
是否忽略error
ignore errors
允许列出模块列表,false代表不允许,true代表允许
list = false
访问验证用户(虚拟账号,非系统用户)
auth users = rsync_backup
密码文件
secrets file = /etc/rsync.password
允许访问客户端IP,多个逗号分隔,0.0.0.0/0全部放行
hosts allow = 10.37.0.0/16
拒绝客户端IP访问
hosts deny = 0.0.0.0/0
自定义模块【backup】客户端访问标识
[data]
# 模块注释
comment = huangsir devops rsyncd study
# 同步根目录(真实服务器路径)
path = /data00/rsync/rsyncd
单独模块是否只读,优先级高于全局
read only = false
不允许删除文件(按需开启)
refuse options = delete
-
服务端创建备份目录、创建用户
创建目录,和配置文件中的自定义模块backup中的path对齐
root@master:~# mkdir -p /data00/rsync/rsyncd
创建用户,和配置文件中的uid对齐
root@master:~# useradd rsync -M -s /sbin/nologin
检查用户是否存在
root@master:~# id rsync
uid=2005(rsync) gid=2006(rsync) groups=2006(rsync)给目录授权
root@master:~# chown rsync:rsync -R /data00/rsync/rsyncd/
检查
root@master:~# stat /data00/rsync/rsyncd/
File: /data00/rsync/rsyncd/
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fe10h/65040d Inode: 8129044 Links: 2这里已经改变了
Access: (0755/drwxr-xr-x) Uid: ( 2005/ rsync) Gid: ( 2006/ rsync)
Access: 2026-07-15 14:24:20.403479958 +0800
Modify: 2026-07-15 14:20:43.432593738 +0800
Change: 2026-07-15 14:24:20.403479958 +0800
Birth: - -
服务端创建rsync密码文件并修改权限
密码文件固定为rsync.password,其里面的内容为[用户名:密码]
用户名为配置文件中的auth users 配置的用户名,是个虚拟账号
root@master:~# echo 'rsync_backup:1' >> /etc/rsync.password
root@master:~# cat /etc/rsync.password
rsync_backup:1修改文件的访问权限权限
root@master:~# chmod 600 /etc/rsync.password
root@master:~# ll /etc/rsync.password
-rw------- 1 root root 15 Jul 15 14:27 /etc/rsync.password -
启动rsyncd服务,并检查端口是否开启
root@master:~# systemctl start rsync
检查状态
root@master:~# systemctl status rsync
● rsync.service - fast remote file copy program daemon
Loaded: loaded (/lib/systemd/system/rsync.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2026-07-15 14:29:41 CST; 10s ago
Docs: man:rsync(1)
man:rsyncd.conf(5)
Main PID: 2810502 (rsync)
Tasks: 1 (limit: 9830)
Memory: 272.0K
CGroup: /system.slice/rsync.service
└─2810502 /usr/bin/rsync --daemon --no-detachJul 15 14:29:41 master systemd[1]: Started fast remote file copy program daemon.
检查端口
root@master:~# ss -lntup | grep 873
tcp LISTEN 0 5 0.0.0.0:873 0.0.0.0:* users:(("rsync",pid=2810502,fd=3))
tcp LISTEN 0 5 [::]:873 [::]:* users:(("rsync",pid=2810502,fd=5))
tcp LISTEN 0 128 [::]:32873 [::]:* users:(("rpc.mountd",pid=735389,fd=19)) -
服务端本地测试执行
语法 rsync [选项] [文件路径] 虚拟账号名@远程IP::[自定义模块名称]
root@master:~# rsync -avz --progress /etc/hostname rsync_backup@10.37.97.56::data
Password: # 这里输入文件中的密码
sending incremental file list
hostname
7 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)sent 101 bytes received 43 bytes 57.60 bytes/sec
total size is 7 speedup is 0.05
客户端配置
-
客户端下载rsync
CentOS/RHEL
yum install rsync -y
Ubuntu/Debian
apt install rsync -y
-
创建客户端密码文件并修改权限
root@node01:~# echo '1' >> /etc/rsync.client.password
root@node01:~# chmod 600 /etc/rsync.client.password -
客户端测试
语法 rsync [选项] [本地文件路径] 虚拟账号名@远程IP::[自定义模块名称]
--password-file=/etc/rsync.client.password 指定密码文件
root@node01:~# rsync -avz --progress /etc rsync_backup@10.37.97.56::data --password-file=/etc/rsync.client.password
客户端安装lsyncd服务
-
客户端下载lsyncd
CentOS/RHEL
yum install lsyncd -y
Ubuntu/Debian
apt install lsyncd -y
-
编写systemd文件,系统自带的可能会存在问题
root@node01:~# cat /usr/lib/systemd/system/lsync.service
[Unit]
Description=Live Syncing (Mirror) Daemon
[Service]
Type=simple
ExecStart=/usr/bin/lsyncd -nodaemon /etc/lsyncd.conf
ExecStop=pkill lsyncd
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target -
重新加载并启动
root@node01:~# systemctl daemon-reload
root@node01:~# systemctl start lsync
root@node01:~# systemctl status lsync
● lsync.service - Live Syncing (Mirror) Daemon
Loaded: loaded (/lib/systemd/system/lsync.service; disabled; vendor preset: enabled)
Active: active (running) since Wed 2026-07-15 16:24:56 CST; 3min 34s ago
Main PID: 1436492 (lsyncd)
Tasks: 1 (limit: 9830)
Memory: 540.0K
CGroup: /system.slice/lsync.service
└─1436492 /usr/bin/lsyncd -nodaemon /etc/lsyncd.confJul 15 16:24:56 node01 systemd[1]: Started Live Syncing (Mirror) Daemon.
Jul 15 16:24:56 node01 lsyncd[1436492]: 16:24:56 Normal: --- Startup ---
Jul 15 16:24:56 node01 lsyncd[1436492]: 16:24:56 Normal: recursive startup rsync: /data00/lsyncd/ -> rsync_backup@10.37.97.56::data/
Jul 15 16:24:56 node01 lsyncd[1436492]: 16:24:56 Normal: Startup of /data00/lsyncd/ -> rsync_backup@10.37.97.56::data/ finished.
实战案例,监控/data00/lsyncd目录并实时同步
修改lsyncd的配置文件
带注释配置文件,下面有不带注释的
root@node01:~# cat /etc/lsyncd.conf
--全局部分主要配置lsyncd服务,日志,pid文件.
settings {
--日志文件,主要查看日志文件.
logfile = "/var/log/lsyncd.log",
--pid文件
pidfile = "/var/run/lsyncd.pid",
--服务状态文件
statusFile = "/var/log/lsyncd.status",
--改为非守护进程模式,默认.rsync命令,lsyncd
nodaemon = true,
--控制最多用于传输数据的进程数量 rsync进程数(最大)
--根据cpu核心数来 1,2倍
maxProcesses = 2,
--触发时机,CloseWrite文件写完再同步(推荐),Modify文件一修改就触发(频繁 IO 不推荐),CloseWrite or Modify兼顾两者
inotifyMode = "CloseWrite"
}
--配置rsync命令,rsync服务端与客户端模式
--sync部分可以有多个.
sync {
-- 指定rsync工作模式
default.rsync,
-- 指定lsyncd监控目录,本地目录
source = "/data00/lsyncd/",
-- 指定目标 rsync服务端 虚拟用户名@ip地址Վʦ 模块名字
target ="rsync_backup@10.37.97.56::data",
-- 每隔15秒同步一次,减少频繁同步
delay = 15,
-- 配置rsync命令位置,rsync命令选项,
rsync = {
-- 命令位置
binary = "/usr/bin/rsync",
-- rsync -a选项
archive = true,
-- rsync -z选项 压缩
compress = true,
--rsync --delete 选项,老版本不支持
-- delete = true,
-- 指定ssh端口+私钥免密,使用rsync不能配置rsh参数,只能使用password_file
-- rsh = "/usr/bin/ssh -p 22 -i /root/.ssh/id_rsa",
-- 配置rsync--password-file密码文件
password_file = "/etc/rsync.client.password"
}
}
不带注释文件:
root@node01:~# cat /etc/lsyncd.conf
settings {
logfile = "/var/log/lsyncd.log",
pidfile = "/var/run/lsyncd.pid",
statusFile = "/var/log/lsyncd.status",
nodaemon = true,
maxProcesses = 2,
inotifyMode = "CloseWrite"
}
sync {
default.rsync,
source = "/data00/lsyncd/",
target ="rsync_backup@10.37.97.56::data",
delay = 15,
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
password_file = "/etc/rsync.client.password"
}
}
重启lsyncd服务
root@node01:~# systemctl restart lsync
# 检查
root@node01:~# systemctl status lsync
● lsync.service - Live Syncing (Mirror) Daemon
Loaded: loaded (/lib/systemd/system/lsync.service; disabled; vendor preset: enabled)
Active: active (running) since Wed 2026-07-15 16:24:56 CST; 3min 34s ago
Main PID: 1436492 (lsyncd)
Tasks: 1 (limit: 9830)
Memory: 540.0K
CGroup: /system.slice/lsync.service
└─1436492 /usr/bin/lsyncd -nodaemon /etc/lsyncd.conf
Jul 15 16:24:56 node01 systemd[1]: Started Live Syncing (Mirror) Daemon.
Jul 15 16:24:56 node01 lsyncd[1436492]: 16:24:56 Normal: --- Startup ---
Jul 15 16:24:56 node01 lsyncd[1436492]: 16:24:56 Normal: recursive startup rsync: /data00/lsyncd/ -> rsync_backup@10.37.97.56::data/
Jul 15 16:24:56 node01 lsyncd[1436492]: 16:24:56 Normal: Startup of /data00/lsyncd/ -> rsync_backup@10.37.97.56::data/ finished.
在/data00/lsyncd/目录下创建文件,测试是否可以同步
# 创建文件
root@node01:~# touch /data00/lsyncd/1.txt
# 查看日志发现已经同步
root@node01:~# tail -f /var/log/lsyncd.log
Wed Jul 15 16:21:31 2026 Normal: recursive startup rsync: /data00/lsyncd/ -> rsync_backup@10.37.97.56::data/
Wed Jul 15 16:21:31 2026 Normal: Startup of /data00/lsyncd/ -> rsync_backup@10.37.97.56::data/ finished.
Wed Jul 15 16:21:38 2026 Normal: --- INT signal, fading ---
Wed Jul 15 16:24:56 2026 Normal: --- Startup ---
Wed Jul 15 16:24:56 2026 Normal: recursive startup rsync: /data00/lsyncd/ -> rsync_backup@10.37.97.56::data/
Wed Jul 15 16:24:56 2026 Normal: Startup of /data00/lsyncd/ -> rsync_backup@10.37.97.56::data/ finished.
Wed Jul 15 16:30:06 2026 Normal: Calling rsync with filter-list of new/modified files/dirs
# 这里已经打印了
/1.txt
/
Wed Jul 15 16:30:06 2026 Normal: Finished a list after exitcode: 0
# 查看远端是否已经同步
root@master:~# ll /data00/rsync/rsyncd/
total 0
-rw-r--r-- 1 rsync rsync 0 Jul 15 16:29 1.txt
实战案例,监控多个目录
客户端创建被监控的目录
root@node01:~# mkdir -p /data00/test_lsyncd
修改配置文件
root@node01:~# cat /etc/lsyncd.conf
--全局部分主要配置lsyncd服务,日志,pid文件.
settings {
--日志文件,主要查看日志文件.
logfile = "/var/log/lsyncd.log",
--pid文件
pidfile = "/var/run/lsyncd.pid",
--服务状态文件
statusFile = "/var/log/lsyncd.status",
--改为守护进程模式,默认.rsync命令,lsyncd
nodaemon = false,
--控制最多用于传输数据的进程数量 rsync进程数(最大)
--根据cpu核心数来 1,2倍
maxProcesses = 2,
--触发时机,CloseWrite文件写完再同步(推荐),Modify文件一修改就触发(频繁 IO 不推荐),CloseWrite or Modify兼顾两者
inotifyMode = "CloseWrite"
}
--配置rsync命令,rsync服务端与客户端模式
--sync部分可以有多个.
sync {
-- 指定rsync工作模式
default.rsync,
-- 指定lsyncd监控目录,本地目录
source = "/data00/lsyncd/",
-- 指定目标 rsync服务端 虚拟用户名@ip地址Վʦ 模块名字
target ="rsync_backup@10.37.97.56::data",
-- 每隔15秒同步一次,减少频繁同步
delay = 15,
-- 配置rsync命令位置,rsync命令选项,
rsync = {
-- 命令位置
binary = "/usr/bin/rsync",
-- rsync -a选项
archive = true,
-- rsync -z选项 压缩
compress = true,
--rsync --delete 选项,老版本不支持
-- delete = true,
-- 指定ssh端口+私钥免密,使用rsync不能配置rsh参数,只能使用password_file
-- rsh = "/usr/bin/ssh -p 22 -i /root/.ssh/id_rsa",
-- 配置rsync--password-file密码文件
password_file = "/etc/rsync.client.password"
}
}
-- 监控/data00/test_lsyncd/目录
sync {
default.rsync,
-- 指定lsyncd监控目录,本地目录
source = "/data00/test_lsyncd/",
-- 指定目标 rsync服务端 虚拟用户名@ip地址Վʦ 模块名字
target ="rsync_backup@10.37.97.56::data",
-- 每隔15秒同步一次,减少频繁同步
delay = 15,
-- 配置rsync命令位置,rsync命令选项,
rsync = {
-- 命令位置
binary = "/usr/bin/rsync",
-- rsync -a选项
archive = true,
-- rsync -z选项 压缩
compress = true,
--rsync --delete 选项,老版本不支持
-- delete = true,
-- 指定ssh端口+私钥免密,使用rsync不能配置rsh参数,只能使用password_file
-- rsh = "/usr/bin/ssh -p 22 -i /root/.ssh/id_rsa",
-- 配置rsync--password-file密码文件
password_file = "/etc/rsync.client.password"
}
}
在/data00/test_lsyncd/目录下创建文件,测试是否可以同步
# 创建文件
root@node01:~# touch /data00/test_lsyncd/test2.txt
root@node01:~# tail -f /var/log/lsyncd.log
# 查看日志能够发现文件已经同步
Wed Jul 15 16:39:34 2026 Normal: Calling rsync with filter-list of new/modified files/dirs
/test2.txt
/
Wed Jul 15 16:39:34 2026 Normal: Finished a list after exitcode: 0
# 查看远端是否已经同步
root@master:~# ll /data00/rsync/rsyncd/
total 0
-rw-r--r-- 1 rsync rsync 0 Jul 15 16:29 1.txt
-rw-r--r-- 1 rsync rsync 0 Jul 15 16:39 test2.txt