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