CentOS搭建lsyncd實(shí)時(shí)同步——取代rsync+inotify
編輯:狂族晨曦 來(lái)源:系統(tǒng)運(yùn)維,經(jīng)驗(yàn)雜筆 日期:2018-02-08 閱讀: 8,200 次 3 條評(píng)論 » 百度已收錄
昨天先森發(fā)布了“CentOS下inotify+rsync實(shí)現(xiàn)文件實(shí)時(shí)同步”,inotify+rsync實(shí)時(shí)同步的方案是用shell在后臺(tái)常駐來(lái)實(shí)現(xiàn)實(shí)時(shí)同步,沒有守護(hù)進(jìn)程,感覺不是很靠譜,如果腳本突然掛了,實(shí)時(shí)同步豈不是GG了?所以先森在實(shí)現(xiàn)了inotify+rsync后還是再找其他的解決方案。
其實(shí)在找到lsyncd之前,先森先找到了sersync這個(gè)工具,但是好像這個(gè)工具很久沒有更新了,所以雖然也有較多好評(píng),但是先森目前還是先研究lsyncd了。
當(dāng)然,無(wú)論是sersync還是lsyncd,其實(shí)都是對(duì)inotify這個(gè)內(nèi)核中的文件事件監(jiān)控系統(tǒng)進(jìn)行了封裝,類似inotify-tools,給我們提供的是封裝好了的inotify+rsync工具。sersync是用C寫的,lsyncd是使用lua語(yǔ)言封裝的。

