天天看點

Linux下同步工具inotify+rsync使用詳解Linux下同步工具inotify+rsync使用詳解 1. rsync 2. inotify-tools 3. rsync組合inotify-tools完成實時同步

rsync是一個遠端資料同步工具,可通過LAN/WAN快速同步多台主機間的檔案。它使用所謂的“Rsync演算法”來使本地和遠端兩個主機之間的檔案達到同步,這個算法隻傳送兩個檔案的不同部分,而不是每次都整份傳送,是以速度相當快。是以通常可以作為備份工具來使用。

運作Rsync server的機器也叫backup server,一個Rsync server可同時備份多個client的資料;也可以多個Rsync server備份一個client的資料。Rsync可以搭配ssh甚至使用daemon模式。Rsync server會打開一個873的服務通道(port),等待對方rsync連接配接。連接配接時,Rsync server會檢查密碼是否相符,若通過密碼查核,則可以開始進行檔案傳輸。第一次連通完成時,會把整份檔案傳輸一次,下一次就隻傳送二個檔案之間不同的部份。

基本特點:

可以鏡像儲存整個目錄樹和檔案系統;

可以很容易做到保持原來檔案的權限、時間、軟硬連結等;

無須特殊權限即可安裝;

優化的流程,檔案傳輸效率高;

可以使用rcp、ssh等方式來傳輸檔案,當然也可以通過直接的socket連接配接;

支援匿名傳輸。

指令文法:

rsync的指令格式可以為以下六種:

rsync [OPTION]… SRC DEST

rsync [OPTION]… SRC [USER@]HOST:DEST

rsync [OPTION]… [USER@]HOST:SRC DEST

rsync [OPTION]… [USER@]HOST::SRC DEST

rsync [OPTION]… SRC [USER@]HOST::DEST

rsync [OPTION]… rsync://[USER@]HOST[:PORT]/SRC [DEST]

對應于以上六種指令格式,我們可以總結rsync有2種不同的工作模式:

shell模式:使用遠端shell程式(如ssh或rsh)進行連接配接。當源路徑或目的路徑的主機名後面包含一個冒号分隔符時使用這種模式,rsync安裝完成後就可以直接使用了,無所謂啟動。(目前沒有嘗試過這個方法)

daemon模式:使用TCP直接連接配接rsync daemon。當源路徑或目的路徑的主機名後面包含兩個冒号,或使用rsync://URL時使用這種模式,無需遠端shell,但必須在一台機器上啟動rsync daemon,預設端口873,這裡可以通過<code>rsync --daemon</code>使用獨立程序的方式,或者通過xinetd超級程序來管理rsync背景程序。

當rsync作為daemon運作時,它需要一個使用者身份。如果你希望啟用chroot,則必須以root的身份來運作daemon,監聽端口,或設定檔案屬主;如果不啟用chroot,也可以不使用root使用者來運作daemon,但該使用者必須對相應的子產品擁有讀寫資料、日志和lock file的權限。當rsync以daemon模式運作時,它還需要一個配置檔案——rsyncd.conf。修改這個配置後不必重新開機rsync daemon,因為每一次的client連接配接都會去重新讀取該檔案。

<a></a>

我們一般把DEST遠端伺服器端成為rsync Server,運作rsync指令的一端SRC稱為Client。

安裝:

rsync在CentOS6上預設已經安裝,如果沒有則可以使用<code>yum install rsync -y</code>,服務端和用戶端是同一個安裝包。

會看到從<code>/root/</code>傳輸檔案到<code>/tmp/rsync_bak/</code>的清單和速率,再運作一次會看到sending incremental file list下沒有複制的内容,可以在/root/下<code>touch</code>某一個檔案再運作看到隻同步了修改過的檔案。

上面需要考慮以下問題:

删除/root/下的檔案不會同步删除/tmp/rsync_bak,除非加入<code>--delete</code>選項

檔案通路時間等屬性、讀寫等權限、檔案内容等有任何變動,都會被認為修改

目标目錄下如果檔案比源目錄還新,則不會同步

源路徑的最後是否有斜杠有不同的含義:有斜杠,隻是複制目錄中的檔案;沒有斜杠的話,不但要複制目錄中的檔案,還要複制目錄本身

在伺服器間rsync傳輸檔案,需要有一個是開着rsync的服務,而這一服務需要兩個配置檔案,說明目前運作的使用者名和使用者組,這個使用者名和使用者組在改變檔案權限和相關内容的時候有用,否則有時候會出現提示權限問題。配置檔案也說明了子產品、子產品化管理服務的安全性,每個子產品的名稱都是自己定義的,可以添加使用者名密碼驗證,也可以驗證IP,設定目錄是否可寫等,不同子產品用于同步不同需求的目錄。

