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