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

搭建lsyncd實時同步
lsyncd
lsyncd項目也托管在GitHub上面,具體地址是https://github.com/axkibe/lsyncd,一會兒若是要編譯安裝也需要去這個地方。
上文也說過,lsyncd是使用lua語言封裝的,所以初識lsyncd的配置文件時,還是有點不習慣,但是用久應該就還好了。
lsyncd不僅僅是實現兩臺服務器的同步的,它還能夠在一臺服務器內對兩個文件夾進行同步,這里可以是cp,也可以是rsync。兩臺或多臺服務器間可以是rsync,也可以是rsyncssh。本文主要講的是兩臺服務器間的rsync。
lsyncd可以配置inotify檢測到文件變動后多少秒才執行同步,也就是時間延遲。也可以配置文件變動個數達到多少個后立即執行同步,無論有沒有到達前面的時間延遲的要求,這就是累計觸發事件次數。這兩個配置可以減少rsync的同步,避免海量文件同步時rsync的頻繁發送文件對比列表。
lsyncd安裝
lsyncd的安裝方式有兩種,yum安裝和編譯安裝。
yum安裝:
yum安裝也有兩種方式,一個是阿里云的鏡像源,一個是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上下載項目,通過下面的下載就是最新的了:
wget https://github.com/axkibe/lsyncd/archive/master.zip
2、下載了軟件包,先別急著安裝,上文提到了幾次,lsyncd是用lua語言封裝的,所以還需要安裝lua環境。另外lsyncd不是使用的make,而是cmake,所以也需要安裝cmake。
yum install -y lua lua-devel asciidoc cmake
3、下載了軟件包,裝好了環境依賴,下面就是編譯安裝:
unzip lsyncd-master.zip cd lsyncd-master cmake -DCMAKE_INSTALL_PREFIX=/usr/local/lsyncd make && make install
安裝好了的lsyncd在/usr/local/lsyncd下。配置文件、日志文件夾等需要我們自己定義與創建。
4、配置文件。先森的配置文件是用于兩臺服務器間實時同步的,使用的是rsync模式。
lsyncd的配置文件其實有點類似nginx,如nginx的server可以多定義互不沖突一樣,lsyncd也可以多個定義。
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",
--定義狀態文件
statusFile ="/usr/local/lsyncd/logs/lsyncd.status",
--指定inotify監控的事件,默認是CloseWrite,還可以是Modify或CloseWrite or Modify
--這個就是使用的inotify能監控的事件
inotifyMode = "CloseWrite or Modify",
--同步進程的最大個數。假如同時有20個文件需要同步,而maxProcesses = 8,則最大能看到有8個rysnc進程
maxProcesses = 15,
--(這個配置先森沒有使用)累計到多少所監控的事件激活一次同步,即使后面的delay延遲時間還未到。
--maxDelays=10,
}
sync {
--使用rsync通過daemon方式連接遠程rsyncd進程;
default.rsync,
--同步的源目錄,使用絕對路徑。
source = "/web/data/ftp",
--定義目的地址,對應不同的模式有不同的寫法。這里是遠程rsync,使用“用戶名@ip::模塊名”寫法。
target = "user@172.17.8.16::datahome",
--是否同步刪除,除了running選項,還有true、false和startup,這個配置先森不是很明白,大概是true是完全同步刪除,false是不允許刪除,startup和running要難理解一些\
--先森的理解是,startup是僅在啟動時將源目錄和目的目錄來一次完全同步,lsyncd運行時的源目錄的刪除文件在目的目錄中不做刪除操作\
--running是啟動時不對源、目的目錄進行完全同步,lsyncd運行時源目錄刪除的文件,目的目錄也會被刪除。
delete="running",
--排除的文件,這里排除了一些隱藏文件,和文件打開是時的臨時文件
exclude = { ".*", ".tmp","*.swp","*.swx" },
-- 累計事件,等待rsync同步延時時間,默認15秒。先森配置的是0,也就是實時同步。
delay = 0,
rsync = {
--本地rsync命令路徑
binary = "/usr/bin/rsync",
archive = true,
compress = true,
verbose = true,
--遠程rsyncd的密碼
password_file = "/etc/rsyncd/rsync.passwd",
}
}
5、啟動lsyncd
/usr/local/lsyncd/bin/lsyncd -log Exec /usr/local/lsyncd/lsyncd.conf
也可以自己創建一個啟動腳本,腳本內容如下,是先森從yum安裝的lsyncd拷貝的,一樣的可以使用。
只是用之前,需要對lsyncd守護命令與配置文件先做個軟連接,免得需要修改啟動腳本:
ln -s /usr/local/lsyncd/bin/lsyncd /usr/bin/lsyncd ln -s /usr/local/lsyncd/lsyncd.conf /etc/lsyncd.conf
啟動腳本:
#!/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
優化
因為lsyncd其實也是用到了inotify,所以和inotify+rsync方案一樣,我們還是需要對服務器的inotify內核配置進行優化。
inotify檢查磁盤變動是有隊列等值的配置的,inotify默認內核參數值太小,會導致實際檢測的時候報錯。
查看系統默認參數值
sysctl -a | grep max_queued_events sysctl -a | grep max_user_watches sysctl -a | grep max_user_instances
臨時修改
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/
轉載請注明出處來自http://www.cnidcc.cn/lsyncd.html

川公網安備 51011202000104號
希望能學有所成。
我有兩個服務器A和B,上面都啟動了lsync和rsync,現在發現一個問題。
我1點啟動同步任務,進程OK文件都是正常同步的,但是在2點的時候同步進程死掉,這期間文件發生了變化(文件夾里多了好多的新文件)。然后我3點的時候重啟了同步任務,此時在A或者B上文件變化都會同步,但是2~3點進程死掉之間的文件變化,卻遲遲不見同步,請問怎么辦?
前不久我也剛搞完這個