首先介紹一下架構html
有3臺app服務器,每次上線,是經過shell腳本將代碼傳輸至app_1linux
而後app_1自動同步到app_2和app_3git
代碼路徑爲/wwwgithub
有一臺code服務器,專門用來下載全部服務器代碼的。shell
路徑爲/datavim
最開始的同步策略是rsync+inotifybash
用了一段時間,發現有時會出現app_2和app_3沒有同步代碼的問題。服務器
發現是由於inotify的shell腳本,意外終止了。架構
後來發現有unison,測試發現,仍是要寫shell腳本app
再後來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的文件,在其餘服務器查看文件是否有更新。
備註:
若是隻是一對一的同步
配置文件能夠簡化一點
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/kuaidihelp_dts",
--定義目的地址
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"
},
}
文章參考:
https://linux.cn/article-5849-1.html