Github:axkibe/lsyncd
官方文檔:Lsyncd – Live Syncing (Mirror) Daemon
創(chuàng)新互聯(lián)是專業(yè)的遠(yuǎn)安網(wǎng)站建設(shè)公司,遠(yuǎn)安接單;提供網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行遠(yuǎn)安網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
Lsyncd的三種同步模式
為了方便,我們直接把它們稱為rsync、rsyncssh、direct。
1. rsync同步模式
首先,你需要知道rsync的基本用法,以下的rsync命令就可以把文件從本地的“/data/wwwroot”目錄推送到遠(yuǎn)程的“remote@192.168.1.6::wwwroot/”目錄中,運(yùn)行在“rsync同步模式”的lsyncd正是通過組裝類似這樣的命令來同步文件的:
rsync -avz --partial --delete /data/wwwroot remote@192.168.1.6::wwwroot/ --password-file=/etc/rsyncd.password
有人可能會(huì)疑惑,既然rsync本身就可以同步,那要lsyncd干嘛?有兩個(gè)原因:
- 實(shí)時(shí)同步。
- 減少rsync掃描文件帶來的延時(shí)和性能損耗。
2. rsyncssh同步模式
明白了rsync同步模式,就不難明白rsyncssh模式,因?yàn)閞sync本身就是有ssh模式的,lsyncd同樣是負(fù)責(zé)監(jiān)聽哪些文件變化了,然后組裝rsync同步命令進(jìn)行同步。
rsync的ssh模式,主要的好處是用于文件移動(dòng)的時(shí)候。
├── dir1
│ ├── aa.txt
│ ├── bb.txt
│ └── cc.txt
└── dir2
└── dd.txt
├── dir1
│ └── aa.txt
└── dir2
├── bb.txt
├── cc.txt
└── dd.txt
3. direct同步模式
這個(gè)模式用于本地的兩個(gè)目錄之間同步,不用于遠(yuǎn)程服務(wù)器同步。lsyncd同樣是監(jiān)聽文件變化事件,然后把變化的文件從源目錄同步到目標(biāo)目錄,同步的命令,就是linux系統(tǒng)本身的命令,比如cp、rm、mv,增加了文件用cp拷過去,刪除了文件,那邊也用rm刪除,移動(dòng)了文件,那邊也用mv移動(dòng)。
假設(shè)有A和B兩臺(tái)機(jī),A同步到B,則:
A中的lsyncd監(jiān)聽到文件變化后,調(diào)用A中的rsync向B推送文件,B因?yàn)檫\(yùn)行有一個(gè)rsyncd服務(wù),所以可以接收這個(gè)推送,從而完成文件的同步。
另外還可以有C、D、E、F、……,它們都與B相同,只要運(yùn)行rsyncd服務(wù)即可,A上可配置一次性推送向多臺(tái)機(jī)器。
CentOS用yum、其他的用各自的包管理軟件,比如Ubuntu用apt-get,Mac用brew install:
yum -y install rsync lsyncd
Lsyncd安裝好之后,默認(rèn)的配置文件在/etc/lsyncd.conf,另外還有些配置的例子在/usr/share/doc/lsyncd-2.2.2/examples下:
/usr/share/doc/lsyncd-2.2.2/examples/
├── lalarm.lua
├── lbash.lua
├── lecho.lua
├── lftp.lua
├── lgforce.lua
├── limagemagic.lua
├── lpostcmd.lua
├── lrsync.lua
├── lrsyncssh.lua
└── lsayirc.lua
0 directories, 10 files
/etc/lsyncd.conf也可以寫成/etc/lsyncd.lua,它本身就是用lua(一種腳本語言)寫配置的。
配置文件是使用lua語言寫的,所以注釋要用lua語言的注釋符號(hào),即兩個(gè)橫杠--。
配置文件主要有三部分:
以下是兩個(gè)官方的配置文檔:
/etc/lsyncd.conf中的默認(rèn)內(nèi)容沒什么價(jià)值,可以全部刪除,下邊我們來講解配置文件要怎么寫。
default.rsync模式配置文件:
-- 由于該配置文件實(shí)際上是lua語言的語法,所以寫注釋要用--,--是lua語言的注釋符號(hào)
-- Lsyncd本身的配置
settings {
-- 指定日志文件位置
logfile = "/var/log/lsyncd/lsyncd.log",
-- 指定狀態(tài)文件位置
statusFile = "/var/log/lsyncd/lsyncd.status",
-- 是否以后臺(tái)的方式運(yùn)行,注意它是nodaemon,所以是雙重否定,如果填false,意思就是“不要不后臺(tái)運(yùn)行”(即后臺(tái)運(yùn)行),非后臺(tái)運(yùn)行一般用于調(diào)試,把rsync的verbose也設(shè)置為true,這樣會(huì)把同步的細(xì)節(jié)輸出到控制臺(tái),方便調(diào)試
nodaemon = false,
-- 系統(tǒng)inotify指定監(jiān)聽的變化,什么事件才同步。CloseWrite表示文件關(guān)閉的時(shí)候同步(創(chuàng)建文件,修改文件后保存都會(huì)觸發(fā)CloseWrite事件),可以是"Modify"、"CloseWrite" (默認(rèn)) 或"CloseWrite or Modify"。
inotifyMode = "CloseWrite",
-- 最大同步進(jìn)程數(shù)(default.rsyncssh模式,則必須設(shè)置為1,這就是rsyncssh模式的缺點(diǎn)了,如果是default.rsync模式則可以設(shè)置大于1,這樣會(huì)有多個(gè)同步進(jìn)程,速度更快)
maxProcesses = 8,
-- maxProcesses = 1,
-- 配合下面的delay選項(xiàng)使用,delay單位是秒,當(dāng)delay時(shí)間到了,不管maxDelays設(shè)置多少,都會(huì)同步,同樣,當(dāng)maxDelays達(dá)到了設(shè)定值,不管是否到delay時(shí)間,都會(huì)同步,即兩個(gè)選項(xiàng)有一個(gè)滿足即會(huì)觸發(fā)同步,為了實(shí)時(shí)同>步,我們一般設(shè)置為1,表示即使只有一個(gè)文件改變也同步
maxDelays = 1,
}
---- 同步配置default.rsync模式(比如配置從哪同步到哪,忽略哪些文件,多久同步一次等),可以有多個(gè)sync模塊,每個(gè)模塊用于設(shè)置一臺(tái)目標(biāo)機(jī)器
sync {
-- 有default.rsync/default.direct/default.rsyncssh三種模式,我們默認(rèn)都用default.rsync即可。
default.rsync,
-- 同步源目錄(本機(jī)某個(gè)目錄)
source = "/data/wwwroot",
-- 同步目標(biāo)地址,不同同步模式有不同寫法,由于絕大多數(shù)情況都采用rsync同步,所以這里寫的是rsync的同步地址
target = "remote@192.168.1.6::wwwroot",
-- 默認(rèn)true,允許刪除目錄服務(wù)器中的某些文件(即刪除“那些在源服務(wù)器中不存在的文件”),可選值有: true/false/startup/running,startup就是只在啟動(dòng)lsyncd服務(wù)的時(shí)候判斷目標(biāo)服務(wù)器中有哪些文件在源服務(wù)器中沒有,然后把這些文件刪除,但啟動(dòng)之后如果目標(biāo)服務(wù)器又新增了文件,這些文件即使在源服務(wù)器不存在,也不會(huì)被刪除;而running與startup正好相反,是在啟動(dòng)的時(shí)候不會(huì)刪除,啟動(dòng)之后會(huì)刪除,true=running+startup,false相當(dāng)于running和startup都不做。
-- delete = true,
-- 哪些文件不同步(可用正則))
exclude = {
'.**',
'.git/**',
'*.bak',
'*.tmp',
'runtime/**',
'cache/**'
},
-- 與上邊的maxDelays配合,maxDelays是累計(jì)事件數(shù)(單位:個(gè)),delay是時(shí)間(單位:秒),這兩個(gè)只要有一個(gè)符合條件就會(huì)同步一次,但為了確保實(shí)時(shí)同步,maxDelays我們一般設(shè)置為1,也就是只要有一個(gè)文件變化事件,就會(huì)同步一次,而delay是比較大的,默認(rèn)是15。當(dāng)然,假如我們把maxDelays設(shè)置為100,那可能15秒到了也沒有達(dá)到100個(gè)文件變化,但由于到達(dá)時(shí)間了,它也會(huì)同步。
delay = 15,
-- 當(dāng)init = false時(shí)只同步進(jìn)程啟動(dòng)以后發(fā)生改動(dòng)事件的文件,原有的目錄即使有差異也不會(huì)同步,如果為true,則啟動(dòng)后如果源目錄與目標(biāo)目錄的文件有差異都會(huì)同步,默認(rèn)為true。
-- init = false,
-- rsync的配置(這是default.rsync模式,如果是default.rsyncssh模式,該模塊的配置會(huì)有所不同)
rsync = {
-- rsync可執(zhí)行文件的絕對路徑
binary = "/usr/bin/rsync",
-- 密碼文件路徑(default.rsyncssh模式不需要該項(xiàng))
password_file = "/etc/rsyncd.password",
-- 打包后再同步(注意,打包不等于壓縮,打包即可以壓縮也可以不壓縮)
archive = true,
-- 壓縮后再同步
compress = false,
-- 輸出同步信息(由于是后臺(tái)執(zhí)行,所以沒必要輸出,如果非后臺(tái)執(zhí)行可以設(shè)置為true,非后臺(tái)執(zhí)行主要用于調(diào)試)
verbose = false,
-- 由于rsync有非常多的選項(xiàng)(請自己rsync --help查看),部分非主要選項(xiàng)可以用_extra的方式指定,雙引號(hào)引住,逗號(hào)分隔(bwlimit中的bw是bandwith,即帶寬,整個(gè)意思是帶寬限制,omit-link-times忽略符號(hào)鏈接的修改時(shí)間)
_extra = {"--bwlimit=200", "--omit-link-times"}
}
}
解釋幾個(gè)選項(xiàng):
exclude再可以用excludeFrom來代替,這樣就可以在外部文件單獨(dú)寫要排除同步的文件:
excludeFrom = "/etc/lsyncd_exclude.lst",
外部排除同步文件/etc/lsyncd_exclude.lst的寫法:
.svn
Runtime/*
Uploads/*
若某個(gè)事件的路徑中的某些片段匹配這些文本,那么排除。比如/bin/foo/bar匹配規(guī)則foo。
– 如果規(guī)則以/開始,那么只匹配路徑的開始
如果規(guī)則以/結(jié)束,那么只匹配路徑的結(jié)束
– ? 匹配任何不是/的字符
– *匹配0或多次非/字符
– **匹配任何字符0或多次。
文章開頭已經(jīng)說過A、B兩臺(tái)機(jī)各自要安裝什么,現(xiàn)在A機(jī)的操作前面已經(jīng)講過了,B機(jī)的操作,由于之前寫過文章,這里就不再重復(fù),請直接看:rsync的使用。
開放端口
rsync的默認(rèn)端口是873,如果你是CentOS7的firewalld防火墻,可以用以下方法允許873端口:
firewall-cmd --zone=public --add-port=873/tcp --permanent
firewall-cmd --reload
如果你是本地做實(shí)驗(yàn)覺得防火墻麻煩,也可關(guān)閉防火墻:systemctl stop firewalld
啟動(dòng)lsync服務(wù)
如何啟動(dòng)的官方文檔:Invoking。
lsync配置文件寫好后,就可以啟動(dòng)它了,由于我們有配置文件,所以啟動(dòng)方式是:lsyncd -log Exec /etc/lsyncd.conf
-log Exec表示記錄所有進(jìn)程的日志(因?yàn)槿绻鹠axProcesses大于1就會(huì)有多個(gè)同步進(jìn)程)
啟動(dòng)后,它只輸出了:21:46:54 Normal: --- Startup, daemonizing ---
查看是否啟動(dòng)成功:ps aux | grep lsyncd
如何進(jìn)程正常運(yùn)行,可以看到:root 5238 7.7 0.6 13348 3340 ? Ss 21:46 0:15 lsyncd /etc/lsyncd.conf
查看log文件,你會(huì)看到已經(jīng)同步了很多文件:tail -100f /var/log/lsyncd/lsyncd.log
但其實(shí)在CentOS7系統(tǒng)中,我們一般不直接啟動(dòng),而是用systemctl命令來啟動(dòng):systemctl start lsyncd
查看啟動(dòng)狀態(tài):systemctl status lsyncd
停止:systemctl stop lsyncd
重啟:systemctl restart lsyncd
設(shè)置開機(jī)自啟動(dòng):systemctl enable lsyncd
相比rsync,主要修改的有以下幾點(diǎn):
Error: error preparing /etc/lsyncd.conf: /etc/lsyncd.conf:69: default.rsyncssh must have maxProcesses set to 1.
-- 由于該配置文件實(shí)際上是lua語言的語法,所以寫注釋要用--,--是lua語言的注釋符號(hào)
-- Lsyncd本身的配置
settings {
-- 指定日志文件位置
logfile = "/var/log/lsyncd/lsyncd.log",
-- 指定狀態(tài)文件位置
statusFile = "/var/log/lsyncd/lsyncd.status",
-- inotify事件模式,什么事件才同步,CloseWrite表示文件關(guān)閉的時(shí)候同步(創(chuàng)建文件,修改文件后再關(guān)閉(如vim的:wq)都會(huì)觸發(fā)CloseWrite事件)
inotifyMode = "CloseWrite",
-- 最大同步進(jìn)程數(shù)(default.rsyncssh模式必須設(shè)置為1,否則無法啟動(dòng),default.rsync模式可以設(shè)置大于1)
maxProcesses = 1,
-- 配合下面的delay選項(xiàng)使用,delay單位是秒,當(dāng)delay時(shí)間到了,不管maxDelays設(shè)置多少,都會(huì)同步,同樣,當(dāng)maxDelays達(dá)到了設(shè)定值,不管是否到delay時(shí)間,都會(huì)同步,即兩個(gè)選項(xiàng)有一個(gè)滿足即會(huì)觸發(fā)同步,為了實(shí)時(shí)同>步,我們一般設(shè)置為1,表示即使只有一個(gè)文件改變也同步
maxDelays = 1,
-- 是否以后臺(tái)的方式運(yùn)行,注意它是nodaemon,所以是雙重否定,如果填false,意思就是“不要不后臺(tái)運(yùn)行”(即后臺(tái)運(yùn)行),非后臺(tái)運(yùn)行一般用于調(diào)試,把rsync的verbose也設(shè)置為true,這樣會(huì)把同步的細(xì)節(jié)輸出到控制臺(tái),方便調(diào)試
nodaemon = false,
}
-- 同步配置default.rsync模式(比如配置從哪同步到哪,要忽略哪些文件,多久同步一次等),可以有多個(gè)sync模塊,每個(gè)模塊用于設(shè)置一臺(tái)目標(biāo)機(jī)器
sync {
-- 有default.rsync/default.direct/default.rsyncssh三種模式,我們默認(rèn)都用default.rsyncssh方式,因?yàn)檫@種方式其實(shí)是最好的。
default.rsyncssh,
-- 同步源目錄(本機(jī)某個(gè)目錄)
source = "/data/wwwroot/",
-- 同步目標(biāo)地址,rsyncssh模式寫法
host="192.168.1.6",
targetdir="/data/wwwroot/",
-- 默認(rèn)true,允許刪除目錄服務(wù)器中的某些文件(即刪除“那些在源服務(wù)器中不存在的文件”),可選值有: true/false/startup/running,startup就是只在啟動(dòng)lsyncd服務(wù)的時(shí)候判斷目標(biāo)服務(wù)器中有哪些文件在源服務(wù)器中沒有,然后把這些文件刪除,但啟動(dòng)之后如果目標(biāo)服務(wù)器又新增了文件,這些文件即使在源服務(wù)器不存在,也不會(huì)被刪除;而running與startup正好相反,是在啟動(dòng)的時(shí)候不會(huì)刪除,啟動(dòng)之后會(huì)刪除,true=running+startup,false相當(dāng)于running和startup都不做。
-- delete = true,
-- 哪些文件不同步(可用正則))
exclude = {
'.**',
'.git/**',
'*.bak',
'*.tmp',
'runtime/**',
'cache/**'
},
-- 忽略文件路徑規(guī)則也可用外部配置文件
-- excludeFrom = "/etc/lsyncd_exclude.lst",
-- 與上邊的maxDelays配合,maxDelays是累計(jì)事件數(shù)(單位:個(gè)),delay是時(shí)間(單位:秒),這兩個(gè)只要有一個(gè)符合條件就會(huì)同步一次,但為了確保實(shí)時(shí)同步,maxDelays我們一般設(shè)置為1,也就是只要有一個(gè)文件變化事件,就會(huì)同步一次,而delay是比較大的,默認(rèn)是15。當(dāng)然,假如我們把maxDelays設(shè)置為100,那可能15秒到了也沒有達(dá)到100個(gè)文件變化,但由于到達(dá)時(shí)間了,它也會(huì)同步。
delay = 15,
-- 當(dāng)init = false時(shí)只同步進(jìn)程啟動(dòng)以后發(fā)生改動(dòng)事件的文件,原有的目錄即使有差異也不會(huì)同步,如果為true,則啟動(dòng)后如果源目錄與目標(biāo)目錄的文件有差異,就會(huì)同步,我們當(dāng)然要設(shè)置為true,默認(rèn)為true,所以這個(gè)設(shè)置可以不寫,寫在這里是為了解釋它。
-- init = false,
-- rsyncssh的配置(這是default.rsyncssh模式,如果是default.rsyncssh模式,該模塊的配置會(huì)有所不同)
rsync = {
-- rsync可執(zhí)行文件的絕對路徑
binary = "/usr/bin/rsync",
-- 密碼文件路徑(rsync模式不用該配置,rsyncssh模式才需要該項(xiàng))
-- password_file = "/etc/rsyncd.password",
-- 打包后再同步(注意,打包不等于壓縮,打包即可以壓縮也可以不壓縮)
archive = true,
-- 壓縮后再同步
compress = true,
-- 同步符號(hào)鏈接文件
copy_links = true,
-- 同步符號(hào)鏈接目錄
copy_dirlinks = true,
-- 輸出同步信息(由于是后臺(tái)執(zhí)行,所以沒必要輸出,如果非后臺(tái)執(zhí)行可以設(shè)置為true,非后臺(tái)執(zhí)行主要用于調(diào)試)
verbose = false,
-- 由于rsync有非常多的選項(xiàng)(請自己rsync --help查看),部分非主要選項(xiàng)可以用_extra的方式指定,雙引號(hào)引住,逗號(hào)分隔(bwlimit中的bw是bandwith,即帶寬,整個(gè)意思是帶寬限制,omit-link-times忽略符號(hào)鏈接的修改時(shí)間)
_extra = {"--bwlimit=200", "--omit-link-times"},
-- 指定ssh相關(guān)參數(shù)選項(xiàng)
rsh = "/usr/bin/ssh -l xiebruce -i /root/.ssh/id_rsa -o StrictHostKeyChecking=no"
}
}
其中這一句就是用來通過ssh登錄到服務(wù)器的:rsh = "/usr/bin/ssh -l xiebruce -i /root/.ssh/id_rsa -o StrictHostKeyChecking=no"
The authenticity of host '192.168.1.6 (192.168.1.6)' can't be established.
ECDSA key fingerprint is SHA256:xcDUp3zNlJvhY4fwfwDH1pgOyc5p8Vsr2OjopanEQBw.
Are you sure you want to continue connecting (yes/no)?
如果你輸入no那就不會(huì)登錄,如果你輸入yes,就會(huì)登錄,并且把這個(gè)“key fingerprint”(指紋密鑰)添加到你終端的ssh配置目錄下的known_hosts文件中,這個(gè)文件的位置,對于Mac/Linux電腦,是在~/.ssh/known_hosts,Windows的話則是在C:\Users\用戶名\目錄下。
同理,現(xiàn)在是rsync登錄你的ssh,所以rsync也會(huì)存儲(chǔ)這樣的指紋密鑰,如果“StrictHostKeyChecking”設(shè)置為yes,就意味著每次都要嚴(yán)格檢查密鑰(就相當(dāng)于你用終端登錄時(shí),每次都要你輸入一遍yes),這樣顯然是沒必要的,所以我們要把它設(shè)置為“StrictHostKeyChecking=no”。
default.direct模式:該模式我沒有測試
sync {
default.direct,
source = "/home/user/src/",
target = "/home/user/trg/"
}
格式如下,每臺(tái)目標(biāo)服務(wù)器一個(gè)sync模塊即可,每個(gè)sync模塊都像上邊說的那樣寫就行,其實(shí)就只是ip不同,其他都一樣:
settings {
logfile = "/var/log/lsyncd/lsyncd.log",
inotifyMode = "CloseWrite or Modify",
-- statusFile = "/var/log/lsyncd/lsyncd.status",
}
-- B服務(wù)器配置
sync {
default.rsync,
source = "/etc/nginx/",
target = "rsync://rsync@192.168.1.6:1873/nginx/",
exclude = { ".*", "*.tmp", "*.swp", "*.bak", "*.log", "*.swx", "*~", "sets/config.json", "listen_local_*" },
delay = 2,
init = false,
rsync = {
password_file = "/etc/rsyncd.passwd",
archive = true,
compress = true,
verbose = true,
checksum = true,
ignore_times = true
}
}
-- C服務(wù)器配置
sync {
default.rsync,
source = "/data/web/",
target = "rsync://rsync@192.168.1.11:1873/web/",
exclude = { ".*", "*.tmp", "*.swp", "*.bak", "*.log", "*.out", "*/logs/*", "*.swx", "*~" },
delay = 120,
init = false,
rsync = {
password_file = "/etc/rsyncd.passwd",
archive = true,
compress = true,
verbose = true,
checksum = true,
ignore_times = true
}
}
-- D服務(wù)器配置
sync {
default.rsync,
source = "/data/script/",
target = "rsync://rsync@192.168.1.100:1873/script/",
exclude = { ".*", "*.tmp", "*.swp", "*.bak", "*.log", "*.out", "*/logs/*", "*.swx", "*~" },
delay = 2,
init = false,
rsync = {
password_file = "/etc/rsyncd.passwd",
archive = true,
compress = true,
verbose = true,
checksum = true,
ignore_times = true
}
}