lsyncd + rsync 实时同步海量小文件



0x01 关于lsyncd

1
2
3
inotify的优秀替代品,基于lua,不过,它也依然使用 linux 2.6.13以后内核的inotify触发机制
配置简单灵活,在同步海量小文件时,性能表现优异,废话不多讲,咱们直奔主题
...

环境准备:

1
2
RsyncServer ip: 192.168.5.4
RsyncClient26 ip: 192.168.5.7

0x02 在需要进行实时同步的 rsync 客户端机器上[ 这里是RsyncClient26 ]编译安装lsyncd,如下

1
2
3
4
5
6
7
8
# yum install lua lua-devel asciidoc cmake -y
# wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/lsyncd/lsyncd-2.1.5.tar.gz
# tar xf lsyncd-2.1.5.tar.gz
# cd lsyncd-2.1.5/
# ./configure --prefix=/usr/local/lsyncd-2.1.5 && make && make install
# echo $? && cd
# ln -s /usr/local/lsyncd-2.1.5/ /usr/local/lsyncd/
# cd /usr/local/lsyncd/bin/ && ./lsyncd

0x02 关于 lsyncd.conf 配置文件的详细配置及配置项简要说明

settings 部分,其实就是关于lsyncd工具自身的一些选项设置:

1
2
3
4
5
6
7
logfile : 指定lsyncd工具本身运行所产生的日志文件存放位置
statusFile : 定义lsyncd监控目录状态文件的存放位置
statusInterval : 隔多少秒记录一次被监控目录的状态
nodaemon=true : 默认是不启用守护模式的
inotifyMode : 指定要监控的事件,如,CloseWrite,Modify,CloseWrite or Modify
maxProcesses : 指定同步时进程的最大个数
maxDelays : 当事件被命中累计多少次后才进行一次同步

sync 部分主要用来定义同步时的一些设置,可以同时同步多个目录,只需要在该代码块中事先定义好多个sync即可

1
2
3
4
5
6
7
default.rsync : 指定lsyncd运行模式,另外,还有default.direct,default.rsyncssh模式,个人建议缺省
source : 指定要监控的目录,务必全部用绝对路径
target : 要同步到的目标目录,一般为rsync服务端模块下指定的目录
init : 为false时表示只同步lsyncd进程启动以后发生改动事件的文件,否则,反之,默认为true
delay : 当命中的事件累计到多少时再触发同步
exclude : 通过此选项排除掉不需要同步的文件,可用它自己的正则进行匹配
delete : 和rsync--delete 作用一样,先清空再同步

下面是关于 rsync 工具自身的一些设置选项

1
2
3
4
compress : 压缩后再同步
bwlimit : 限速同步,当你不想占满带宽时
archive : 归档模式同步
perms : 保留文件原有属性同步

0x03 开始实战配置 lsyncd.conf

1
2
# mkdir -p /usr/local/lsyncd-2.1.5/{var,etc}
# vi /usr/local/lsyncd/etc/lsyncd.conf

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
settings {
logfile ="/usr/local/lsyncd-2.1.5/var/lsyncd.log",
statusFile ="/usr/local/lsyncd-2.1.5/var/lsyncd.status",
inotifyMode = "CloseWrite or Modify",
maxProcesses = 10,
statusInterval = 10,
nodaemon = true,
maxDelays = 20
}
sync {
default.rsync,
source = "/bakdata/",
target = "rsync_backup@192.168.5.4::webbak",
delete="true",
exclude = { "dir*" },
delay = 10,
init = false,
rsync = {
bwlimit=200,
binary = "/usr/bin/rsync",
archive = true,
compress = true,
verbose = true,
perms = true,
password_file = "/etc/rsync.password"
}
}

0x04 加载自定义配置文件,启动lsyncd

1
2
3
4
# /usr/local/lsyncd/bin/lsyncd -log all /usr/local/lsyncd/etc/lsyncd.conf &>/dev/null &
# echo "/usr/local/lsyncd/bin/lsyncd -log all /usr/local/lsyncd/etc/lsyncd.conf &>/dev/null &" >> /etc/rc.local
# ps -le | grep lsyncd 先看下lsyncd进程有没有正常起来
# mkdir /bakdata/lsyncd{1..58} 接着,尝试在要同步的目录下批量创建文件,看能不能按指定的时间正常延迟同步

0x05 从日志中仔细观察同步过程

1
# tail -f /usr/local/lsyncd/var/lsyncd.log


0x06 观察监控目录中的事件命中状态

1
# cat /usr/local/lsyncd/var/lsyncd.status




小结:
    其实,lsyncd 还支持当监控到某个指定事件时就执行什么样的命令,待自己详读官方文档后再做单独说明,由于是通过时间延迟和累计事件命中次数来触发同步,在设计上要优于inotify,更多内容,如果有兴趣大家可自行参考其官方文档,待续…