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