/etc/rsyncd.conf: 

經測試,上述配置檔案每行後面不能使用<code>#</code>來來注釋

/etc/rsyncd.secrets: 

一行一個使用者,使用者名:密碼。請注意這裡的使用者名和密碼與作業系統的使用者名密碼無關,可以随意指定,與<code>/etc/rsyncd.conf</code>中的<code>auth users</code>對應。

修改權限:<code>chmod 600 /etc/rsyncd.d/rsync_server.pwd</code>。

修改<code>/etc/xinetd.d/rsync</code>檔案,disable 改為 no

執行<code>service xinetd restart</code>會一起重新開機rsync背景程序,預設使用配置檔案<code>/etc/rsyncd.conf</code>。也可以使用<code>/usr/bin/rsync --daemon --config=/etc/rsyncd.conf</code>。

為了以防rsync寫入過多的無用日志到<code>/var/log/message</code>(容易塞滿進而錯過重要的資訊),建議注釋掉<code>/etc/xinetd.conf</code>的success:

如果使用了防火牆,要添加允許IP到873端口的規則。

建議關閉<code>selinux</code>,可能會由于強通路控制導緻同步報錯。

單向同步時,用戶端隻需要一個包含密碼的檔案。

/etc/rsync_client.pwd:

chmod 600 /etc/rsync_client.pwd

指令:

将本地<code>/root/</code>目錄同步到遠端172.29.88.223的/tmp/rsync_bak2目錄(module_test指定):

當然你也可以将遠端的/tmp/rsync_bak2目錄同步到本地目錄/root/tmp:

從上面兩個指令可以看到,其實這裡的伺服器與用戶端的概念是很模糊的,rsync daemon都運作在遠端172.29.88.223上,第一條指令是本地主動推送目錄到遠端,遠端伺服器是用來備份的;第二條指令是本地主動向遠端索取檔案,本地伺服器用來備份,也可以認為是本地伺服器恢複的一個過程。

與傳統的cp、tar備份方式相比,rsync具有安全性高、備份迅速、支援增量備份等優點,通過rsync可以解決對實時性要求不高的資料備份需求,例如定期的備份檔案伺服器資料到遠端伺服器,對本地磁盤定期做資料鏡像等。

随着應用系統規模的不斷擴大,對資料的安全性和可靠性也提出的更好的要求,rsync在高端業務系統中也逐漸暴露出了很多不足,首先,rsync同步資料時,需要掃描所有檔案後進行比對,進行差量傳輸。如果檔案數量達到了百萬甚至千萬量級,掃描所有檔案将是非常耗時的。而且正在發生變化的往往是其中很少的一部分,這是非常低效的方式。其次,rsync不能實時的去監測、同步資料,雖然它可以通過crontab方式進行觸發同步,但是兩次觸發動作一定會有時間差,這樣就導緻了服務端和用戶端資料可能出現不一緻,無法在應用故障時完全的恢複資料。基于以上原因,rsync+inotify組合出現了!

inotify是一種強大的、細粒度的、異步的檔案系統事件監控機制,Linux核心從2.6.13開始引入,允許監控程式打開一個獨立檔案描述符,并針對事件集監控一個或者多個檔案,例如打開、關閉、移動/重命名、删除、建立或者改變屬性。

CentOS6自然已經支援:

使用<code>ll /proc/sys/fs/inotify</code>指令,是否有以下三條資訊輸出,如果沒有表示不支援。

<code>/proc/sys/fs/inotify/max_queued_evnets</code>表示調用inotify_init時配置設定給inotify instance中可排隊的event的數目的最大值,超出這個值的事件被丢棄,但會觸發IN_Q_OVERFLOW事件。

<code>/proc/sys/fs/inotify/max_user_instances</code>表示每一個real user ID可建立的inotify instatnces的數量上限。

<code>/proc/sys/fs/inotify/max_user_watches</code>表示每個inotify instatnces可監控的最大目錄數量。如果監控的檔案數目巨大,需要根據情況,适當增加此值的大小。

inotify-tools:

inotify-tools是為linux下inotify檔案監控工具提供的一套C的開發接口庫函數,同時還提供了一系列的指令行工具,這些工具可以用來監控檔案系統的事件。 inotify-tools是用c編寫的,除了要求核心支援inotify外,不依賴于其他。inotify-tools提供兩種工具,一是<code>inotifywait</code>,它是用來監控檔案或目錄的變化,二是<code>inotifywatch</code>,它是用來統計檔案系統通路的次數。

