lsyncd实时同步工具

发布时间:2018-04-09 22:33:15编辑:admin阅读(4062)

    首先介绍一下架构

    blob.png


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

    然后app_1自动同步到app_2和app_3

    代码路径为/www


    有一台code服务器,专门用来下载所有服务器代码的。

    路径为/data


    最开始的同步策略是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种方法可以安装

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

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


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

    软件部署:

    app_1,app_2,app_3必须要安装rsync

    必须要有/usr/bin/rsync文件

    这3台服务器,必须要拥有/usr/bin/rsync文件

    这3台服务器,必须要拥有/usr/bin/rsync文件

    这3台服务器,必须要拥有/usr/bin/rsync文件

    重要的事情说三遍!


    app_1必须能无密码登录app_2和app_3

    ssh秘钥认证,请自行百度。

    app_1只需要安装lsyncd就可以了

    3台rsync配置文件,不需要创建,不需要修改


    安装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/dts",

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

     target = server..":/www/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/dts",

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

     target = "192.168.74.130:/data/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连接,是否成功。注意,是不需要输入密码的!!!

    ssh -p 端口 root@ip地址


    编译启动脚本

    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的文件,在其他服务器查看文件是否有更新。

    cd /www/dts

    touch 1.txt


    备注:

    如果只是一对一的同步

    配置文件可以简化一点

    settings {

     --pid文件

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

     --状态文件

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

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

     inotifyMode = "CloseWrite or Modify",

     --最大8个进程

        maxProcesses = 8,

    }


    sync {

     default.rsync,

     source = "/www/dts",

     --定义目的地址

     target = "192.168.74.130:/data/dts",

     delay = 0,

     rsync ={

      binary ="/usr/bin/rsync",

      archive =true,

      compress =true,

      verbose = true,

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

     },

    }


    如果遇到不同步的情况:

    1.检查几台服务器是否存在文件/usr/bin/rsync

    2.检查source和target文件目录是否存在

    3.检查iptables和selinux是否关闭

    4.检查几台服务器之间是否做了秘钥认证,能够无密码ssh登录


    文章参考:

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


关键字