首先介绍一下架构
有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种方法可以安装
- yum安装,前提是安装了epel更新源。使用命令:yum install -y lsyncd
- 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