lsyncd服务使用

概述

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-detach
 
Jul 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.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目录并实时同步

修改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
posted @ 2026-07-17 10:18  huangSir-devops  阅读(81)  评论(0)    收藏  举报
作者:你的名字
出处:你的博客链接
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。