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

0x01 关于lsyncd

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

环境准备:

RsyncServer	ip: 192.168.5.4
RsyncClient26 	ip: 192.168.5.7

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

# 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工具自身的一些选项设置:

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

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

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

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

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

0x03 开始实战配置 lsyncd.conf

# mkdir -p /usr/local/lsyncd-2.1.5/{var,etc}
# vi /usr/local/lsyncd/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 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

# /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 从日志中仔细观察同步过程

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

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

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

小结:

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