首页 > 代码库 > lsyncd实时同步工具

lsyncd实时同步工具

首先介绍一下架构


技术分享

有3台app服务器,每次上线,是通过shell脚本将代码传输至app_1

然后app_1自动同步到app_2和app_3


最开始的同步策略是rsync+inotify

用了一段时间,发现有时会出现app_2和app_3没有同步代码的问题。

发现是因为inotify的shell脚本,意外终止了。


后来发现有unison,测试发现,还是要写shell脚本

再后来sersync,这个是基于rsync的,需要有rsync客户端和服务端,比较麻烦

配置文件是xml。


最后用的是lsyncd

Lysncd 实际上是lua语言封装了 inotify 和 rsync 工具,采用了 Linux 内核(2.6.13 及以后)里的 inotify 触发机制,然后通过rsync去差异同步,达到实时的效果。

完美解决了 inotify + rsync海量文件同步带来的文件频繁发送文件列表的问题 —— 通过时间延迟或累计触发事件次数实现。



有2种方法可以安装

  1. yum安装,前提是安装了epel更新源。使用命令:yum install -y lsyncd

  2. github下载,地址为:https://github.com/axkibe/lsyncd


我用的是github方式,因为版本是比yum要新一点


安装lua软件包

yum install -y lua lua-devel

解压下载的压缩包

unzip lsyncd-master.zip -d /usr/src/

进入目录

cd /usr/src/lsyncd-master/

使用cmake编译,如果没有安装cmake,可以yum安装一下

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/lsyncd

make && make install

进入安装目录

cd /usr/local/lsyncd/

创建配置文件目录和日志目录

mkdir etc var

进入配置文件目录

cd etc/

编译配置文件

vim lsyncd.conf

内容如下:


settings {

 --pid文件

 logfile = "/usr/local/lsyncd/var/lsyncd.log",

 --状态文件

 statusFile = "/usr/local/lsyncd/var/lsyncd.status",

 --同步模式,意思就是有更新就同步

 inotifyMode = "CloseWrite or Modify",

 --最大8个进程

    maxProcesses = 8,

}

--需要同步服务器的IP地址池

servers = {

"192.168.74.128",

"192.168.74.129",

}

--使用for循环遍历IP池

for _, server in ipairs(servers) do 

sync {

 --本地目录间同步,使用rsync

 default.rsync,

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

 source = "/www/kuaidihelp_dts",

 --定义目的地址,注意:冒号后面是绝对路径

 target = server..":/www/kuaidihelp_dts",

 --累计事件,等待rsync同步延时时间。这里设置0秒,表示实时同步。

 delay = 0,

 rsync ={

 --rsync命令的绝对路径

  binary ="/usr/bin/rsync",

  archive =true,

  compress =true,

  verbose = true,

  --使用ssh协议连接到目标服务器,如果端口不是22,请修改一下。

  rsh = "/usr/bin/ssh -p 22 -o StrictHostKeyChecking=no"

 },

}

end


--因为有一台服务器,是供下载代码的。路径跟for循环里面的不一样,所以单独列出来。

sync {

 default.rsync,

 source = "/www/kuaidihelp_dts",

 --定义目的地址,这里和上面的不一样。因为IP就一个,所以就直接写了。

 target = "192.168.74.130:/data/kuaidihelp_dts",

 delay = 0,

 rsync ={

  binary ="/usr/bin/rsync",

  archive =true,

  compress =true,

  verbose = true,

  rsh = "/usr/bin/ssh -p 22 -o StrictHostKeyChecking=no"

 },

}


启动服务

/usr/local/lsyncd/bin/lsyncd /usr/local/lsyncd/etc/lsyncd.conf


查看进程是否存在

ps -aux | grep lsyncd

如果不存在进程,请查看/usr/local/lsyncd/var/lsyncd.log

如果正常的话,请测试配置文件里面出现的每一个IP

用ssh连接,是否成功。注意,是不需要输入密码的!!!


编译启动脚本

vim /etc/init.d/lsyncd


#!/bin/bash

#

# chkconfig: - 85 15

# description: Lightweight inotify based sync daemon

#

# processname:  lsyncd

# config:       /usr/local/lsyncd/etc/lsyncd.conf

# config:       /etc/sysconfig/lsyncd

# pidfile:      /var/run/lsyncd.pid


# Source function library

. /etc/init.d/functions


# Source networking configuration.

. /etc/sysconfig/network


# Check that networking is up.

[ "$NETWORKING" = "no" ] && exit 0


LSYNCD_OPTIONS="-pidfile /var/run/lsyncd.pid /usr/local/lsyncd/etc/lsyncd.conf"


if [ -e /etc/sysconfig/lsyncd ]; then

  . /etc/sysconfig/lsyncd

fi


RETVAL=0


prog="lsyncd"

thelock=/var/lock/subsys/lsyncd


start() {

[ -f /usr/local/lsyncd/etc/lsyncd.conf ] || exit 6

        echo -n $"Starting $prog: "

        if [ $UID -ne 0 ]; then

                RETVAL=1

                failure

        else

                daemon ${LSYNCD_USER:+--user ${LSYNCD_USER}} /usr/local/lsyncd/bin/lsyncd $LSYNCD_OPTIONS

                RETVAL=$?

                [ $RETVAL -eq 0 ] && touch $thelock

        fi;

        echo

        return $RETVAL

}


stop() {

        echo -n $"Stopping $prog: "

        if [ $UID -ne 0 ]; then

                RETVAL=1

                failure

        else

                killproc lsyncd

                RETVAL=$?

                [ $RETVAL -eq 0 ] && rm -f $thelock

        fi;

        echo

        return $RETVAL

}


reload(){

        echo -n $"Reloading $prog: "

        killproc lsyncd -HUP

        RETVAL=$?

        echo

        return $RETVAL

}


restart(){

        stop

        start

}


condrestart(){

    [ -e $thelock ] && restart

    return 0

}


case "$1" in

  start)

        start

        ;;

  stop)

        stop

        ;;

  restart)

        restart

        ;;

  reload)

        reload

        ;;

  condrestart)

        condrestart

        ;;

  status)

        status lsyncd

        RETVAL=$?

        ;;

  *)

        echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}"

        RETVAL=1

esac


exit $RETVAL


设置权限

chmod 755 /etc/init.d/lsyncd

添加到开机自启动文件中

echo "/etc/init.d/lsyncd start" >> /etc/rc.local


测试编辑app_1的文件,在其他服务器查看文件是否有更新。


文章参考:

https://linux.cn/article-5849-1.html

本文出自 “陨落星空” 博客,请务必保留此出处http://xiao987334176.blog.51cto.com/2202382/1908920

lsyncd实时同步工具