Appearance
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/目录下,便于管理和访问。
用户角度流程:
- 上传文件:用户通过 Web 服务器上传文件到 指定的
/upload/
目录。 - NFS 挂载:
/upload/
和 NFS 上的/data/
目录进行了永久挂载 - Lsyncd 监控:在 NFS 服务端上通过 Lsyncd 监控指定的
/upload/
目录 - 数据备份:备份服务器使用
lrsync
从 NFS 共享目录中拉取文件进行备份,并通过nfsbackup
模块安全实时传输数据 - 最终效果:用户在
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