lsyncd实时同步搭建
#########################源码编译安装##############################
从源码编译安装可以使用最新版的lsyncd程序,但必须要相应的依赖库文件和编译工具:yum install lua lua-devel asciidoc cmake
从github上下载lsyncd-XXXXXX.zip 的版本使用的是 cmake 编译工具,无法./configure
下载地址:https://github.com/axkibe/lsyncd.git
安装:
unzip lsyncd-release-2.2.2.zip
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/lsyncd-2.2.2
make && make install
异常问题:
-- The C compiler identification is GNU 4.4.7
-- The CXX compiler identification is unknown
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
CMake Error: your CXX compiler: "CMAKE_CXX_COMPILER-NOTFOUND" was not found. Please set CMAKE_CXX_COMPILER to a valid compiler path or name.
-- Found Lua: /usr/lib64/liblua.so;/usr/lib64/libm.so (found version "5.1.4")
-- Configuring incomplete, errors occurred!
See also "/tmp/lsyncd-release-2.2.2/CMakeFiles/CMakeOutput.log".
See also "/tmp/lsyncd-release-2.2.2/CMakeFiles/CMakeError.log".
解决方案:
yum -y install gcc-c++
设置环境变量:ln -s /usr/local/lsyncd-2.2.2/bin/lsyncd /usr/local/bin/lsyncd
###################################配置文件与参数###############################
配置文件:
cd /usr/local/lsyncd-2.2.2
mkdir etc logs
这里我们创建2个目录文件方便存放配置文件以及日志文件
vim lsyncd.conf
settings
里面是全局设置,--开头表示注释,下面是几个常用选项说明:
settings {
logfile ="/usr/local/lsyncd-2.2.2/var/lsyncd.log",
statusFile ="/usr/local/lsyncd-2.2.2/var/lsyncd.status",
inotifyMode = "CloseWrite",
maxProcesses = 7,
-- nodaemon =true,
}
sync
里面是定义同步参数,可以继续使用maxDelays来重写settings的全局变量。一般第一个参数指定lsyncd以什么模式运行:rsync、rsyncssh、direct三种模式:
sync {
default.rsync,
source = "/opt/data",
target = "[email protected]:/opt/data",
maxDelays = 5,
delay = 30,
delete = true,
-- init = true,
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
-- bwlimit = 2000
-- rsh = "/usr/bin/ssh -p 22 -o StrictHostKeyChecking=no"
}
}
settings
logfile 定义日志文件
stausFile 定义状态文件
inotifyMode 指定inotify监控的事件,默认是CloseWrite,还可以是Modify或CloseWrite or Modify
maxProcesses 同步进程的最大个数。假如同时有20个文件需要同步,而maxProcesses = 8,则最大能看到有8个rysnc进程
nodaemon=true 表示不启用守护模式,默认
sync
default.rsync :本地目录间同步,使用rsync,也可以达到使用ssh形式的远程rsync效果,或daemon方式连接远程rsyncd进程;
default.direct :本地目录间同步,使用cp、rm等命令完成差异文件备份;
default.rsyncssh :同步到远程主机目录,rsync的ssh模式,需要使用key来认证
source 同步的源目录,使用绝对路径。
target 定义目的地址.
对应不同的模式有几种写法:
/opt/data :本地目录同步,可用于direct和rsync模式
192.168.166.145:/opt/data :同步到远程服务器目录,可用于rsync和rsyncssh模式,拼接的命令类似于/usr/bin/rsync -ltsd --delete --include-from=- --exclude=* SOURCE TARGET,剩下的就是rsync的内容了,比如指定username,免密码同步
192.168.166.145::module :同步到远程服务器目录,用于rsync模式
init 这是一个优化选项,当init = false,只同步进程启动以后发生改动事件的文件,原有的目录即使有差异也不会同步。默认是true
delete 为了保持target与souce完全同步,Lsyncd默认会delete = true来允许同步删除。它除了false,还有startup、running值
true:默认。Lsyncd将在目标上删除任何不在源中的内容。在启动时和正常操作中被删除的内容。
false:Lsyncd不会删除目标上的任何文件。不在启动或正常运行。(可能覆盖)
startup:当启动时,Lsyncd将删除目标上的文件,但不会在正常操作中删除。
running:启动时,Lsyncd不会删除目标上的文件,但会删除在正常操作期间删除的文件。
excludeFrom 排除选项,后面指定排除的列表文件,如excludeFrom = "/etc/lsyncd.exclude",如果是简单的排除,可以使用exclude = LIST
rsync
delete和exclude本来都是rsync的选项,上面是配置在sync中的,我想这样做的原因是为了减少rsync的开销
bwlimit 限速,单位kb/s,与rsync相同(这么重要的选项在文档里竟然没有标出)
compress 压缩传输默认为true。在带宽与cpu负载之间权衡,本地目录同步可以考虑把它设为false
perms 默认保留文件权限
lsyncd.conf可以有多个sync,各自的source,各自的target,各自的模式,互不影响。
启动:lsyncd -log Exec /usr/local/lsyncd-2.2.2/etc/lsyncd.conf
################################lsyncd.conf其它模式示例#################################
测试:根据需要 我们只测试了远程主机同步的方法
源地址:192.168.166.150
同步目的地址:192.168.166.145
1、rsync + rsyncd daemon
sync {
default.rsync,
source = "/opt/data",
target = "[email protected]:/opt/data",
delete="running",
delay = 30,
-- init = false,
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
verbose = true,
_extra = {"--bwlimit=20000"}
}
}
这个方式要求像rsync一样配置rsyncd服务端
2、rsync+ssh shell
sync {
default.rsync,
source = "/opt/data",
target = "[email protected]:/opt/data",
maxDelays = 5,
delay = 30,
delete = true,
-- init = true,
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
-- bwlimit = 20000
-- rsh = "/usr/bin/ssh -p 22 -o StrictHostKeyChecking=no"
}
}
3、rsync+rsyncssh
sync {
default.rsyncssh,
source = "/opt/data",
host = "192.168.166.145",
targetdir = "/opt/data",
-- excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst",
maxDelays = 5,
delay = 0,
-- init = true,
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
verbose = true,
_extra = {"--bwlimit=20000"},
},
ssh = {
port = 22
}
}
2和3配置ssh方式同步,达到的效果相同
#################################cpu和load测试结果#######################################
经过测试,三种模式都是基于Rsync的原生态模型方式进行同步,不同的区别在于第一种是基于rsync服务,后两种是基于rsync和ssh服务,三种同步方式都是通过hash值的校验,只传送同步差异文件。
服务器cpu性能:8核8G
在同步40G大小的文件(8000个文件)的测试中,(三种模式)cpu性能一直保持在:
source端
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
30781 root 20 0 162m 34m 1008 R 100.0 0.4 0:13.85 rsync
30659 root 20 0 105m 5980 3576 S 28.2 0.1 1:08.01 sshd
load average: 1.00, 0.55, 0.35
target端
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
27268 root 20 0 103m 6528 3140 S 22.6 0.1 0:16.38 sshd
27277 root 20 0 162m 52m 300 R 20.6 0.7 0:14.09 rsync
load average: 0.13, 0.07, 0.02
################################iptables断网测试#####################################
iptables断网测试:
主要测试在同步过程中,网络突然中断后,是否能够继续同步,以及中断过程同步的文件在恢复后MD5校验是否一致
首先在目的同步地址加入一条iptables策略
-A INPUT -s 192.168.166.150/32 -p tcp -m tcp --dport 22 -j REJECT --reject-with icmp-port-unreachable
目的是为了在启动iptabels时,我们的ssh服务断开,从而达到中断网络同步的过程
[root@192-168-166-150 data]# md5sum SELF_APK/18/55/51/515518.apk
d26dcdbf656cf329b8e81ea5af7c7af5 SELF_APK/18/55/51/515518.apk
断开前 我们校验了源文件的MD5码
目的地址开启iptables
[root@192-168-166-145 data]# service iptables start
iptables: Applying firewall rules: [ OK ]
目的同步地址已经不在同步源地址的文件,这个在日志中也能看的到
[root@192-168-166-145 data]# md5sum SELF_APK/18/55/51/515518.apk
md5sum: SELF_APK/18/55/51/515518.apk: No such file or directory
目的地址关闭iptables
[root@192-168-166-145 data]# service iptables stop
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
同步传输继续,完成后效验MD5码
[root@192-168-166-145 data]# md5sum SELF_APK/18/55/51/515518.apk
d26dcdbf656cf329b8e81ea5af7c7af5 SELF_APK/18/55/51/515518.apk
最后我们发现,在网络中断前,我们的文件是不在进行传输同步,当网络恢复正常时,传输继续,效验的MD5也一致。
###################################ssh同步免key##################################
远端被同步的服务器上开启ssh无密码登录,请注意用户身份
在服务器之间使用lsyncdssh模式进行同步的时候,注意要先将服务器之间的id_rsa拷贝至lsyncd服务器上。
TO-DO:
其它同步工具:csync2,clsync,btsync,drdb
参考文献:https://axkibe.github.io/lsyncd/manual/config/layer4/
http://seanlook.com/2015/05/06/lsyncd-synchronize-realtime/