官方文檔: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
}
}