lsync和rsync
Lsyncd 实际上是lua语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过rsync去差异同步,达到实时的效果。我认为它最令人称道的特性是,完美解决了 inotify + rsync
海量文件同步带来的文件频繁发送文件列表的问题 —— 通过时间延迟或累计触发事件次数实现。另外,它的配置方式很简单,lua本身就是一种配置语言,可读性非常强。lsyncd也有多种工作模式可以选择,本地目录cp,本地目录rsync,远程目录rsyncssh
使用 lsyncd 本地目录实时备份
这一节实现的功能是,本地目录source实时同步到另一个目录target,而在source下有大量的文件,并且有部分目录和临时文件不需要同步。
1.1 安装lsyncd客户端
yum install lua lua-devel #安装依赖 yum install epel-release #lsync在epel库中 rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm yum install lsyncd -y
1.2配置文件/etc/lsyncd.conf
# vi etc/lsyncd.conf
settings {
logfile ="/usr/local/lsyncd-2.1.5/var/lsyncd.log",
statusFile ="/usr/local/lsyncd-2.1.5/var/lsyncd.status",
inotifyMode = "CloseWrite", -- 仅在文件被关闭写入后触发同步操作
maxProcesses = 7 -- 同步进程最大数
}
sync {
default.rsync,
source = "/tmp/src", -- 源目录路径
target = "/tmp/dest", -- 目标目录路径
delay = 3, -- 3秒同步一次
init = false, -- lsync启动时不执行初始同步
delete = false, -- 不删除目标路径文件
-- excludeFrom = "/etc/rsyncd.d/rsync_exclude.list", -- 排除文件列表的文件路径
exclude = {"*.log","direst_excloud/","**/*.txt"} -- 排除文件
-- include = {"*.jpg", "*.gif", "*.png"}, -- 只包括这些文件类型
rsync = {
binary = "/usr/bin/rsync", -- rsync二进制文件路径
archive = true, -- 使用归档模式,保留文件权限、所有者等信息;递归地复制所有文件,包括子目录
compress = false, -- 关闭压缩传输,默认是true启用
verbose = true -- 启用详细输出模式
_extra = {"--bwlimit=2000"} --限制带宽,将传输速率限制在每秒2000字节。视情况而定
}
}
settings 里面是全局设置,下面是几个常用选项说明: logfile 定义日志文件 stausFile 定义状态文件,记录lsyncd同步过程中的状态信息和元数据的文件。作用:跟踪同步状态,避免重复同步,恢复同步 nodaemon=true 表示不启用守护模式,默认启用守护模式(nodaemon=false) statusInterval 将lsyncd的状态写入上面的statusFile的间隔,默认10秒 inotifyMode 指定inotify监控的事件,默认是CloseWrite(仅在文件被关闭写入后触发同步操作)。还有"Modify"
: 在文件内容修改时触发同步操作。"Close"
: 在文件被关闭时触发同步操作,无论是否有写入操作。"Create"
: 在文件被创建时触发同步操作。"Delete"
: 在文件被删除时触发同步操作。
maxProcesses 同步进程的最大个数。假如同时有20个文件需要同步,而maxProcesses = 8,则最大能看到有8个rysnc进程 maxDelays 累计到多少所监控的事件激活一次同步,即使后面的delay延迟时间还未到
sync 里面是定义同步参数,可以继续使用maxDelays来重写settings的全局变量。
一般第一个参数指定lsyncd以什么模式运行:rsync、rsyncssh、direct三种模式: default.rsync :本地目录间同步,使用rsync,也可以达到使用ssh形式的远程rsync效果,或daemon方式连接远程rsyncd进程; default.direct :本地目录间同步,使用cp、rm等命令完成差异文件备份; default.rsyncssh :同步到远程主机目录,rsync的ssh模式,需要使用key来认证 source 同步的源目录,使用绝对路径。 target 定义目的地址.对应不同的模式有几种写法: /tmp/dest :本地目录同步,可用于direct和rsync模式 172.29.88.223:/tmp/dest :同步到远程服务器目录,可用于rsync和rsyncssh模式172.29.88.223::module :同步到远程服务器目录,用于rsync模式 三种模式的示例会在后面给出。 init 当init = false,lsyncd将不会在启动时执行初始同步。这意味着,如果在配置文件中定义了一个新的同步任务或更改了同步源(source)或目标(target),
lsyncd将不会自动执行一次完整的同步操作。默认是true,lsyncd会在启动时执行一次完整的同步以确保源和目标之间的一致性。 delay 累计事件,等待rsync同步延时时间,默认15秒(最大累计到1000个不可合并的事件)。也就是15s内监控目录下发生的改动,会累积到一次rsync同步,避免过于频繁的同步。(可合并的意思是,15s内两次修改了同一文件,最后只同步最新的文件) excludeFrom 排除选项,后面指定排除的列表文件,如excludeFrom = "/etc/lsyncd.exclude",如果是简单的排除,可以使用exclude = LIST。 delete 为了保持target与souce完全同步,Lsyncd默认会delete = true来允许同步删除。它除了false,还有startup、running值
rsync (提示一下,delete和exclude本来都是rsync的选项,上面是配置在sync中的,我想这样做的原因是为了减少rsync的开销) bwlimit 限速 compress 压缩传输默认为true。在带宽与cpu负载之间权衡,本地目录同步可以考虑把它设为false perms 默认保留文件权限。 lsyncd.conf可以有多个sync,各自的source,各自的target,各自的模式,互不影响。
1.3 启动lsyncd
systemctl enabel lsyncd --now
systemctl status lsyncd
1.4 lsyncd.conf其它模式示例
settings { logfile ="/usr/local/lsyncd-2.1.5/var/lsyncd.log", statusFile ="/usr/local/lsyncd-2.1.5/var/lsyncd.status", inotifyMode = "CloseWrite", maxProcesses = 8, } -- I. 本地目录同步,direct:cp/rm/mv。 适用:500+万文件,变动不大 sync { default.direct, source = "/tmp/src", target = "/tmp/dest", delay = 1 maxProcesses = 1 } -- II. 本地目录同步,rsync模式:rsync sync { default.rsync, source = "/tmp/src", target = "/tmp/dest1", excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst", rsync = { binary = "/usr/bin/rsync", archive = true, compress = true, bwlimit = 2000 } } -- 远程同步,需要目的服务器开启rsync服务端,且配置ssh免密登录 -- III. 远程目录同步,rsync模式 + rsyncd daemon,daemon方式远程连接rsync进程 sync { default.rsync, source = "/tmp/src", target = "syncuser@172.29.88.223::module1", exclude = { ".*", ".tmp" }, delay = 30, init = false, rsync = { binary = "/usr/bin/rsync", archive = true, compress = true, verbose = true, password_file = "/etc/rsyncd.d/rsync.pwd", _extra = {"--bwlimit=200"} } } -- IV. 远程目录同步,rsync模式 + ssh shell sync { default.rsync, source = "/tmp/src", target = "172.29.88.223:/tmp/dest", -- target = "root@172.29.88.223:/remote/dest", -- 上面target,注意如果是普通用户,必须拥有写权限 maxDelays = 5, delay = 30, -- init = true, rsync = { binary = "/usr/bin/rsync", archive = true, compress = true, bwlimit = 2000 -- rsh = "/usr/bin/ssh -p 22 -o StrictHostKeyChecking=no" -- 如果要指定其它端口,请用上面的rsh } } -- V. 远程目录同步,rsync模式 + rsyncssh,效果与上面相同 sync { default.rsyncssh, source = "/tmp/src2", host = "172.29.88.223", targetdir = "/remote/dir", excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst", -- maxDelays = 5, delay = 0, -- init = false, rsync = { binary = "/usr/bin/rsync", archive = true, compress = true, verbose = true, _extra = {"--bwlimit=2000"}, }, ssh = { port = 1234 } }
1.5. lsyncd的其它功能
lsyncd
的功能不仅仅是同步,还可以监控某个目录下的文件,根据触发的事件自己定义要执行的命令,example是监控某个某个目录,只要是有jpg、gif、png格式的文件参数,就把它 们转成pdf,然后同步到另一个目录。但,门槛在于要会一点点lua语言(请教chatgpt)。2.安装rsync服务端
2.1安装
yum install rsync
2.2配置文件
#vim /etc/rsyncd.conf
#port = 873 #默认端口873,可自行更改 uid = root gid = root use chroot = no -- 不使用chroot,可以自由访问服务器上的其他文件和目录 max connections = 200 -- 最大连接数200 pid file = /var/run/rsyncd.pid log file = /var/log/rsyncd.log lock file = /var/run/rsyncd.lock -- 锁文件,确保在同一时间只能有一个rsync服务器进程在运行,以避免资源冲突 [backup] --模块1,可多个 path = /data read only = no -- 允许读写 auth users = compress -- 只有用户"compress"才被授权访问该模块 secrets file = /etc/rsyncd.secrets --用户compress密码文件,用于身份验证 list = no -- 提高安全性,防止未经授权的用户获取模块中的文件和目录列表信息 [data] --模块2 path = /data read only = no auth users = compress secrets file = /etc/rsyncd.secrets list = no
密码配置文件
#vi /etc/rsyncd.secrets compress:UJM*123 chmod 600 /etc/rsyncd.secrets
确保文件权限为 600
2.3 启动服务
systemctl enable rsync --now
2.4 同步命令
例1: 通过服务端7701端口 推送/home/appmanager/zhj/ 推送到172.18.85.8的down下
./rsync -avH --port=7701 --progress /home/appmanager/zhj/ --password-file=/app/ICSR4TEST/rsync/rsyncd.passwd root@172.18.85.8:down/
./rsync:运行当前目录下的rsync可执行文件。 -avzH:a归档模式,v输出详细日志,z压缩传输,H保留硬链接。 --port=7701:指定rsync连接的端口号为7701(非默认端口),默认端口不用写此参数 --delete:删除目标端上与源端不一致的文件。 --progress:显示传输进度。--remove-source-files
:在成功复制后删除源文件 /home/appmanager/zhj/:源目录路径,需要同步的文件或目录所在的位置。 --password-file=/app/ICSR4TEST/rsync/rsyncd.passwd:指定密码文件的路径,其中包含了与目标端连接所需的密码信息。格式username:password,权限600 root@172.18.85.8:down/:目标端的用户名、IP地址和目标目录路径,表示将文件同步到目标端的down目录下。
例2:从服务端拉取文件保存到/app/ICSR4TEST/zhj
./rsync -avz --port=7701 --password-file=/app/ICSR4TEST/rsync/rsyncd.passwd rootmv@172.18.85.2::down/ --progress /app/ICSR4TEST/zhj