文章來源:王琦的個人博客-數據同步之rsync | 第3篇:lsyncd ,互聯網打雜,喜歡多語言編程,記錄一些知識碎片,分享一些心得。
使用lsyncd進行數據的實時同步。
之前項目用sersync,用起來也很方便,xml的可讀性比較好,但是文件排除功能弱了點,再加上好多年不更新了,所以就就把實時同步換成lsyncd。
配置文件
settings {
logfile ="/var/log/lsyncd.log",
statusFile ="/tmp/lsyncd.state",
inotifyMode = "CloseWrite",
maxProcesses = 7,
-- nodaemon =true,
}
sync {
default.rsync,
source = "/tmp/src",
target = "/tmp/dest",
-- excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst",
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
verbose = true
}
配置參數說明
settings 全局配置 --表示註釋
logfile
定義日誌文件stausFile
定義狀態文件nodaemon=true
表示不啓用守護模式,默認statusInterval
將lsyncd的狀態寫入上面的statusFile的間隔,默認10秒inotifyMode
指定inotify監控的事件,默認是CloseWrite,還可以是Modify或CloseWrite or ModifymaxProcesses
同步進程的最大個數。假如同時有20個文件需要同步,而maxProcesses = 8,則最大能看到有8個rysnc進程maxDelays
累計到多少所監控的事件激活一次同步,即使後面的delay延遲時間還未到
sync 定義同步參數
-
default.rsync
:本地目錄間同步,使用rsync,也可以達到使用ssh形式的遠程rsync效果,或daemon方式連接遠程rsyncd進程;
default.direct
:本地目錄間同步,使用cp、rm等命令完成差異文件備份;
default.rsyncssh
:同步到遠程主機目錄,rsync的ssh模式,需要使用key來認證; -
source
同步的源目錄,使用絕對路徑。 -
target
定義目的地址.有幾種不同模式的寫法- /tmp/dest :本地目錄同步,可用於direct和rsync模式
- 172.16.1.100:/tmp/dest :同步到遠程服務器目錄,可用於rsync和rsyncssh模式
- 172.16.1.100::module :同步到遠程服務器目錄,用於rsync模式
-
init
優化選項,當init = false,只同步進程啓動以後發生改動事件的文件,原有的目錄即使有差異也不會同步。默認是true,一般不要更改 -
delay
累計事件,等待rsync同步延時時間,默認15秒(最大累計到1000個不可合併的事件)。也就是15s內監控目錄下發生的改動,會累積到一次rsync同步,避免過於頻繁的同步。(可合併的意思是,15s內兩次修改了同一文件,最後只同步最新的文件) -
delete
爲了保持target與souce完全同步,Lsyncd默認會delete = true來允許同步刪除。它除了false,還有startup、running值 -
excludeFrom
排除選項,後面指定排除的列表文件,如excludeFrom = “/etc/lsyncd.exclude”,如果是簡單的排除,可以使用exclude = LIST- 監控路徑裏的任何部分匹配到一個文本,都會被排除,例如/bin/foo/bar可以匹配規則foo
- 如果規則以斜線/開頭,則從頭開始要匹配全部
- 如果規則以/結尾,則要匹配監控路徑的末尾
- ?匹配任何字符,但不包括/
- *匹配0或多個字符,但不包括/
- **匹配0或多個字符,可以是/
rsync
- bwlimit 限速,單位kb/s,與rsync相同
- compress 壓縮傳輸默認爲true。在帶寬與cpu負載之間權衡,本地目錄同步可以考慮把它設爲false
- perms 默認保留文件權限。
其它還有rsyncssh模式獨有的配置項,如host、targetdir、rsync_path、password_file,見後文示例。
lsyncd.conf可以有多個sync,各自的source,各自的target,各自的模式,互不影響。
啓動
`lsyncd -log Exec /usr/local/lsyncd-2.2.3/etc/lsyncd.conf`
同步模式
本地同步
本地目錄同步,direct:cp/rm/mv。
sync {
default.direct,
source = "/tmp/src",
target = "/tmp/dest",
delay = 1
maxProcesses = 1
}
本地目錄同步(rsync模式)
sync {
default.rsync,
source = "/tmp/src",
target = "/tmp/dest1",
excludeFrom = "/etc/rsyncd.d/rsync_exclude.lst",
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
bwlimit = 2000
}
}
遠程目錄同步,rsync模式 + rsyncd daemon(常用)
需要配置rsyncd服務端
sync {
default.rsync,
source = "/tmp/src",
target = "[email protected]::module1",
delete="running",
exclude = { ".*", ".tmp" },
delay = 30,
init = false,
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
verbose = true,
password_file = "/etc/rsyncd.d/rsync.pwd",
_extra = {"--bwlimit=200"}
}
遠程目錄同步,rsync模式 + ssh shell
sync {
default.rsync,
source = "/tmp/src",
target = "172.16.1.100:/tmp/dest",
-- target = "[email protected]:/remote/dest",
-- 上面target,注意如果是普通用戶,必須擁有寫權限
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"
-- 如果要指定其它端口,請用上面的rsh
}
}
遠程目錄同步,rsync模式 + rsyncssh,效果與上面相同
sync {
default.rsyncssh,
source = "/tmp/src2",
host = "172.16.1.100",
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
}
}
常用配置
settings {
logfile ="/var/log/lsyncd.log",
statusFile ="/tmp/lsyncd.state",
inotifyMode = "CloseWrite",
maxProcesses = 8,
}
sync {
default.rsync,
{% if ansible_hostname == web01_hostname %}
source = "/www/server/nginx/html/",
target = "rsync_backup@{{ web02_ip }}::html",
{% elif ansible_hostname == nfs01_hostname %}
source = "/data",
target = "rsync_backup@{{ backup_ip }}::backup",
{% endif %}
delete="running",
init = false,
rsync = {
binary = "/usr/bin/rsync",
archive = true,
compress = true,
verbose = true,
password_file = "/etc/rsync.password",
}
}