實(shí)時(shí)同步服務(wù)-用軟件實(shí)現(xiàn)(lsyncd)

官方文檔:https://lsyncd.github.io/lsyncd/manual/config/file/
參考文檔:https://www.cnblogs.com/lvzhenjiang/p/14198841.html

幾大實(shí)時(shí)同步工具比較

1.1 inotify + rsync

最近一直在尋求生產(chǎn)服務(wù)服務(wù)器上的同步替代方案,原先使用的是inotify + rsync,但隨著文件數(shù)量的增大到100W+,目錄下的文件列表就達(dá)20M,在網(wǎng)絡(luò)狀況不佳或者限速的情況下,變更的文件可能10來(lái)個(gè)才幾M,卻因此要發(fā)送的文件列表就達(dá)20M,嚴(yán)重減低的帶寬的使用效率以及同步效率;更為要緊的是,加入inotifywait在5s內(nèi)監(jiān)控到10個(gè)小文件發(fā)生變化,便會(huì)觸發(fā)10個(gè)rsync同步操作,結(jié)果就是真正需要傳輸?shù)牟?-3M的文件,比對(duì)的文件列表就達(dá)200M。使用這兩個(gè)組合的好處在于,它們都是最基本的軟件,可以通過不同選項(xiàng)做到很精確的控制,比如排除同步的目錄,同步多個(gè)模塊或同步到多個(gè)主機(jī)。

1.2 sersync

后來(lái)聽同事說(shuō) sersync 這么個(gè)工具可以提高同步的性能,也解決了同步大文件時(shí)出現(xiàn)異常的問題,所以就嘗試了一下。sersync是國(guó)內(nèi)的一個(gè)開發(fā)者開源出來(lái)的,使用c++編寫,采用多線程的方式進(jìn)行同步,失敗后還有重傳機(jī)制,對(duì)臨時(shí)文件過濾,自帶crontab定時(shí)同步功能。網(wǎng)上看到有人說(shuō)性能還不錯(cuò),說(shuō)一下我的觀點(diǎn):

  • 國(guó)產(chǎn)開源,文檔不是很全,在2011年之后就沒更新了(googlecode都要快關(guān)閉了,其實(shí)可以轉(zhuǎn)交其他人維護(hù)),網(wǎng)上關(guān)于它的使用和討論都止于10年了
  • 采用xml配置文件的方式,可讀性比較好,但是有些原生的有些功能沒有實(shí)現(xiàn)就沒法使用了
  • 無(wú)法實(shí)現(xiàn)多目錄同步,只能通過多個(gè)配置文件啟動(dòng)多個(gè)進(jìn)程
  • 文件排除功能太弱。這個(gè)要看需求,不是每個(gè)人都需要排除子目錄。而對(duì)于我的環(huán)境中,這個(gè)功能很重要,而且排除的規(guī)則較多
  • 雖然提供插件的功能,但很雞肋,因?yàn)檐浖旧頉]有持續(xù)更新,也沒有看到貢獻(xiàn)有其它插件出現(xiàn)(可能是我知識(shí)面不夠,還用不到里面的refreshCDN plugin)。

雖然不懂c++,但大致看了下源碼 FileSynchronize,拼接rsync命令大概在273行左右,最后一個(gè)函數(shù)就是排除選項(xiàng),簡(jiǎn)單一點(diǎn)可以將--exclude=改成--eclude-from來(lái)靈活控制。有機(jī)會(huì)再改吧。

另外,在作者的文章 Sersync服務(wù)器同步程序 項(xiàng)目簡(jiǎn)介與設(shè)計(jì)框架 評(píng)論中,說(shuō)能解決上面 rsync + inotify中所描述的問題。閱讀了下源碼,這個(gè)應(yīng)該是沒有解決,因?yàn)樵谄唇觬sync命令時(shí),后面的目的地址始終是針對(duì)module的,只要執(zhí)行rsync命令,就會(huì)對(duì)整個(gè)目錄進(jìn)行遍歷,發(fā)送要比對(duì)的文件列表,然后再發(fā)送變化的文件。sersync只是減少了監(jiān)聽的事件,減少了rsync的次數(shù)——這已經(jīng)是很大的改進(jìn),但每次rsync沒辦法改變。(如有其它看法可與我討論)

其實(shí)我們也不能要求每一個(gè)軟件功能都十分健全,關(guān)鍵是看能否滿足我們當(dāng)下的特定的需求。所謂好的架構(gòu)不是設(shè)計(jì)出來(lái)的,而是進(jìn)化來(lái)的。目前使用sersync2沒什么問題,而且看了它的設(shè)計(jì)思路應(yīng)該是比較科學(xué)的,特別是過濾隊(duì)列的設(shè)計(jì)。雙向同步看起來(lái)也是可以實(shí)現(xiàn)。

1.3 lsyncd

廢話說(shuō)這么多,本文就是介紹它了。有些博客說(shuō)lsyncd是谷歌開源的,實(shí)際不是了,只是托管在了googlecode上而已,幸運(yùn)的是已經(jīng)遷移到github了:https://github.com/axkibe/lsyncd 。

Lysncd 實(shí)際上是lua語(yǔ)言封裝了 inotify 和 rsync 工具,采用了 Linux 內(nèi)核(2.6.13 及以后)里的 inotify 觸發(fā)機(jī)制,然后通過rsync去差異同步,達(dá)到實(shí)時(shí)的效果。我認(rèn)為它最令人稱道的特性是,完美解決了 inotify + rsync海量文件同步帶來(lái)的文件頻繁發(fā)送文件列表的問題 —— 通過時(shí)間延遲或累計(jì)觸發(fā)事件次數(shù)實(shí)現(xiàn)。另外,它的配置方式很簡(jiǎn)單,lua本身就是一種配置語(yǔ)言,可讀性非常強(qiáng)。lsyncd也有多種工作模式可以選擇,本地目錄cp,本地目錄rsync,遠(yuǎn)程目錄rsyncssh。

