lsyncd實時同步工具

首先介紹一下架構


wKioL1jQ5ICSCWaOAAAlowMvmGY733.png-wh_50

有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種方法可以安裝

  1. yum安裝,前提是安裝了epel更新源。使用命令:yum install -y lsyncd

  2. 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章