rsync+inotify實(shí)現(xiàn)服務(wù)器之間文件實(shí)時(shí)同步

這里參考這篇文章:http://blog.csdn.net/linuxlsq/article/details/51768731,
以及這篇文章:http://blog.51cto.com/dl528888/771533
特別感謝!


主服務(wù)器(server端)

其中主服務(wù)器需要安裝rsync與inotify,主服務(wù)器作為server,向備份服務(wù)器client傳輸文件

  • 安裝rsync
[root@nginx ~]# cd /usr/src/  
[root@nginx src]# ll  
total 16  
drwxr-xr-x 2 root root 4096 Jan 26  2010 debug  
drwxr-xr-x 2 root root 4096 Jan 26  2010 kernels  
[root@nginx src]# wget  http://rsync.samba.org/ftp/rsync/src/rsync-3.0.9.tar.gz  
[root@nginx src]# tar zxvf rsync-3.0.9.tar.gz  
[root@nginx src]# cd rsync-3.0.9  
[root@nginx rsync-3.0.9]# ./configure --prefix=/usr/local/rsync  
[root@nginx rsync-3.0.9]# make  
[root@nginx rsync-3.0.9]# make install  

如果網(wǎng)站鏈接已經(jīng)過(guò)期,可以在Linux上自行wget下載.tar.gz文件,
也可以可以自行到http://download.csdn.net/下載指定的資源到windows上,
再通過(guò)secureCRT傳到Linux上,這里需要

yum -y install lrzsz,
從服務(wù)端發(fā)送文件到客戶(hù)端:sz filename ,下載的路徑在CRT的Options>>Session Options>>X/Y/Zmodem
從客戶(hù)端上傳文件到服務(wù)端:rz,上傳路徑在服務(wù)器當(dāng)前路徑

或者由其他的Linux主機(jī)上SCP傳到當(dāng)前Linux主機(jī)上,命令格式

scp local_file remote_username@remote_ip:remote_folder 
scp local_file remote_username@remote_ip:remote_file 
scp local_file remote_ip:remote_folder 
scp local_file remote_ip:remote_file 
  • 建立密碼認(rèn)證文件
[root@nginx rsync-3.0.9]# cd /usr/local/rsync/  
[root@nginx rsync]# echo "rsync-pwd" >/usr/local/rsync/rsync.passwd   

其中rsync-pwd為密碼,rsync.passwd文件即為密碼文件,密碼和密碼文件的名字都可以自行設(shè)置

無(wú)論是為了安全,還是為了避免出現(xiàn)以下錯(cuò)誤,密碼文件都需要給600權(quán)限

[root@nginx rsync]# chmod 600 rsync.passwd  
  • 安裝inotify
[root@nginx rsync]# cd /usr/src/  
[root@nginx src]# wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz  
[root@nginx src]# tar zxvf inotify-tools-3.14.tar.gz  
[root@nginx src]# cd inotify-tools-3.14  
[root@nginx inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify  
[root@nginx inotify-tools-3.14]# make  
[root@nginx inotify-tools-3.14]# make install  
  • 創(chuàng)建rsync復(fù)制腳本

此項(xiàng)功能主要是將server端的目錄/tmp/test里的內(nèi)容,如果修改了(無(wú)論是添加、修改、刪除文件)能夠通過(guò)inotify監(jiān)控到,并通過(guò)rsync實(shí)時(shí)的同步給client的/tmp里,這樣,client的/tmp里也同樣有一個(gè)/tmp/test目錄。
其中host是client的ip,src是server端要實(shí)時(shí)監(jiān)控的目錄,
des是認(rèn)證的模塊名,需要與client一致(des不是客戶(hù)端的目錄,客戶(hù)端的目錄會(huì)在客戶(hù)端配置文件的[web]模塊里面指定),
user是建立密碼文件里的認(rèn)證用戶(hù)(也在[web]模塊里指定)

#!/bin/bash  
host=10.10.10.10
src=/tmp/test         
des=web 
user=root 
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src \
| while read file
do 
    /usr/local/rsync/bin/rsync -vzrtopg --delete --progress --password-file=/usr/local/rsync/rsync.passwd $src $user@$host::$des 0</dev/null 1>/dev/null 2>&1 
    echo "${file} was rsynced" >>/root/rsync.log 2>&1  
done

如果把rsync.log的放到tmp(備份的目錄)或發(fā)送一直復(fù)制的問(wèn)題,所以建議各位把rsync的日志放到其他的目錄下(非備份目錄),例如這里的/root/rsync.log
把這個(gè)腳本命名為rsync.sh,放到監(jiān)控的目錄里,比如我的就放到/tmp下面,并給予764權(quán)限,然后運(yùn)行這個(gè)腳本

[root@nginx tmp]# chmod 764 rsync.sh 
[root@nginx tmp]# sh /tmp/rsync.sh & 
  • 我們還可以把rsync.sh腳本加入到開(kāi)機(jī)啟動(dòng)項(xiàng)里
[root@nginx tmp]# echo "/tmp/rsync.sh" >> /etc/rc.local

但是這里可能會(huì)因?yàn)槲覀兺顺鰐ty而造成這個(gè)后臺(tái)任務(wù)中斷,可以采用這里的方法:https://www.ibm.com/developerworks/cn/linux/l-cn-nohup/

[root@nginx tmp]# (/tmp/rsync.sh >/dev/null 2>&1 &)

這樣這個(gè)后臺(tái)任務(wù)的PPID就為1了,和crond一樣

