前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >lsyncd实时同步工具

lsyncd实时同步工具

作者头像
py3study
发布2018-08-02 15:03:12
1.8K0
发布2018-08-02 15:03:12
举报
文章被收录于专栏:python3python3python3

首先介绍一下架构

blob.png
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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-04-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档