下載下傳inotify-tools-3.14-1.el6.x86_64.rpm,通過rpm包安裝:

監控/root/tmp目錄檔案的變化:

上面的指令表示,持續監聽<code>/root/tmp</code>目錄及其子目錄的檔案變化,監聽事件包括檔案被修改、删除、建立、移動、屬性更改,顯示到螢幕。執行完上面的指令後,在<code>/root/tmp</code>下建立或修改檔案都會有資訊輸出:

這一步的核心其實就是在用戶端建立一個腳本<code>rsync.sh</code>,适用<code>inotifywait</code>監控本地目錄的變化,觸發<code>rsync</code>将變化的檔案傳輸到遠端備份伺服器上。為了更接近實戰,我們要求一部分子目錄不同步,如<code>/root/tmp/log</code>和臨時檔案。

排除不需要同步的檔案或目錄有兩種做法,第一種是inotify監控整個目錄,在rsync中加入排除選項,簡單;第二種是inotify排除部分不監控的目錄,同時rsync中也要加入排除選項,可以減少不必要的網絡帶寬和CPU消耗。我們選擇第二種。

這個操作在用戶端進行,假設<code>/tmp/src/mail/2014/</code>以及<code>/tmp/src/mail/2015/cache/</code>目錄下的所有檔案不用同步,是以不需要監控,<code>/tmp/src/</code>下的其他檔案和目錄都同步。(其實對于打開的臨時檔案,可以不監聽<code>modify</code>時間而改成監聽<code>close_write</code>)

inotifywait排除監控目錄有<code>--exclude &lt;pattern&gt;</code>和<code>--fromfile &lt;file&gt;</code>兩種格式,并且可以同時使用,但主要前者可以用正則,而後者隻能是具體的目錄或檔案。

使用<code>fromfile</code>格式隻能用絕對路徑,不能使用諸如<code>*</code>正規表達式去比對,<code>@</code>表示排除。

如果要排除的格式比較複雜,必須使用正則,那隻能在<code>inotifywait</code>中加入選項,如<code>--exclude '(.*/*\.log|.*/*\.swp)$|^/tmp/src/mail/(2014|201.*/cache.*)'</code>,表示排除/tmp/src/mail/以下的2014目錄,和所有201*目錄下的帶cache的檔案或目錄,以及/tmp/src目錄下所有的以.log或.swp結尾的檔案。

使用inotifywait排除監控目錄的情況下,必須同時使用rsync排除對應的目錄,否則隻要有觸發同步操作,必然會導緻不該同步的目錄也會同步。與inotifywait類似,rsync的同步也有<code>--exclude</code>和<code>--exclude-from</code>兩種寫法。

個人還是習慣将要排除同步的目錄解除安裝單獨的檔案清單裡,便于管理。使用<code>--include-from=FILE</code>時,排除檔案清單用絕對路徑,但FILE裡面的内容請用相對路徑,如:

<code>/etc/rsyncd.d/rsync_exclude.lst</code>:

排除同步的内容包括,mail下的2014目錄,類似2015/201501/20150101/下的臨時或隐藏檔案,等。

下面是一個完整的同步腳本,請根據需要進行裁剪,<code>rsync.sh</code>:

<code>--bwlimit=200</code>用于限制傳輸速率最大200kb,因為在實際應用中發現如果不做速率限制,會導緻巨大的CPU消耗。

在用戶端運作腳本<code># ./rsync.sh</code>即可實時同步目錄。

疑問

對于rsync的同步海量存在一個疑問,假如我的檔案數很多即使在排除不監控和不同步目錄的情況下依然有10萬個檔案,僅檔案清單就達10M,那麼豈不是每一次有檔案産生或修改都會觸發同步,很容易導緻大部分情況下在傳輸檔案清單和進行清單的比對,僅同步一個小檔案而使用的網絡帶寬和CPU代價很高,特别是網絡狀況不佳時,上一次的清單還未傳送完,又有新的檔案産生觸發發送檔案清單。不知道rsync内部有沒有這樣的處理?

參考博文:http://seanlook.com/2014/12/12/rsync_inotify_setup/

     本文轉自1321385590 51CTO部落格,原文連結:http://blog.51cto.com/linux10000/1926957,如需轉載請自行聯系原作者

繼續閱讀