[root@nginx tmp]# ps -ef |grep crond
root      38533      1  0 Dec04 ?        00:00:01 crond
[root@nginx tmp]# ps -ef |grep rsync
root      45117      1  0 18:07 pts/1    00:00:00 /bin/bash /tmp/rsync.sh
root      45119  45117  0 18:07 pts/1    00:00:00 /bin/bash /tmp/rsync.sh

請(qǐng)記住,只有在備份服務(wù)器client端的rsync安裝并啟動(dòng)rsync之后,再啟動(dòng)rsync.sh腳本,否則有時(shí)候會(huì)滿(mǎn)屏出現(xiàn):

rsync: failed to connect to 192.168.10.221: Connection refused (111)  
rsync error: error in socket IO (code 10) at clientserver.c(107) [sender=2.6.8]  

備份服務(wù)器(client)

  • 安裝rsync(備份服務(wù)器只安裝rsync)
[root@nginx-backup ~]# cd /usr/src/  
[root@nginx-backup src]# ll  
total 16  
drwxr-xr-x 2 root root 4096 Jan 26  2010 debug  
drwxr-xr-x 2 root root 4096 Jan 26  2010 kernels  
[root@nginx-backup src]# wget  http://rsync.samba.org/ftp/rsync/src/rsync-3.0.9.tar.gz  
[root@nginx-backup src]# tar zxvf rsync-3.0.9.tar.gz  
[root@nginx-backup src]# cd rsync-3.0.9  
[root@nginx-backup rsync-3.0.9]# ./configure --prefix=/usr/local/rsync  
[root@nginx-backup rsync-3.0.9]# make  
[root@nginx-backup rsync-3.0.9]# make install  
  • 建立用戶(hù)與密碼認(rèn)證文件
[root@nginx-backup rsync-3.0.9]# echo "root:rsync-pwd" > /usr/local/rsync/rsync.passwd 
[root@nginx-backup rsync]# chmod 600 rsync.passwd 

請(qǐng)記住,在server端建立的密碼文件,只有密碼,沒(méi)有用戶(hù)名;而在備份服務(wù)端client里建立的密碼文件,用戶(hù)名與密碼都有(用戶(hù)名要和[web]模塊里面一致,密碼要和服務(wù)器端腳本中的密碼一致)

  • 建立rsync配置文件
uid = root 
gid = root 
use chroot = no 
max connections = 10 
strict modes = yes 
pid file = /var/run/rsyncd.pid  
lock file = /var/run/rsync.lock  
log file = /var/log/rsyncd.log  
[web]  
path = /tmp/  
comment = web file  
ignore errors  
read only = no 
write only = no 
hosts allow = 10.10.10.10 
hosts deny = *  
list = false 
uid = root 
gid = root 
auth users = root 
secrets file = /usr/local/rsync/rsync.passwd

這里的path = /tmp/就是指目的目錄,服務(wù)器的文件會(huì)備份到客戶(hù)端的這個(gè)目錄里,
hosts allow = 10.10.10.10 ,這里的hosts allow就是你服務(wù)器的IP地址,
auth users = root ,這里的root就是上一步
echo "root:rsync-pwd" > /usr/local/rsync/rsync.passwd 中的root,
[web]是server服務(wù)端里的認(rèn)證模塊名稱(chēng),需要與主服務(wù)器里的一致,以上的配置為我的自己服務(wù)器里的配置,以供參考。
把配置文件命名為rsync.conf,放到/usr/local/rsync/目錄里

  • 啟動(dòng)rsync
[root@nginx-backup rsync]# /usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync.conf 

如果出現(xiàn)以下問(wèn)題:

/usr/local/rsync/bin/rsync: error while loading shared libraries: libiconv.so.2: cannot open shared object file:
No such file or directory, 

是因?yàn)閯?dòng)態(tài)函數(shù)庫(kù)沒(méi)有加載到內(nèi)存當(dāng)中,可以采用下面方法解決

[root@nginx-backup rsync]# whereis libiconv.so.2  
libiconv.so: /usr/local/lib/libiconv.so.2 /usr/local/lib/libiconv.so  

找到所需模塊所在的目錄,然后把此目錄添加到/etc/ld.so.conf里,并更新庫(kù)文件

[root@nginx-backup rsync]# echo "/usr/local/lib/" >> /etc/ld.so.conf  
 [root@nginx-backup rsync]# ldconfig  
  • 我們可以把rsync腳本加入到開(kāi)機(jī)啟動(dòng)項(xiàng)里
[root@nginx-backup rsync]# echo "/usr/local/rsync/bin/rsync --daemon --config=/usr/local/rsync/rsync.conf" >> /etc/rc.local 
  • BTW:在rsync+inotify這種備份方法的時(shí)候,遇到了一個(gè)問(wèn)題,那就是主服務(wù)已經(jīng)給備用服務(wù)同步完數(shù)據(jù)了,但主服務(wù)器磁盤(pán)看見(jiàn)滿(mǎn)了,需要把已經(jīng)備份的文件刪除,但同時(shí)在備份服務(wù)器里保留主服務(wù)器里的文件,
    也就是說(shuō)主服務(wù)器里刪除文件的時(shí)候,備份服務(wù)器里不跟著刪除文件,我查看了很多英文文檔,測(cè)試了很多遍,最后找到了一個(gè)解決方法,那就是在主服務(wù)器里,把rsync.sh這個(gè)腳本里第9行的--delete參數(shù)給去掉,就可以解決這個(gè)問(wèn)題。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容