Skip to content

Lsyncd 同步架构

bash
1. 文件源头(source)
监控目录:系统首先监控指定的目录,这些目录包含了需要备份的文件。
文件收集:一旦有文件更新或新增,系统会立即收集这些文件,准备进行上传。
2. 上传模块(/upload/)
文件传输:收集到的文件通过上传模块进行传输。这个模块可能是一个脚本或服务,负责将文件从源头安全地传输到目标位置。
并发处理:为了提高效率,上传模块可能支持并发处理,即同时上传多个文件。
3. 目标位置(target)
用户与IP识别:在目标位置,系统会识别文件的上传用户以及他们的IP地址,确保文件的来源是可信的。
模块识别:除了用户和IP,系统还会识别文件是通过哪个模块上传的,这有助于后续的审计和故障排查。
4. 备份技术栈
NFS(Network File System):
功能:NFS允许不同计算机之间通过网络共享文件。在这个架构中,NFS可能用于将文件从上传模块传输到备份存储。
配置:为了安全起见,NFS服务端会进行特定的配置,如root_squash,以防止客户端以root权限访问共享文件。
Isyncd:
功能:Isyncd是一个轻量级的文件同步工具,可以实时监控文件变化并进行同步。
类型:包括inotify和rsync两种类型,分别适用于不同的同步需求。
优势:通过Isyncd,系统能够确保文件在源头和目标位置之间保持实时同步。
nfsbackup模块(/nfsbackup/):
功能:这个模块专门用于处理NFS备份相关的任务,如文件的存储、管理和恢复。
存储位置:备份文件存储在/data/目录下,便于管理和访问。

用户角度流程:

  1. 上传文件:用户通过 Web 服务器上传文件到 指定的/upload/ 目录。
  2. NFS 挂载/upload/和 NFS 上的/data/目录进行了永久挂载
  3. Lsyncd 监控:在 NFS 服务端上通过 Lsyncd 监控指定的/upload/目录
  4. 数据备份:备份服务器使用 lrsync 从 NFS 共享目录中拉取文件进行备份,并通过 nfsbackup 模块安全实时传输数据
  5. 最终效果:用户在 web 服务器/upload/目录 上传一个文件,存储服务器 nfs /data/目录里面有,实时同步 backup 服务器指定目录/nfsbackup 也有这个文件

环境

实时同步项目需求
web服务器挂载点:/app/code/blog/ 用户www(1999,1999)
nfs服务端共享:/nfs/blog/ 用户www(1999,1999)
备份服务器共享:/nfs/backup/blog/ 用于lsyncd实时同步使用
lsyncd根据nfs, rsync的内容配置即可.

流程

NFS

NFS 服务端配置

服务端配置/nfs/blog

shell
[root@nfs01 /data]# mkdir -p /nfs/blog/
[root@nfs01 /data]# id www
用户id=1999(www) 组id=1999(www) 组=1999(www)
[root@nfs01 /data]# chown -R www.www /nfs/blog/
[root@nfs01 /data]# vim /etc/exports
/nfs/blog/ 172.16.1.0/24(rw,all_squash,anonuid=1999,anongid=1999)
[root@nfs01 /data]# systemctl restart nfs
[root@nfs01 /data]# showmount -e 
Export list for nfs01:
/nfs/blog 172.16.1.0/24

客户端测试

shell
[root@web01 ~]# id www

用户id=1999(www) 组id=1999(www) 组=1999(www)
[root@web01 ~]# mkdir -p /app/code/blog/

[root@web01 ~]# mount -t nfs 172.16.1.31:/nfs/balog/ /app/code/blog/


[root@web01 ~]# mount -t nfs 172.16.1.31:/nfs/blog/ /app/code/blog/

[root@web01 ~]# df -h 

df: /upload: 过旧的文件控柄
文件系统         容量  已用  可用 已用% 挂载点
devtmpfs         963M     0  963M    0% /dev
tmpfs            979M     0  979M    0% /dev/shm
tmpfs            979M  8.9M  970M    1% /run
tmpfs            979M     0  979M    0% /sys/fs/cgroup
/dev/sda3         97G  4.4G   93G    5% /
/dev/sda1       1014M  167M  848M   17% /boot
tmpfs            196M     0  196M    0% /run/user/0
nfs01:/nfs/blog   97G  4.3G   93G    5% /app/code/blog
#
创建文件测试

Rsync 备份服务

/nfs/backup/blog 模块 blog

服务端测试

shell
[root@backup /nfsbackup]# cat /etc/rsyncd.conf 
fake super = yes
uid = rsync
gid = rsync
max connections = 2000
timeout = 600
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
ignore errors
read only = false
list false
auth users = rsync_backup
secrets file = /etc/rsync.password

[nfsbackup]
comment = /nfsbackup/
path = /nfsbackup/

[blog]
comment = blog 
path = /nfs/backup/blog/
[root@backup /nfsbackup]# mkdir -p /nfs/backup/blog/

[root@backup /nfsbackup]# chown -R rsync.rsync /nfs/backup/blog/
[root@backup /nfsbackup]# systemctl restart rsyncd

客户端测试

shell
[root@nfs01 /nfs/blog]# rsync -avz /etc/hostname rsync_backup@172.16.1.41::blog
Password: 
sending incremental file list
hostname

