rsyncd实时同步

📖 介绍

Lysncd 实际上是lua语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过rsync去差异同步,达到实时的效果。我认为它最令人称道的特性是,完美解决了 inotify + rsync海量文件同步带来的文件频繁发送文件列表的问题 —— 通过时间延迟或累计触发事件次数实现。另外,它的配置方式很简单,lua本身就是一种配置语言,可读性非常强。lsyncd也有多种工作模式可以选择,本地目录cp,本地目录rsync,远程目录rsyncssh。

🧰 部署

主机 服务器 需要安装的服务
8.142.100.116(Slave) Centos7.9 rsync
192.168.99.5(Master) Centos7.9 lsyncd

远程同步

部署需要在master安装lsyncd,lsyncd会通过ssh协议把本地数据实时同步到slave节点,同步之前master和slave需要做ssh免密认证

1
2
3
4
5
1、首先,确保系统已经安装了EPEL存储库。如果未安装,请运行以下命令进行安装:
yum install lsyncd
systemctl start lsyncd.service && systemctl enable lsyncd.service
2、安装lsyncd软件包,也可以创建配置目录方便写多个配置文件,需要在主配置里面用include包含,例如include "/path/to/config1.lua"
sudo yum install lsyncd

3、配置lsyncd,编辑/etc/lsyncd.conf文件,记得删除注释

如果同步文件目录过多需要写子目录配置可以添加include。例如:include “/path/to/config1.lua”,当然也支持多个目录卸载同一目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@test-95 ~]# cat /etc/lsyncd.conf
settings { #全局配置
logfile ="/var/log/lsyncd/lsyncd.log", #定义系统日志
statusFile ="/var/log/lsyncd/lsyncd.status", # 定义传输状态日志
inotifyMode = "CloseWrite or Modify", # 同步写入完成,和正在写入的文件,(这个操作模式可以提高同步的及时性,但可能会增加系统负载)
-- nodaemon =true, # 表示不启用守护模式
statusInterval=3, # 将lsyncd的状态写入上面的statusFile的间隔,默认10秒
maxProcesses = 1, #最大进程数
}

-- 异地同步
sync { # 里面是定义同步参数
default.rsyncssh, # rsync、rsyncssh、direct三种模式:
source = "/data", # 同步的源目录,使用绝对路径
host = "root@8.142.100.116", #主机地址和以什么用户链接
targetdir = "/tmp/data", # 定义目的地址
delay=3, #累计事件,等待rsync同步延时时间
delete = false, #为了保持target与souce完全同步,Lsyncd默认会`delete = true`来允许同步删除。
maxDelays=2, # 累计到多少所监控的事件激活一次同步,即使后面的delay延迟时间还未到
rsync = { # 使用rsync同步
binary = "/usr/bin/rsync", #rsync命令的绝对路径
archive = true, #递归,即同步子目录的内容
compress = false, #传输过程中压缩文件数据,相对其他压缩工具而言,它可以获得更好的压缩率,但是需要消耗CPU资源。
perms = true, # 默认保留文件权限。
owner = true, # 保留文件所属组
rsh = "-e /usr/bin/ssh -p 22 -l dx -i /home/dx/.ssh/id_rsa -o StrictHostKeyChecking=no", # 定义链接方式
},
ssh = {
port = 22, # ssh端口
options = {User = 'dx'}, # ssh 用户
_extra = { "-i /home/dx/.ssh/id_rsa"} # 指定私钥链接
}
}

配置选项说明

settings 里面是全局设置,–开头表示注释,下面是几个常用选项说明:

logfile 定义日志文件
stausFile 定义状态文件
nodaemon=true 表示不启用守护模式,默认

statusInterval 将lsyncd的状态写入上面的statusFile的间隔,默认10秒
inotifyMode 指定inotify监控的事件,默认是CloseWrite,还可以是Modify或CloseWrite or Modify

-CloseWrite: 只同步在写入完成后被关闭的文件。这是默认的操作模式,适用于大多数情况。

-Modify: 同步所有经过修改的文件,即使它们正在被写入。这个操作模式可以提高同步的及时性,但可能会增加系统负载。

maxProcesses 同步进程的最大个数。假如同时有20个文件需要同步,而maxProcesses = 8,则最大能看到有8个rysnc进程

maxDelays 累计到多少所监控的事件激活一次同步,即使后面的delay延迟时间还未到

insist: 如果设置为true,则当第一个同步任务失败时,lsyncd将继续进行下一个同步,并在日志中记录错误信息。

sync 里面是定义同步参数

  • default.rsync :本地目录间同步,使用rsync,也可以达到使用ssh形式的远程rsync效果,或daemon方式连接远程rsyncd进程;

    default.direct :本地目录间同步,使用cp、rm等命令完成差异文件备份;

    default.rsyncssh :同步到远程主机目录,rsync的ssh模式,需要使用key来认证

  • source 同步的源目录,使用绝对路径

  • targetdir 定义远程目的地址.对应不同的模式有几种写法:

  • delay 累计事件,等待rsync同步延时时间(默认15s内两次修改了同一文件,最后只同步最新的文件)

  • delete 为了保持target与souce完全同步,Lsyncd默认会delete = true来允许同步删除。它除了false,还有startuprunning

  • excludeFrom 排除选项,后面指定排除的列表文件

本地同步

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
settings {
logfile ="/var/log/lsyncd/lsyncd.log",
statusFile ="/var/log/lsyncd/lsyncd.status",
inotifyMode = "CloseWrite",
maxProcesses = 7,
-- nodaemon =true,
}
sync {
default.rsync,
source = "/data",
target = "/tmp/data",
delay=3,
delete = false,
-- excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst",
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
verbose = true
}
}

多任务同步

如果有多个路径实时同步任务可以参考以下内容,也可以通过include 写多个子文件方便管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
[root@test-95 ~]# cat lsyncd.conf
settings {
logfile ="/var/log/lsyncd/lsyncd.log",
statusFile ="/var/log/lsyncd/lsyncd.status",
inotifyMode = "CloseWrite",
maxProcesses = 1,
-- nodaemon =true,
}

-- 本地同步
sync {
default.rsync,
source = "/data",
target = "/tmp/data",
delay=3,
-- excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst",
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
verbose = true
}
}

-- 异地同步
sync {
default.rsyncssh,
source = "/data",
host = "root@8.142.100.116",
targetdir = "/tmp/",
delay=3,
delete = false,
maxDelays=2,
rsync = {
binary = "/usr/bin/rsync",
archive = false,
compress = false,
perms = true,
owner = true,
rsh = "-e /usr/bin/ssh -p 22 -l root -i /home/dx/.ssh/id_rsa",
},
ssh = {
port = 22,
options = {User = 'root'},
_extra = { "-i /home/dx/.ssh/id_rsa"}
}
}