运维同步rsync
Rsync(remote? rynchronization)是一款開(kāi)源的、快速的、多功能的、可實(shí)現(xiàn)全量以及增量的本地或者遠(yuǎn)程數(shù)據(jù)同步的備份的優(yōu)秀工具,可使本地主機(jī)不同分區(qū)或目錄之間及本地和遠(yuǎn)程兩臺(tái)主機(jī)之間的數(shù)據(jù)快速同步鏡像,遠(yuǎn)程備份等功能同時(shí)它在同步文件的同時(shí)可以保持原來(lái)文件的權(quán)限、時(shí)間、軟硬鏈接等附加信息。可以再本地不同分區(qū)以及目錄之間全量以及增量的復(fù)制數(shù)據(jù),不是加密的,可以實(shí)現(xiàn)刪除文件和目錄的功能。在同步備份數(shù)據(jù)時(shí),通過(guò)其獨(dú)特的quick check算法,僅同步大小或者最后的修改時(shí)間發(fā)生變化的文件或者目錄,當(dāng)然也可以根據(jù)權(quán)限、屬主等屬性的變化同步,但需指定相應(yīng)的參數(shù),甚至可以實(shí)現(xiàn)只同步一個(gè)文件里面變化的部分,實(shí)現(xiàn)數(shù)據(jù)的差異化備份,所以可以實(shí)現(xiàn)快速的同步備份數(shù)據(jù)
一、Rsync大致使用三種主要的傳輸數(shù)據(jù)方式。
| 本地傳輸(local) ? | 當(dāng)SRC和DES路徑信息都不包含有單個(gè)冒號(hào)”:”分隔符時(shí)就啟動(dòng)這種工作模式 | rsync -a /data /backup rsync -b --suffix=.bak2 --backup-dir=/tmp/ /etc/passwd /home/passwd.bak --suffix=xxx 指定舊備份文件的后綴名 --backup-dir=xxxx 指定將舊備份文件移動(dòng)到哪個(gè)位置下 |
| 遠(yuǎn)程通道 傳輸 remote shell ? | 利用ssh實(shí)現(xiàn)數(shù)據(jù)的遠(yuǎn)程傳輸,類似于 scp rsync默認(rèn)也是基于ssh來(lái)實(shí)現(xiàn)的,如果目標(biāo)主機(jī)的ssh端口不是22,那么在用rsync的必須用-e選項(xiàng) | 拉取:rsync -v -e "ssh -p 22" root@192.168.31.201:/home/passwd /tmp/ ? |
| 守護(hù)進(jìn)程傳輸 | rsync的配置文件: /etc/rsyncd.conf(默認(rèn)不存在) | ? |
| 本地傳輸、遠(yuǎn)程通道傳輸?shù)谋举|(zhì)是通過(guò)管道通信,即使是遠(yuǎn)程shell。而守護(hù)進(jìn)程傳輸則是讓遠(yuǎn)程主機(jī)上運(yùn)行rsync服務(wù),使其監(jiān)聽(tīng)在一個(gè)端口上,等待客戶端的連接。 但是,通過(guò)遠(yuǎn)程shell也能臨時(shí)啟動(dòng)一個(gè)rsync daemon,這不同于守護(hù)進(jìn)程傳輸,它不要求遠(yuǎn)程主機(jī)上事先啟動(dòng)rsync服務(wù),而是臨時(shí)派生出rsync daemon,它是單用途的一次性daemon,僅用于臨時(shí)讀取daemon的配置文件,當(dāng)此次rsync同步完成,遠(yuǎn)程shell啟動(dòng)的rsync daemon進(jìn)程也會(huì)自動(dòng)消逝。此通信方式的命令行語(yǔ)法格式同"Access via rsync daemon",但要求options部分必須明確指定"--rsh"選項(xiàng)或其短選項(xiàng)"-e"。 遠(yuǎn)程shell連接的兩端是通過(guò)管道完成通信和數(shù)據(jù)傳輸?shù)?#xff0c;即使連接的一端是遠(yuǎn)程主機(jī),當(dāng)連接到目標(biāo)端時(shí),將在目標(biāo)端上根據(jù)遠(yuǎn)程shell進(jìn)程fork出rsync進(jìn)程使其成為rsync server。而rsync daemon是事先在server端上運(yùn)行好的rsync后臺(tái)進(jìn)程(根據(jù)啟動(dòng)選項(xiàng),也可以設(shè)置為非后臺(tái)進(jìn)程),它監(jiān)聽(tīng)套接字等待client端的連接,連接建立后所有通信方式都是通過(guò)套接字完成的。 注意,rsync中的server的概念從來(lái)就不代表是rsync daemon,server在rsync中只是一種通用稱呼,只要不是發(fā)起rsync請(qǐng)求的client端,就是server端,你可以認(rèn)為rsync daemon是一種特殊的server,其實(shí)daemon更應(yīng)該稱之為service | ||
二、選項(xiàng)說(shuō)明:
| -v:顯示rsync過(guò)程中詳細(xì)信息。可以使用"-vvvv"獲取更詳細(xì)信息。 -P:顯示文件傳輸?shù)倪M(jìn)度信息。(實(shí)際上"-P"="--partial --progress",其中的"--progress"才是顯示進(jìn)度? ? ? 信息的)。 -n --dry-run :僅測(cè)試傳輸,而不實(shí)際傳輸。常和"-vvvv"配合使用來(lái)查看rsync是如何工作的。 -a --archive :歸檔模式,表示遞歸傳輸并保持文件屬性。等同于"-rtopgDl"。 -r --recursive:遞歸到目錄中去。 -t --times:保持mtime屬性。強(qiáng)烈建議任何時(shí)候都加上"-t",否則目標(biāo)文件mtime會(huì)設(shè)置為系統(tǒng)時(shí)間,導(dǎo)致下? ? ? ? ? ? ? 次更新檢查出mtime不同從而導(dǎo)致增量傳輸無(wú)效。 -o --owner:保持owner屬性(屬主)。 -g --group:保持group屬性(屬組)。 -p --perms:保持perms屬性(權(quán)限,不包括特殊權(quán)限)。 -D :是"--device --specials"選項(xiàng)的組合,即也拷貝設(shè)備文件和特殊文件。 -l --links:如果文件是軟鏈接文件,則拷貝軟鏈接本身而非軟鏈接所指向的對(duì)象。 -z :-compress??傳輸時(shí)進(jìn)行壓縮以提高傳輸效率 --compress-level=num可按級(jí)別壓縮。 -R --relative:使用相對(duì)路徑。意味著將命令行中指定的全路徑而非路徑最尾部的文件名發(fā)送給服務(wù)端,包括? ? ? ? ? ? ? ? ?它們的屬性。用法見(jiàn)下文示例。 --size-only :默認(rèn)算法是檢查文件大小和mtime不同的文件,使用此選項(xiàng)將只檢查文件大小。 -u --update :僅在源mtime比目標(biāo)已存在文件的mtime新時(shí)才拷貝。注意,該選項(xiàng)是接收端判斷的,不會(huì)影響? ? ? ? ? ? ? ? 刪除行為。 -d --dirs :以不遞歸的方式拷貝目錄本身。默認(rèn)遞歸時(shí),如果源為"dir1/file1",則不會(huì)拷貝dir1目錄,使? ? ? ? ? ? ? 用該選項(xiàng)將拷貝dir1但不拷貝file1。 --max-size :限制rsync傳輸?shù)淖畲笪募笮 ?梢允褂脝挝缓缶Y,還可以是一個(gè)小數(shù)值(例如:"--max- ? ? ? ? ? ? ?size=1.5m") --min-size :限制rsync傳輸?shù)淖钚∥募笮 _@可以用于禁止傳輸小文件或那些垃圾文件。 --exclude :指定排除規(guī)則來(lái)排除不需要傳輸?shù)奈募?br /> ?? ? ? ? ? ?排除單個(gè)文件:–exclude=5.txt ? ? ? ? ? ? 排除多個(gè)文件:–exclude={5.txt, 7.txt} ? ? ? ? ? ? 基于通配符做排除:–exclude=*txt --delete :接收端的rsync會(huì)先刪除目標(biāo)目錄下已經(jīng)存在,但源端目錄不存在的文件。以SRC為主,對(duì)DEST進(jìn)? ? ? ? ? ? ?行同步。多則刪 之,少則補(bǔ)之。注意"--delete"是在接收端執(zhí)行的,所以它exclude/include? ? ? ? ? ? ?規(guī)則生效之后才執(zhí)行的。 -b --backup :對(duì)目標(biāo)上已存在的文件做一個(gè)備份,備份的文件名后默認(rèn)使用"~"做后綴。 --backup-dir:指定備份文件的保存路徑。不指定時(shí)默認(rèn)和待備份文件保存在同一目錄下。 -e :指定所要使用的遠(yuǎn)程shell程序,默認(rèn)為ssh。 --port :連接daemon時(shí)使用的端口號(hào),默認(rèn)為873端口。 --password-file:daemon模式時(shí)的密碼文件,可以從中讀取密碼實(shí)現(xiàn)非交互式。注意,這不是遠(yuǎn)程shell認(rèn)證? ? ? ? ? ? ? ? ? ?的密碼,而是rsync模塊認(rèn)證的密碼。 -W --whole-file:rsync將不再使用增量傳輸,而是全量傳輸。在網(wǎng)絡(luò)帶寬高于磁盤(pán)帶寬時(shí),該選項(xiàng)比增量傳? ? ? ? ? ? ? ? ? ?輸更高效。 --existing :要求只更新目標(biāo)端已存在的文件,目標(biāo)端還不存在的文件不傳輸。注意,使用相對(duì)路徑時(shí)如果上? ? ? ? ? ? ? ?層目錄不存在也不會(huì)傳輸。 --ignore-existing:要求只更新目標(biāo)端不存在的文件。和"--existing"結(jié)合使用有特殊功能,見(jiàn)下文示例。 --remove-source-files:要求刪除源端已經(jīng)成功傳輸?shù)奈募?/td> |
三、配置文件
port=888 # 指定rsync端口。默認(rèn)873 uid = rsync # rsync服務(wù)的運(yùn)行用戶,默認(rèn)是nobody,文件傳輸成功后屬主將是這個(gè)uid gid = rsync # rsync服務(wù)的運(yùn)行組,默認(rèn)是nobody,文件傳輸成功后屬組將是這個(gè)gid use chroot = no # rsync daemon在傳輸前是否切換到指定的path目錄下,并將其監(jiān)禁在內(nèi) max connections = 200 # 指定最大連接數(shù)量,0表示沒(méi)有限制 timeout = 300 # 確保rsync服務(wù)器不會(huì)永遠(yuǎn)等待一個(gè)崩潰的客戶端,0表示永遠(yuǎn)等待 motd file = /var/rsyncd/rsync.motd # 客戶端連接過(guò)來(lái)顯示的消息 pid file = /var/run/rsyncd.pid # 指定rsync daemon的pid文件 lock file = /var/run/rsync.lock # 指定鎖文件 log file = /var/log/rsyncd.log # 指定rsync的日志文件,而不把日志發(fā)送給syslog dont compress = *.gz *.tgz *.zip *.z *.Z *.rpm *.deb *.bz2 # 指定哪些文件不用進(jìn)行壓縮傳輸###########下面指定模塊,并設(shè)定模塊配置參數(shù),可以創(chuàng)建多個(gè)模塊########### [longshuai] # 模塊ID path = /longshuai/ # 指定該模塊的路徑,該參數(shù)必須指定。啟動(dòng)rsync服務(wù)前該目錄必須存在。rsync請(qǐng)求訪問(wèn)模塊本質(zhì)就是訪問(wèn)該路徑。 ignore errors # 忽略某些IO錯(cuò)誤信息 read only = false # 指定該模塊是否可讀寫(xiě),即能否上傳文件,false表示可讀寫(xiě),true表示可讀不可寫(xiě)。所有模塊默認(rèn)不可上傳 write only = false # 指定該模式是否支持下載,設(shè)置為true表示客戶端不能下載。所有模塊默認(rèn)可下載 list = false # 客戶端請(qǐng)求顯示模塊列表時(shí),該模塊是否顯示出來(lái),設(shè)置為false則該模塊為隱藏模塊。默認(rèn)true hosts allow = 10.0.0.0/24 # 指定允許連接到該模塊的機(jī)器,多個(gè)ip用空格隔開(kāi)或者設(shè)置區(qū)間 hosts deny = 0.0.0.0/32 # 指定不允許連接到該模塊的機(jī)器 auth users = rsync_backup # 指定連接到該模塊的用戶列表,只有列表里的用戶才能連接到模塊,用戶名和對(duì)應(yīng)密碼保存在secrts file中,# 這里使用的不是系統(tǒng)用戶,而是虛擬用戶。不設(shè)置時(shí),默認(rèn)所有用戶都能連接,但使用的是匿名連接 secrets file = /etc/rsyncd.passwd # 保存auth users用戶列表的用戶名和密碼,每行包含一個(gè)username:passwd。由于"strict modes"# 默認(rèn)為true,所以此文件要求非rsync daemon用戶不可讀寫(xiě)。只有啟用了auth users該選項(xiàng)才有效。 [xiaofang] # 以下定義的是第二個(gè)模塊 path=/xiaofang/ read only = false ignore errors comment = anyone can access#客戶端推到服務(wù)端時(shí),文件的屬主和屬組是配置文件中指定的uid和gid。但是客戶端從服務(wù)端拉的時(shí)候,#文件的屬主和屬組是客戶端正在操作rsync的用戶身份,因?yàn)閳?zhí)行rsync程序的用戶為當(dāng)前用戶。#auth users和secrets file這兩行不是一定需要的,省略它們時(shí)將默認(rèn)使用匿名連接。但是如果使用了#它們,則secrets file的權(quán)限必須是600。客戶端的密碼文件也必須是600。#關(guān)于secrets file的權(quán)限,實(shí)際上并非一定是600,只要滿足除了運(yùn)行rsync daemon的用戶可讀即可。##是否檢查權(quán)限的設(shè)定是通過(guò)選項(xiàng)strict mode設(shè)置的,如果設(shè)置為false,則無(wú)需關(guān)注文件的權(quán)限。但默認(rèn)是#yes,即需要設(shè)置權(quán)限。#配置完后,再就是提供模塊相關(guān)目錄、身份驗(yàn)證文件等?四、Inotify介紹
? ? ? ?Inotify可用于檢測(cè)單個(gè)文件,也可以檢測(cè)整個(gè)目錄。當(dāng)檢測(cè)的對(duì)象是一個(gè)目錄的時(shí)候,目錄本身和目錄里的內(nèi)容都會(huì)成為檢? ? ? ? ? ?測(cè)的對(duì)象。
? ? ? ?參數(shù):
| -e: 事件? ? ? -d:后臺(tái)運(yùn)行? ? ? ?-m:始終保持事件監(jiān)聽(tīng)狀態(tài)? ? ? ?-q:打印很少的信息,僅僅打印監(jiān)控事件的信息 安靜狀態(tài) -r :遞歸查詢目錄? ? ? ? ? ? ? ? ? ? ?-timefmt:指定時(shí)間輸出的格式? ? ? -excluder:排除文件或者目錄的時(shí)候不區(qū)分大小寫(xiě) |
? ? ??
注解:
| 當(dāng)發(fā)送端敲出rsync命令后,rsync將立即掃描命令行中給定的文件和目錄(掃描過(guò)程中還會(huì)按照目錄進(jìn)行排序,將同一個(gè)目錄的文件放在相鄰的位置),這稱為拷貝樹(shù)(copy tree),掃描完成后將待傳輸?shù)奈募蚰夸浻涗浀轿募斜碇?#xff0c;然后將文件列表傳輸給接收端。而篩選規(guī)則的作用時(shí)刻是在掃描拷貝樹(shù)時(shí),所以會(huì)根據(jù)規(guī)則來(lái)匹配并決定文件是否記錄到文件列表中(嚴(yán)格地說(shuō)是會(huì)記錄到文件列表中的,只不過(guò)排除的文件會(huì)被標(biāo)記為hide隱藏起來(lái)),只有記錄到了文件列表中的文件或目錄才是真正需要傳輸?shù)膬?nèi)容。換句話說(shuō),篩選規(guī)則的生效時(shí)間在rsync整個(gè)同步過(guò)程中是非常靠前的,它會(huì)影響很多選項(xiàng)的操作對(duì)象,最典型的如"--delete",實(shí)際上,排除規(guī)則和包含規(guī)則都只是"--filter"篩選規(guī)則的兩種特殊規(guī)則。"--filter"比較復(fù)雜,它有自己的規(guī)則語(yǔ)法和匹配模式 以下是rsync中的規(guī)則種類,不解之處請(qǐng)結(jié)合下文的"--delete"分析: (1).exclude規(guī)則:即排除規(guī)則,只作用于發(fā)送端,被排除的文件不會(huì)進(jìn)入文件列表(實(shí)際上是加上隱藏規(guī)則進(jìn)行隱藏)。 (2).include規(guī)則:即包含規(guī)則,也稱為傳輸規(guī)則,只作用于發(fā)送端,被包含的文件將明確記錄到文件列表中。 (3).hide規(guī)則:即隱藏規(guī)則,只作用于發(fā)送端,隱藏后的文件對(duì)于接收端來(lái)說(shuō)是看不見(jiàn)的,也就是說(shuō)接收端會(huì)認(rèn)為它不存在于源端。 (4).show規(guī)則:即顯示規(guī)則,只作用于發(fā)送端,是隱藏規(guī)則的反向規(guī)則。 (5).protect規(guī)則:即保護(hù)規(guī)則,該規(guī)則只作用于接收端,被保護(hù)的文件不會(huì)被刪除掉。 (6).risk規(guī)則:即取消保護(hù)規(guī)則。是protect的反向規(guī)則。 除此之外,還有一種規(guī)則是"clear規(guī)則",作用是刪除include/exclude規(guī)則列表,如果將"--delete"選項(xiàng)和"--exlcude"選項(xiàng)一起使用,則被排除的文件不會(huì)被刪除。 在發(fā)送端將文件列表發(fā)送給接收端后,接收端的generator(要是不知道,你認(rèn)為是某個(gè)就好了)進(jìn)程會(huì)掃描每個(gè)文件列表中的信息,然后對(duì)列表中的每個(gè)信息條目都計(jì)算數(shù)據(jù)塊校驗(yàn)碼,最后將數(shù)據(jù)庫(kù)校驗(yàn)碼發(fā)給發(fā)送端,發(fā)送端通過(guò)校驗(yàn)碼來(lái)匹配哪些數(shù)據(jù)塊是需要傳輸?shù)?#xff0c;這樣就實(shí)現(xiàn)了增量傳輸?shù)墓δ堋粋鬏敻淖兊牟糠?#xff0c;不會(huì)傳輸整個(gè)文件。而delete刪除的時(shí)間點(diǎn)是generator進(jìn)程處理每個(gè)文件列表時(shí)、生成校驗(yàn)碼之前進(jìn)行的,先將目標(biāo)上存在但源上不存在的多余文件刪除,這樣就無(wú)需為多余的文件生成校驗(yàn)碼。 所以,delete動(dòng)作是比"--exclude"規(guī)則更晚執(zhí)行的,被"--exlcude"規(guī)則排除的文件不會(huì)進(jìn)入文件列表中,在執(zhí)行了delete時(shí)會(huì)認(rèn)為該文件不存在于源端,從而導(dǎo)致目標(biāo)端將這些文件刪除。但這是想當(dāng)然的,盡管理論上確實(shí)是這樣的,但是rsync為了防止眾多誤刪除情況,提供了兩種規(guī)則:保護(hù)規(guī)則(protect)和取消保護(hù)規(guī)則(risk)。默認(rèn)情況下,"--delete"和"--exclude"一起使用時(shí),雖然發(fā)送端的exclude規(guī)則將文件標(biāo)記為隱藏,使得接收端認(rèn)為這些被排除文件在源端不存在,但rsync會(huì)將這些隱藏文件標(biāo)記為保護(hù)文件,使得它們不受delete行為的影響,這樣delete就刪除不了這些被排除的文件。如果還是想要強(qiáng)行刪除被exclude排除的文件,可以使用"--delete-excluded"選項(xiàng)強(qiáng)制取消保護(hù),這樣即使被排除的文件也會(huì)被刪除。 那么現(xiàn)在,是否理解了網(wǎng)上的言論"exclude排除的文件不會(huì)被刪除"? 除了"--delete",相關(guān)的選項(xiàng)還有"--delete-before"、"--delete-during"、"--delete-delay"等,它們都隱含了"--delete"選項(xiàng),它們分別表示generator處理各個(gè)文件列表之前一次性全部刪除待刪除文件、處理文件列表時(shí)處理到哪個(gè)文件列表就刪除該文件列表中的待刪除文件,以及同步完所有數(shù)據(jù)后一次性刪除所有待刪除文件。 舉個(gè)例子,假如源端要傳輸3個(gè)目錄a、b、c,在目標(biāo)端a目錄中有a1、a2、a3共3個(gè)文件需要被刪除,b目錄中有b1、b2、b3需要?jiǎng)h除,同理c目錄也一樣c1、c2、c3需要被刪除。 如果是"--delete-before",則在目標(biāo)端rsync剛啟動(dòng)時(shí),就會(huì)把a(bǔ)1-a3、b1-b3、c1-c3一次性刪除,然后才會(huì)處理文件列表中的a目錄,處理完a后處理b,再是c。 如果是"--delete-during",則在目標(biāo)端rsync剛啟動(dòng)時(shí),先處理文件列表中的a目錄,處理a目錄時(shí)發(fā)現(xiàn)此目錄中有待刪除文件a1-a3,順手就刪除它們,然后完成a目錄的相關(guān)操作,再處理文件列表中的b目錄,發(fā)現(xiàn)也有待刪除文件b1-b3,順手刪除它們,同理c1-c3也如此。 如果是"--delete-delay",則同步完文件列表中的a/b/c目錄后,最后一次性刪除a1-a3、b1-b3、c1-c3。 其實(shí)"--delete"選項(xiàng)大多數(shù)情況下默認(rèn)采用的就是"--delete-during" |
?
總結(jié)
- 上一篇: Mysql中limit的优化
- 下一篇: 日常问题——阿里云服务器ssh经常一段时