lsyncd实时同步工具

首先介绍一下架构
在这里插入图片描述

有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登录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值