rsynv+inotify触发试实时同步
生活随笔
收集整理的這篇文章主要介紹了
rsynv+inotify触发试实时同步
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、rsync的優點與不足 與傳統的cp、tar備份方式相比,rsync具有安全性高、備份迅速、支持增量備份等優點,通過rsync可以解決對實時性要求不高的數據備份需求,例如定期的備份文件服務器數據到遠端服務器,對本地磁盤定期做數據鏡像等。 隨著應用系統規模的不斷擴大,對數據的安全性和可靠性也提出的更好的要求,rsync在高端業務系統中也逐漸暴露出了很多不足,首先,rsync同步數據時,需要掃描所有文件后進行比對,進行差量傳輸。如果文件數量達到了百萬甚至千萬量級,掃描所有文件將是非常耗時的。而且正在發生變化的往往是其中很少的一部分,這是非常低效的方式。其次,rsync不能實時的去監測、同步數據,雖然它可以通過linux守護進程的方式進行觸發同步,但是兩次觸發動作一定會有時間差,這樣就導致了服務端和客戶端數據可能出現不一致,無法在應用故障時完全的恢復數據。基于以上原因,rsync+inotify組合出現了! 二、 初識inotify Inotify 是一種強大的、細粒度的、異步的文件系統事件監控機制,linux內核從2.6.13起,加入了Inotify支持,通過Inotify可以監控文件系統中添加、刪除,修改、移動等各種細微事件,利用這個內核接口,第三方軟件就可以監控文件系統下文件的各種變化情況,而inotify-tools就是這樣的一個第三方軟件。 在上面章節中,我們講到,rsync可以實現觸發式的文件同步,但是通過crontab守護進程方式進行觸發,同步的數據和實際數據會有差異,而inotify可以監控文件系統的各種變化,當文件有任何變動時,就觸發rsync同步,這樣剛好解決了同步數據的實時性問題。 #####inotify+rsync######## 服務端:192.168.232.128 ? 客戶端:192.168.232.134 發布服務器192.168.232.128 將/www2/data /www2/p_w_picpaths 實時同步到192.168.232.134 ########################## 1.服務端安裝inotify工具inotify-tools 由于inotify特性需要Linux內核的支持,在安裝inotify-tools前要先確認Linux系統內核是否達到了2.6.13以上,如果Linux內核低于2.6.13版本,就需要重新編譯內核加入inotify的支持,也可以用如下方法判斷,內核是否支持inotify: [root@localhost webdata]# uname -r 2.6.18-164.11.1.el5PAE [root@localhost webdata]# ll /proc/sys/fs/inotify 總計 0 -rw-r--r-- 1 root root 0 04-13 19:56 max_queued_events -rw-r--r-- 1 root root 0 04-13 19:56 max_user_instances -rw-r--r-- 1 root root 0 04-13 19:56 max_user_watches 如果有上面三項輸出,表示系統已經默認支持inotify,接著就可以開始安裝inotify-tools了。 可以到http://inotify-tools.sourceforge.net/下載相應的inotify-tools版本,然后開始編譯安裝: 2.安裝inotify #tar zxvf inotify-tools-3.14.tar.gz #cd inotify-tools-3.14 #./configure #make #make install #ll /usr/local/bin/inotifywa* -rwxr-xr-x 1 root root 37264 04-14 13:42 /usr/local/bin/inotifywait -rwxr-xr-x 1 root root 35438 04-14 13:42 /usr/local/bin/inotifywatch 3.客戶端安裝配置 rsync ####Rsync####### ####Stifle###### ####luo.hao##### ####qq:88524498#### #####stifles@126.com##### #vi /etc/rsyncd.conf uid = root gid = root use chroot = no max connections = 200 timeout = 600 pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock log file = /var/log/rsyncd.log [www1] path = /www1/data ignore errors read only = false list = false hosts allow = 192.168.232.0/255.255.255.0 hosts deny = 0.0.0.0/32 auth users = rsync_backup secrets file = /etc/rsync.password [www01] path = /www1/p_w_picpaths ignore errors read only = false list = false hosts allow = 192.168.232.0/255.255.255.0 hosts deny = 0.0.0.0/32 auth users = rsync_backup secrets file = /etc/rsync.password ============================================================= #echo "rsync_backup:654321" >/etc/rsync.password ? //寫入密碼到密碼文件 #chmod 600 /etc/rsync.password ? ? ? ? ? ?//設置密碼文件權限為600讀寫 #cat /etc/rsync.password ? ? ?//查看密碼是否成功寫入密碼文件 #ll /etc/rsync.password ? ? ? //查看密碼文件權限是否為600 #rsync --daemon ? ? ? ? ?//啟動rsync #echo "/usr/bin/rsync --daemon" >>/etc/rc.local ?//將文件寫入自啟動文件中 #cat /etc/rc.local|grep daemon //查看是否成功寫入 #ps -ef|grep rsync ?//顯示現行終端機下的所有程序并過濾出與rsync有關的 #pkill rsync ? ?//結束rsync #rsync --daemon ? ?//啟動rsync ============================================================== 4.服務端: ==================================================================== #echo "654321" >/etc/rsync.password ? ?//將密碼654321寫入密碼文件中 #chmod 600 /etc/rsync.password ? //設置密碼文件權限為600 #cat /etc/rsync.password ? ? ? ?//查看密碼是否成功寫入密碼文件 #ll /etc/rsync.password ? ? ? //查看密碼文件權限是否成功寫入600權限 ==================================================================== 5.配置內容發布節點-----服務端128 #cd /home/shell #vi rsync.sh---------------腳本1(同步/www2/data 目錄) #!/bin/bash src=/www2/data/ dst1=www1 /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib ?$src \ | while read files do /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsync.password $src rsync_backup@192.168.232.134::$dst1 echo "${files} was rsynced" >>/tmp/rsync.log 2>&1 done #vi rsync01.sh--------------------腳本2(同步/www2/p_w_picpaths 目錄) #!/bin/bash src=/www2/p_w_picpaths/ dst1=www01 /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib ?$src \ | while read files do /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsync.password $src rsync_backup@192.168.232.134::$dst1 echo "${files} was rsynced" >>/tmp/rsync.log 2>&1 done 這個腳本的作用就是通過inotify監控文件目錄的變化,進而觸發rsync進行同步操作,由于這個過程是一種主動觸發操作,通過系統內核完成的,所以,比起那些遍歷整個目錄的掃描方式,效率要高很多。 有時會遇到這樣的情況:向inotify監控的目錄(這里是/web/wwwroot/)寫入一個很大文件時,由于寫入這個大文件需要一段時間,此時inotify就會持續不停的輸出該文件被更新的信息, 這樣就會持續不停的觸發rsync去執行同步操作,占用了大量系統資源,那么針對這種情況,最理想的做法是等待文件寫完后再去觸發rsync同步。 在這種情況下,可以修改inotify的監控事件,即:“-e close_write,delete,create,attrib”。 接著,將這個腳本命名為rsync.sh,放到/www2目錄下,然后給定可執行權限,放到后臺運行: chmod 755 /www2/rsync.sh /www2/rsync.sh & 最后,將此腳本加入系統自啟動文件: echo ?“/www2/rsync.sh &”>>/etc/rc.local 這樣就完成了內容發布節點的所有配置工作。 6.測試rsync+inotify實時同步功能 服務端128: #cd /www2/data [root@CentOS5 data]# ll total 0 [root@CentOS5 data]# touch 2 [root@CentOS5 data]# building file list ...? 2 files to consider building file list ...? 2 files to consider ./ 2 0 100% ? ?0.00kB/s ? ?0:00:00 (xfer#1, to-check=0/2) 2 0 100% ? ?0.00kB/s ? ?0:00:00 (xfer#1, to-check=0/2) sent 100 bytes ?received 44 bytes ?288.00 bytes/sec total size is 0 ?speedup is 0.00 sent 94 bytes ?received 38 bytes ?264.00 bytes/sec total size is 0 ?speedup is 0.00 building file list ...? 2 files to consider building file list ...? 2 files to consider sent 55 bytes ?received 16 bytes ?142.00 bytes/sec total size is 0 ?speedup is 0.00 sent 55 bytes ?received 16 bytes ?142.00 bytes/sec total size is 0 ?speedup is 0.00 [root@CentOS5 data]# ll total 0 -rw-r--r-- 1 root root 0 Jul 27 14:29 2 [root@CentOS5 data]#? 查看客戶端134: [root@CentOS5 www1]# ll /www1/data/ total 0 -rw-r--r-- 1 root root 0 Jul 27 14:29 2 [root@CentOS5 www1]#? 至此完成服務器的實時同步 注1:#vi /etc/rsyncd.conf uid = root gid = root 需使用root用戶,不然報錯,用戶權限拒絕
轉載于:https://blog.51cto.com/stifle/672160
總結
以上是生活随笔為你收集整理的rsynv+inotify触发试实时同步的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 德州陵城区教师招聘体检在哪个医院
- 下一篇: H.264宣布永远不会对使用者收费