使用lsyncd本地目录实时备份
- lsyncd简介
- 安装lsyncd
- lsyncd配置文件
- 设置ssh免密
- lsyncd同步配置
- lsyncd.conf配置选项说明
- settings
- sync
- rsync
- 启动lsyncd
- lsyncd.conf其他模式示例
lsyncd简介
Lysncd 实际上是lua语言封装了 inotify 和 rsync 工具!实现的功能是,本地目录source实时同步到另一个目录target,而在source下有大量的文件,并且有部分目录和临时文件不需要同步。
原则上来讲:数据从哪来,Lysncd就部署在哪!"
| 角色 | 数据流向 | 作用 | 相互SSH免密 | hostname | 软件包 | 数据同步路径 |
|---|---|---|---|---|---|---|
| 源服务器 (Push端) | 数据的起点 | 监控与推送 | yes | file_server | rsync + lsyncd | /tmp/sersync_result/ |
| 目标服务器 (Pull端) | 数据的终点 | 接收和存储 | yes | ecs | rsync | /tmp/sersync_result/ |
安装lsyncd
安装lsyncd极为简单,一条yum命令即可!
# 因为这个rpm包在epel源中,所以需要先安装epel源yuminstallepel-release -y# 安装lsyncdyuminstalllsyncd -ylsyncd配置文件
参考博文:https://www.cnblogs.com/lvzhenjiang/p/14198841.html
https://www.cnblogs.com/lvzhenjiang/p/14411173.html
vim/etc/lsyncd.conf设置ssh免密
ssh-copy-id${源机器}ssh-copy-id${目的地机器}lsyncd同步配置
-- 配置全局设置settings{-- 指定日志文件路径,用于记录同步过程中的日志信息logfile="/var/log/lsyncd/lsyncd.log",-- 指定状态文件路径,用于记录lsyncd的运行状态statusFile="/var/log/lsyncd/lsyncd.status",-- 设置inotify监控模式为CloseWrite,即文件关闭写入时触发同步inotifyMode="CloseWrite",-- 设置最大并发进程数为7maxProcesses=7,-- 注释掉的选项:设置为true时以非守护进程模式运行-- nodaemon =true,}-- 定义同步任务配置sync{-- 使用默认的rsyncssh同步模式(通过SSH隧道使用rsync)default.rsyncssh,-- 源目录:需要同步的本地目录路径source="/tmp/src",-- 目的主机:远程服务器IP地址host="192.168.2.16",-- 远程目录:在目标主机上的同步目录路径targetdir="/root/remote",-- 启用删除功能,当源目录删除文件时,目标目录也会删除对应文件delete=true,-- 设置同步延迟为0秒,即实时同步delay=0,-- 注释掉的选项:指定排除规则文件路径-- excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst",-- rsync相关配置参数rsync={-- 指定rsync可执行文件路径binary="/usr/bin/rsync",-- 启用归档模式,保持文件属性、时间戳等信息archive=true,-- 启用压缩传输,减少网络传输数据量compress=true,-- 启用详细输出模式verbose=true,-- 保持文件所有者信息owner=true,-- 保持文件权限信息perms=true,-- rsync额外参数:限制带宽为2000KB/s-- _extra = { "--bwlimit=2000" },},-- SSH相关配置参数ssh={-- 设置SSH连接端口为22port=22}}到这启动 lsycnd 就可以完成实时同步了,默认的许多参数可以满足绝大部分需求,非常简单。
lsyncd.conf配置选项说明
settings
里面是全局设置,--开头表示注释,下面是几个常用选项说明:
| 配置项 | 说明 | 默认值 / 补充说明 |
|---|---|---|
| logfile | 定义 lsyncd 的日志文件路径 | 无(需显式指定) |
| statusFile | 定义 lsyncd 的状态文件路径 | 无(需显式指定) |
| nodaemon | 是否以非守护进程模式运行 | true(即默认不启用守护模式) |
| statusInterval | 将 lsyncd 状态写入 statusFile 的时间间隔(秒) | 10 秒 |
| inotifyMode | 指定 inotify 监控的文件事件类型 | CloseWrite;可选值:Modify、CloseWrite or Modify |
| maxProcesses | 同时运行的最大 rsync 同步进程数 | 无固定默认值(通常由用户根据系统资源设定) |
| maxDelays | 累计监控到多少个事件后立即触发同步(即使未达到 delay 设定的时间) | 无固定默认值(常与 delay 配合使用) |
sync
定义一个或多个同步任务(可配置多个sync块)。
里面是定义同步参数,可以继续使用maxDelays来重写settings的全局变量。一般第一个参数指定lsyncd以什么模式运行:
rsync、rsyncssh、direct三种模式:
| 同步模式(sync kind) | 说明 | 适用场景 | 认证/依赖要求 |
|---|---|---|---|
default.rsyncssh | 使用rsync通过 SSH 协议同步到远程主机目录 | 跨主机安全同步(常用在异地备份、部署等) | 必须配置 SSH 免密登录(如密钥认证) |
default.rsync | 使用rsync命令进行同步;支持本地目录同步,也可通过 SSH 或 rsync daemon 实现远程同步 | 本地同步,或需要兼容远程 rsync(SSH/daemon)的场景 | 若远程使用 SSH,需配置免密登录或密钥 |
default.direct | 使用原生命令如cp、rm、mv等直接操作文件,实现本地差异同步 | 仅限本地目录间快速同步,对性能要求高且无需网络传输 | 无(纯本地操作) |
| 配置项 | 说明 | 示例 / 选项说明 |
|---|---|---|
default.rsyncdefault.directdefault.rsyncssh | 指定同步模式: •rsync:本地或远程(SSH/rsyncd) •direct:本地cp/rm•rsyncssh:强制通过 SSH 远程同步 | 三选一 |
source | 被监控的源目录(必须为绝对路径) | /data/www/ |
target | 同步目标路径: • 本地:/backup/• 远程 rsyncd:rsyncuser@192.168.99.237::backuprsyncuser:远程用户192.168.99.237:备机 IP::backup:rsync 模块名 | 注意模块名和服务端配置一致 |
init | 是否在启动时全量同步一次源目录 | true(默认);false表示仅同步启动后变更的文件 |
delay | 事件触发后延迟多少秒再执行同步(防频繁触发) | 通常设为1(秒) |
excludeFrom | 排除不需要同步的文件(支持通配符或正则) | exclude = { "*.swp", "*.log" } |
delete | 控制是否删除目标端源端已不存在的文件 | -true:始终同步删除(默认) -false:从不删除 -'startup':仅启动时删除 -'running':仅运行时删除(启动时不删) |
excludeFrom排除选项,后面指定排除的列表文件,如excludeFrom = "/etc/lsyncd.exclude",如果是简单的排除,可以使用exclude = LIST。这里的排除规则写法与原生rsync有点不同,更为简单:- 监控路径里的任何部分匹配到一个文本,都会被排除,例如
/bin/foo/bar可以匹配规则foo - 如果规则以斜线
/开头,则从头开始要匹配全部 - 如果规则以
/结尾,则要匹配监控路径的末尾 ?匹配任何字符,但不包括/*匹配0或多个字符,但不包括/**匹配0或多个字符,可以是/
- 监控路径里的任何部分匹配到一个文本,都会被排除,例如
rsync
(提示一下,delete和exclude本来都是rsync的选项,上面是配置在sync中的,我想这样做的原因是为了减少rsync的开销)
bwlimit限速,单位kb/s,与rsync相同(这么重要的选项在文档里竟然没有标出);compress压缩传输默认为true。在带宽与cpu负载之间权衡,本地目录同步可以考虑把它设为false;perms默认保留文件权限;- 其它rsync的选项;
其它还有rsyncssh模式独有的配置项,如host、targetdir、rsync_path、password_file,见后文示例。rsyncOps={"-avz","--delete"}这样的写法在2.1.*版本已经不支持。
lsyncd.conf可以有多个sync,各自的source,各自的target,各自的模式,互不影响。
启动lsyncd
使用命令加载配置文件,启动守护进程,自动同步目录操作。
# 自行查看source target是否同步成功systemctlenable--now lsyncd# 确保状态是active (running)systemctl status lsyncd -llsyncd.conf其他模式示例
以下配置本人都已经过验证可行,必须根据实际需要裁剪配置:
settings{logfile="/var/log/lsyncd/lsyncd.log", statusFile="/var/log/lsyncd/lsyncd.status", inotifyMode="CloseWrite", maxProcesses=8,}# I. 本地目录同步directcp/rm/mv 适用500+万文件变动不大sync{default.direct,source="/tmp/src", target="/tmp/dest", delay=1maxProcesses=1}# II. 本地目录同步rsync模式rsyncsync{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}}# III. 远程目录同步rsync模式 + rsyncd daemonsync{default.rsync,source="/tmp/src", target="syncuser@10.4.7.10::module1",delete="running", 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 shellsync{default.rsync,source="/tmp/src", target="10.4.7.10:/tmp/dest",# target = "root@10.4.7.10:/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="10.4.7.10", 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}}