1.軟件安裝
# 因?yàn)檫@個(gè)rpm包在epel源中,所以需要先安裝epel源 
 yum install epel-release -y    
 yum install lsyncd -y
要確保有rsync
2.修改配置文件
vim /etc/lsyncd.conf
settings {
        logfile ="/var/log/lsyncd/lsyncd.log",         #定義日志文件           
        statusFile ="/var/log/lsyncd/lsyncd.status",       #//定義狀態(tài)文件 
        inotifyMode = "CloseWrite",                   #指定inotify監(jiān)控的事件,還可以是Modify或CloseWrite or Modify。       
        maxProcesses = 7,                               #最大進(jìn)程數(shù)
        -- nodaemon =true,       
        maxDelays = 10,                                   #累計(jì)到多少所監(jiān)控的事件激活一次同步,即使后面的delay延遲時(shí)間還未到。
         nodaemon = true,                                 #默認(rèn)不啟用守護(hù)模式
         statusInterval = 10,                             #將lsyncd的狀態(tài)寫入上面的statusFile的間隔,默認(rèn)10秒。                 
       }
1.#本地目錄同步directcp/rm/mv 適用500+萬(wàn)文件變動(dòng)不大
sync {
     default.direct,
     source = "/tmp/src",
     target = "/tmp/dest",
     delay = 1
     maxProcesses = 1
     }
#啟動(dòng)就能實(shí)現(xiàn)本地/data目錄下的文件同步至本地/tmp目錄中(無(wú)差異同步,時(shí)間由全局配置中 maxDelays決定)
2.#本地目錄同步rsync模式rsync
sync {        #里面是定義同步參數(shù),一般第一個(gè)參數(shù)指定lsyncd以什么模式運(yùn)行,有rsync、rsyncssh、direct三種模式。
      default.rsync,      #目錄間同步,使用rsync命令。也可以達(dá)到使用ssh形式的遠(yuǎn)程rsync效果,或daemon方式連接遠(yuǎn)程rsyncd進(jìn)程。
      source = "/data",    #同步的源目錄,即監(jiān)控的目錄。
      target = "/tmp",    #//同步的目標(biāo)目錄,可用于rsync和rsyncssh模式。
      excludeFrom = "/root/2.txt",   #排除這個(gè)文件中包含的文件
      rsync = {
             binary = "/usr/bin/rsync",      #rsync命令的絕對(duì)路徑。
             archive = true,      #遞歸,即同步子目錄的內(nèi)容
             compress = true,    #傳輸過程中壓縮文件數(shù)據(jù),相對(duì)其他壓縮工具而言,它可以獲得更好的壓縮率,但是需要消耗CPU資源。
             verbose = true    #增加在傳輸過程中獲得的信息量,提供有關(guān)正在傳輸文件的信息
      }
}

3.#遠(yuǎn)程目錄同步rsync模式 + rsyncd daemon
sync {
     default.rsync,
     source = "/data",
     target = "rsync_backup@172.16.1.41::oldben",
     delete= startup,        #startup: 在啟動(dòng)時(shí)刪除目標(biāo)上的文件,正常運(yùn)行時(shí)不做刪除。
                                      #false:  啟動(dòng)時(shí)不會(huì)刪除目標(biāo)上的任何文件。不啟動(dòng)也不正常運(yùn)行。(但也可以覆蓋)
                                      #running: Lsyncd啟動(dòng)時(shí)不會(huì)刪除目標(biāo)上的文件,但會(huì)刪除在正常操作期間刪除的文件。
                                      #true: 默認(rèn)是true,Lsyncd將在目標(biāo)上刪除源中沒有的任何內(nèi)容。啟動(dòng)時(shí)以及正常操作期間刪除的內(nèi)容。
     exclude = { ".tmp" },
     delay = 2,
     init = false,
     rsync = {
             binary = "/usr/bin/rsync",
             archive = true,
             compress = true,
             verbose = true,
             password_file = "/etc/rsync.passwd",
             _extra = {"--bwlimit=200"}
             }
     }

4.#遠(yuǎn)程目錄同步rsync模式 + ssh shell
sync {
     default.rsync,
     source = "/tmp/src",
     target = "10.4.7.10:/tmp/dest",
     # target = "root@10.4.7.10:/remote/dest",
     # 上面target注意如果是普通用戶必須擁有寫權(quán)限
     maxDelays = 5,
     delay = 30,
     # init = true,
     rsync = {
             binary = "/usr/bin/rsync",
             archive = true,
             compress = true,
             bwlimit = 2000
             # rsh = "/usr/bin/ssh -p 22 -o StrictHostKeyChecking=no"
             # 如果要指定其它端口請(qǐng)用上面的rsh
     }
}

5.#遠(yuǎn)程目錄同步rsync模式 + rsyncssh效果與上面相同
sync {
     default.rsyncssh,
     source = "/tmp/src2",
     host = "10.4.7.10",
     targetdir = "/remote/dir",
     excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst",
     # maxDelays = 5,
     delay = 0,
     # init = false,
     rsync = {
             binary = "/usr/bin/rsync",
             archive = true,
             compress = true,
             verbose = true,
             _extra = {"--bwlimit=2000"},
     },
     ssh = {
            port = 1234
     }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容