sent 101 bytes  received 49 bytes  42.86 bytes/sec
total size is 6  speedup is 0.04
[root@nfs01 /nfs/blog]# systemctl status lsyncd.service 
 lsyncd.service - Live Syncing (Mirror) Daemon
   Loaded: loaded (/usr/lib/systemd/system/lsyncd.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2025-03-25 23:01:34 CST; 4s ago
     Docs: man:lsyncd(1)
           https://axkibe.github.io/lsyncd/
 Main PID: 5537 (lsyncd)
    Tasks: 1
   Memory: 476.0K
   CGroup: /system.slice/lsyncd.service
           └─5537 /usr/bin/lsyncd -nodaemon /etc/lsyncd.conf

3月 25 23:01:34 nfs01 systemd[1]: Started Live Syncing (Mirror) Daemon.
3月 25 23:01:34 nfs01 lsyncd[5537]: 23:01:34 Normal: --- Startup ---
3月 25 23:01:34 nfs01 lsyncd[5537]: 23:01:34 Normal: recursive startup rsync: /data/ -> rsync_backup@172.16.1.41::nfsbackup/
3月 25 23:01:34 nfs01 lsyncd[5537]: 23:01:34 Normal: recursive startup rsync: /nfs/blog/ -> rsync_backup@172.16.1.41::blog/
3月 25 23:01:34 nfs01 lsyncd[5537]: 23:01:34 Normal: Startup of /nfs/blog/ -> rsync_backup@172.16.1.41::blog/ finished.
3月 25 23:01:34 nfs01 lsyncd[5537]: 23:01:34 Normal: Startup of /data/ -> rsync_backup@172.16.1.41::nfsbackup/ finished.

[root@nfs01 /nfs/blog]# cat /etc/lsyncd.conf 
settings {
    logfile = "/var/log/lsyncd.log",  -- 日志文件,主要查看日志文件
    pidfile = "/var/run/lsyncd.pid",  -- PID文件
    statusFile = "/var/log/lsyncd.status",  -- 服务状态文件
    nodaemon = true,  -- 改为非守护进程模式,默认rsync命令,lsyncd
    maxProcesses = 2  -- 控制最多用于传输数据的进程数量(rsync进程数),根据CPU核心数来一致或2倍
}

sync {
    default.rsync,  -- 指定rsync工作模式
    source = "/data/",  -- 指定lsyncd监控目录,源目录
    target = "rsync_backup@172.16.1.41::nfsbackup",  -- 指定目标rsync服务端,用户名@IP地址::模块名字
    delay = 5,  -- 每隔15秒同步一次
    delete = true,  -- rsync命令的--delete选项
    rsync = {
        binary = "/usr/bin/rsync",  -- 命令位置
        archive = true,  -- rsync命令的-a选项
        compress = true,  -- rsync命令的-z选项,压缩
        password_file = "/etc/rsync.client"  -- 配置rsync--password-file密码文件
    }
}

sync {
    default.rsync,  -- 指定rsync工作模式
    source = "/nfs/blog/",  -- 指定lsyncd监控目录,源目录
    target = "rsync_backup@172.16.1.41::blog",  -- 指定目标rsync服务端,用户名@IP地址::模块名字
    delay = 5,  -- 每隔15秒同步一次
    delete = true,  -- rsync命令的--delete选项
    rsync = {
        binary = "/usr/bin/rsync",  -- 命令位置
        archive = true,  -- rsync命令的-a选项
        compress = true,  -- rsync命令的-z选项,压缩
        password_file = "/etc/rsync.client"  -- 配置rsync--password-file密码文件
    }
}

Lsyncd

shell
[root@nfs01 /nfs/blog]# cat /etc/lsyncd.conf 
settings {
    logfile = "/var/log/lsyncd.log",  -- 日志文件,主要查看日志文件
    pidfile = "/var/run/lsyncd.pid",  -- PID文件
    statusFile = "/var/log/lsyncd.status",  -- 服务状态文件
    nodaemon = true,  -- 改为非守护进程模式,默认rsync命令,lsyncd
    maxProcesses = 2  -- 控制最多用于传输数据的进程数量(rsync进程数),根据CPU核心数来一致或2倍
}

sync {
    default.rsync,  -- 指定rsync工作模式
    source = "/data/",  -- 指定lsyncd监控目录,源目录
    target = "rsync_backup@172.16.1.41::nfsbackup",  -- 指定目标rsync服务端,用户名@IP地址::模块名字
    delay = 5,  -- 每隔15秒同步一次
    delete = true,  -- rsync命令的--delete选项
    rsync = {
        binary = "/usr/bin/rsync",  -- 命令位置
        archive = true,  -- rsync命令的-a选项
        compress = true,  -- rsync命令的-z选项,压缩
        password_file = "/etc/rsync.client"  -- 配置rsync--password-file密码文件
    }
}

sync {
    default.rsync,  -- 指定rsync工作模式
    source = "/nfs/blog/",  -- 指定lsyncd监控目录,源目录
    target = "rsync_backup@172.16.1.41::blog",  -- 指定目标rsync服务端,用户名@IP地址::模块名字
    delay = 5,  -- 每隔15秒同步一次
    delete = true,  -- rsync命令的--delete选项
    rsync = {
        binary = "/usr/bin/rsync",  -- 命令位置
        archive = true,  -- rsync命令的-a选项
        compress = true,  -- rsync命令的-z选项,压缩
        password_file = "/etc/rsync.client"  -- 配置rsync--password-file密码文件
    }
}
~                                                                                                                                                
~  
[root@nfs01 /nfs/blog]# systemctl restart lsyncd

最终效果

同时创建文件

同时删除文件

感谢阅读,欢迎交流!