搭建lsyncd實(shí)時(shí)同步
lsyncd
lsyncd項(xiàng)目也托管在GitHub上面,具體地址是https://github.com/axkibe/lsyncd,一會(huì)兒若是要編譯安裝也需要去這個(gè)地方。
上文也說過,lsyncd是使用lua語(yǔ)言封裝的,所以初識(shí)lsyncd的配置文件時(shí),還是有點(diǎn)不習(xí)慣,但是用久應(yīng)該就還好了。
lsyncd不僅僅是實(shí)現(xiàn)兩臺(tái)服務(wù)器的同步的,它還能夠在一臺(tái)服務(wù)器內(nèi)對(duì)兩個(gè)文件夾進(jìn)行同步,這里可以是cp,也可以是rsync。兩臺(tái)或多臺(tái)服務(wù)器間可以是rsync,也可以是rsyncssh。本文主要講的是兩臺(tái)服務(wù)器間的rsync。
lsyncd可以配置inotify檢測(cè)到文件變動(dòng)后多少秒才執(zhí)行同步,也就是時(shí)間延遲。也可以配置文件變動(dòng)個(gè)數(shù)達(dá)到多少個(gè)后立即執(zhí)行同步,無(wú)論有沒有到達(dá)前面的時(shí)間延遲的要求,這就是累計(jì)觸發(fā)事件次數(shù)。這兩個(gè)配置可以減少rsync的同步,避免海量文件同步時(shí)rsync的頻繁發(fā)送文件對(duì)比列表。
lsyncd安裝
lsyncd的安裝方式有兩種,yum安裝和編譯安裝。
yum安裝:
yum安裝也有兩種方式,一個(gè)是阿里云的鏡像源,一個(gè)是fedoraproject的鏡像源。
阿里云:
#CentOS 7 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo #CentOS 6 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo #yum 安裝 yum install lsyncd -y
fedoraproject:
#只找到CentOS 6的 rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm yum install lsyncd -y
編譯安裝:
1、首先還是去上文提到的GitHub上下載項(xiàng)目,通過下面的下載就是最新的了:
wget https://github.com/axkibe/lsyncd/archive/master.zip
2、下載了軟件包,先別急著安裝,上文提到了幾次,lsyncd是用lua語(yǔ)言封裝的,所以還需要安裝lua環(huán)境。另外lsyncd不是使用的make,而是cmake,所以也需要安裝cmake。
yum install -y lua lua-devel asciidoc cmake
3、下載了軟件包,裝好了環(huán)境依賴,下面就是編譯安裝:
unzip lsyncd-master.zip cd lsyncd-master cmake -DCMAKE_INSTALL_PREFIX=/usr/local/lsyncd make && make install
安裝好了的lsyncd在/usr/local/lsyncd下。配置文件、日志文件夾等需要我們自己定義與創(chuàng)建。
4、配置文件。先森的配置文件是用于兩臺(tái)服務(wù)器間實(shí)時(shí)同步的,使用的是rsync模式。
lsyncd的配置文件其實(shí)有點(diǎn)類似nginx,如nginx的server可以多定義互不沖突一樣,lsyncd也可以多個(gè)定義。
settings {
logfile ="/usr/local/lsyncd/logs/lsyncd.log",
statusFile ="/usr/local/lsyncd/logs/lsyncd.status",
inotifyMode = "CloseWrite or Modify",
maxProcesses = 15,
}
sync {
default.rsync,
source = "/web/data/ftp",
target = "user@172.17.8.16::datahome",
delete="running",
exclude = { ".*", ".tmp","*.swp","*.swx" },
delay = 0,
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
verbose = true,
password_file = "/etc/rsyncd/rsync.passwd",
}
}
注釋版:
settings {
--定義日志文件
logfile ="/usr/local/lsyncd/logs/lsyncd.log",
--定義狀態(tài)文件
statusFile ="/usr/local/lsyncd/logs/lsyncd.status",
--指定inotify監(jiān)控的事件,默認(rèn)是CloseWrite,還可以是Modify或CloseWrite or Modify
--這個(gè)就是使用的inotify能監(jiān)控的事件
inotifyMode = "CloseWrite or Modify",
--同步進(jìn)程的最大個(gè)數(shù)。假如同時(shí)有20個(gè)文件需要同步,而maxProcesses = 8,則最大能看到有8個(gè)rysnc進(jìn)程
maxProcesses = 15,
--(這個(gè)配置先森沒有使用)累計(jì)到多少所監(jiān)控的事件激活一次同步,即使后面的delay延遲時(shí)間還未到。
--maxDelays=10,
}
sync {
--使用rsync通過daemon方式連接遠(yuǎn)程rsyncd進(jìn)程;
default.rsync,
--同步的源目錄,使用絕對(duì)路徑。
source = "/web/data/ftp",
--定義目的地址,對(duì)應(yīng)不同的模式有不同的寫法。這里是遠(yuǎn)程rsync,使用“用戶名@ip::模塊名”寫法。
target = "user@172.17.8.16::datahome",
--是否同步刪除,除了running選項(xiàng),還有true、false和startup,這個(gè)配置先森不是很明白,大概是true是完全同步刪除,false是不允許刪除,startup和running要難理解一些\
--先森的理解是,startup是僅在啟動(dòng)時(shí)將源目錄和目的目錄來(lái)一次完全同步,lsyncd運(yùn)行時(shí)的源目錄的刪除文件在目的目錄中不做刪除操作\
--running是啟動(dòng)時(shí)不對(duì)源、目的目錄進(jìn)行完全同步,lsyncd運(yùn)行時(shí)源目錄刪除的文件,目的目錄也會(huì)被刪除。
delete="running",
--排除的文件,這里排除了一些隱藏文件,和文件打開是時(shí)的臨時(shí)文件
exclude = { ".*", ".tmp","*.swp","*.swx" },
-- 累計(jì)事件,等待rsync同步延時(shí)時(shí)間,默認(rèn)15秒。先森配置的是0,也就是實(shí)時(shí)同步。
delay = 0,
rsync = {
--本地rsync命令路徑
binary = "/usr/bin/rsync",
archive = true,
compress = true,
verbose = true,
--遠(yuǎn)程rsyncd的密碼
password_file = "/etc/rsyncd/rsync.passwd",
}
}
5、啟動(dòng)lsyncd
/usr/local/lsyncd/bin/lsyncd -log Exec /usr/local/lsyncd/lsyncd.conf
也可以自己創(chuàng)建一個(gè)啟動(dòng)腳本,腳本內(nèi)容如下,是先森從yum安裝的lsyncd拷貝的,一樣的可以使用。
只是用之前,需要對(duì)lsyncd守護(hù)命令與配置文件先做個(gè)軟連接,免得需要修改啟動(dòng)腳本:
ln -s /usr/local/lsyncd/bin/lsyncd /usr/bin/lsyncd ln -s /usr/local/lsyncd/lsyncd.conf /etc/lsyncd.conf
啟動(dòng)腳本:
#!/bin/bash
#
# chkconfig: - 85 15
# description: Lightweight inotify based sync daemon
#
# processname: lsyncd
# config: /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 /etc/lsyncd.conf"
if [ -e /etc/sysconfig/lsyncd ]; then
. /etc/sysconfig/lsyncd
fi
RETVAL=0
prog="lsyncd"
thelock=/var/lock/subsys/lsyncd
start() {
[ -f /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/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
優(yōu)化
因?yàn)閘syncd其實(shí)也是用到了inotify,所以和inotify+rsync方案一樣,我們還是需要對(duì)服務(wù)器的inotify內(nèi)核配置進(jìn)行優(yōu)化。
inotify檢查磁盤變動(dòng)是有隊(duì)列等值的配置的,inotify默認(rèn)內(nèi)核參數(shù)值太小,會(huì)導(dǎo)致實(shí)際檢測(cè)的時(shí)候報(bào)錯(cuò)。
查看系統(tǒng)默認(rèn)參數(shù)值
sysctl -a | grep max_queued_events sysctl -a | grep max_user_watches sysctl -a | grep max_user_instances
臨時(shí)修改
sysctl -w fs.inotify.max_queued_events="99999999" sysctl -w fs.inotify.max_user_watches="99999999" sysctl -w fs.inotify.max_user_instances="65535"
固定修改:vim /etc/sysctl.conf #添加以下代碼
fs.inotify.max_queued_events=99999999 fs.inotify.max_user_watches=99999999 fs.inotify.max_user_instances=65535
其他
官方配置文件wiki:
https://axkibe.github.io/lsyncd/manual/config/file/
轉(zhuǎn)載請(qǐng)注明出處來(lái)自http://www.cnidcc.cn/lsyncd.html

川公網(wǎng)安備 51011202000104號(hào)
希望能學(xué)有所成。
我有兩個(gè)服務(wù)器A和B,上面都啟動(dòng)了lsync和rsync,現(xiàn)在發(fā)現(xiàn)一個(gè)問題。
我1點(diǎn)啟動(dòng)同步任務(wù),進(jìn)程OK文件都是正常同步的,但是在2點(diǎn)的時(shí)候同步進(jìn)程死掉,這期間文件發(fā)生了變化(文件夾里多了好多的新文件)。然后我3點(diǎn)的時(shí)候重啟了同步任務(wù),此時(shí)在A或者B上文件變化都會(huì)同步,但是2~3點(diǎn)進(jìn)程死掉之間的文件變化,卻遲遲不見同步,請(qǐng)問怎么辦?
前不久我也剛搞完這個(gè)