項目有文件實時同步備份的需求,作了一下調查,比較好的解決方法是使用lsyncd工具。這裏主要記錄一下遇到的問題及解決方法。css
lsyncd 的相關介紹和對比可見:linux
lsyncd實時同步搭建指南——取代rsync+inotify
Linux下同步工具inotify+rsync使用詳解
Linux文件系統Inotify機制
lsyncd官方文檔:git
Lsyncd - Live Syncing (Mirror) Daemon
安裝時須要先安裝 lua和cmake,可直接使用apt-get:github
apt-get install lua5.1segmentfault
apt-get install lua5.1-dev服務器
apt-get install cmakessh
接着能夠下載 lsyncd-2.1.6 版本解壓安裝,解壓後進入改目錄:工具
cmake ,post
make優化
make install
便可完成安裝。
若是使用在大型系統上,文件數量多、大,文件變化頻繁,則要修改一些系統參數。
由於lsyncd 有用到 inotify監聽,其中相關的主要是這幾個參數:
#ls -l /proc/sys/fs/inotify/ total 0 -rw-r--r-- 1 root root 0 Oct 9 09:36 max_queued_events -rw-r--r-- 1 root root 0 Oct 9 09:36 max_user_instances -rw-r--r-- 1 root root 0 Oct 9 09:36 max_user_watches
/proc/sys/fs/inotify/max_user_instances 默認值: 128 指定了每個real user ID可建立的inotify instatnces的數量上限
/proc/sys/fs/inotify/max_user_watches 默認值: 8192 指定了每一個inotify instance相關聯的watches的上限
/proc/sys/fs/inotify/max_queued_events 默認值: 16384,Inotify 管理的隊列的最大長度
若是監聽的文件數量大,則增大 max_user_watches(不然可能啓動失敗),若是文件變化頻繁,則增大max_queued_events(不然隊列溢出,致使部分文件未同步或lsyncd重啓) :
一次性方法:
sysctl fs.inotify.max_user_watches=xxxxxx
長久有效:
fs.inotify.max_user_watches=xxxxxx 寫進 /ect/sysctl.conf,而後 sysctl -p 打印查看
(注意:max_queued_events 修改後,須要重啓lsyncd才能生效----2018-6-14 更新說明)
參考:
linux 高效的文件系統事件監控 內核級解析方案 inotify
Lsyncd causes load while monitoring large filesystem.
settings
裏面是全局設置,--
開頭表示註釋,下面是幾個經常使用選項說明:
logfile
定義日誌文件stausFile
定義狀態文件nodaemon=true
表示不啓用守護模式,默認statusInterval
將lsyncd的狀態寫入上面的statusFile的間隔,默認10秒inotifyMode
指定inotify監控的事件,默認是CloseWrite
,還能夠是Modify
或CloseWrite or Modify
maxProcesses
同步進程的最大個數。假如同時有20個文件須要同步,而maxProcesses = 8
,則最大能看到有8個rysnc進程maxDelays
累計到多少所監控的事件激活一次同步,即便後面的delay
延遲時間還未到sync
裏面是定義同步參數,能夠繼續使用maxDelays
來重寫settings的全局變量。通常第一個參數指定lsyncd
以什麼模式運行:rsync
、rsyncssh
、direct
三種模式:
default.rsync
:本地目錄間同步,使用rsync,也能夠達到使用ssh形式的遠程rsync效果,或daemon方式鏈接遠程rsyncd進程;default.direct
:本地目錄間同步,使用cp
、rm
等命令完成差別文件備份;default.rsyncssh
:同步到遠程主機目錄,rsync的ssh模式,須要使用key來認證
source
同步的源目錄,使用絕對路徑。
target
定義目的地址.對應不一樣的模式有幾種寫法:/tmp/dest
:本地目錄同步,可用於direct
和rsync
模式172.29.88.223:/tmp/dest
:同步到遠程服務器目錄,可用於rsync
和rsyncssh
模式,拼接的命令相似於/usr/bin/rsync -ltsd --delete --include-from=- --exclude=* SOURCE TARGET
,剩下的就是rsync的內容了,好比指定username,免密碼同步172.29.88.223::module
:同步到遠程服務器目錄,用於rsync
模式
三種模式的示例會在後面給出。
init
這是一個優化選項,當init = false
,只同步進程啓動之後發生改動事件的文件,原有的目錄即便有差別也不會同步。默認是true
delay
累計事件,等待rsync同步延時時間,默認15秒(最大累計到1000個不可合併的事件)。也就是15s內監控目錄下發生的改動,會累積到一次rsync同步,避免過於頻繁的同步。(可合併的意思是,15s內兩次修改了同一文件,最後只同步最新的文件)excludeFrom
排除選項,後面指定排除的列表文件,如excludeFrom = "/etc/lsyncd.exclude"
,若是是簡單的排除,可使用exclude = LIST
。
這裏的排除規則寫法與原生rsync有點不一樣,更爲簡單:
- 監控路徑裏的任何部分匹配到一個文本,都會被排除,例如
/bin/foo/bar
能夠匹配規則foo
- 若是規則以斜線
/
開頭,則從頭開始要匹配所有- 若是規則以
/
結尾,則要匹配監控路徑的末尾?
匹配任何字符,但不包括/
*
匹配0或多個字符,但不包括/
**
匹配0或多個字符,能夠是/
delete
爲了保持target與souce徹底同步,Lsyncd默認會delete = true
來容許同步刪除。它除了false
,還有startup
、running
值,請參考 Lsyncd 2.1.x ‖ Layer 4 Config ‖ Default Behavior。rsync
(提示一下,delete
和exclude
原本都是rsync的選項,上面是配置在sync中的,我想這樣作的緣由是爲了減小rsync的開銷)
bwlimit
限速,單位kb/s,與rsync相同(這麼重要的選項在文檔里居然沒有標出)compress
壓縮傳輸默認爲true
。在帶寬與cpu負載之間權衡,本地目錄同步能夠考慮把它設爲false
perms
默認保留文件權限。- 其它rsync的選項
其它還有rsyncssh模式獨有的配置項,如
host
、targetdir
、rsync_path
、password_file
,見後文示例。rsyncOps={"-avz","--delete"}
這樣的寫法在2.1.*版本已經不支持。
lsyncd.conf
能夠有多個sync
,各自的source,各自的target,各自的模式,互不影響。
引用:
lsyncd實時同步搭建指南——取代rsync+inotify
更新至 2018-06-06