首先介绍一下架构
有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登录