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    = "root@192.168.166.145:/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    = "root@192.168.166.145:/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    = "root@192.168.166.145:/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/