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

 

posted @ 2023-07-28 09:56  阿锋888  阅读(586)  评论(0编辑  收藏  举报