linux 利用rsync實現檔案增量同步

studywell發表於2018-03-08
linux 利用rsync實現檔案增量同步


介紹兩種方法:
利用inotify+rsync實現linux檔案批次更新
rsync配合crontab的使用
===========================================================
利用inotify+rsync實現linux檔案批次更新
http://blog.51cto.com/kerry/734087


Inotify一種強大的、細粒度的、非同步檔案系統監控機制,它滿足各種各樣的檔案監控需要,可以監控檔案系統的訪問屬性、讀寫屬性、許可權屬性、刪除建立、移動等操作,也就是可以監控檔案發生的一切變化。。


inotify-tools是一個C庫和一組命令列的工作提供Linux下inotify的簡單介面。inotify-tools安裝後會得到inotifywait和inotifywatch這兩條命令:


inotifywait命令可以用來收集有關檔案訪問資訊,Linux發行版一般沒有包括這個命令,需要安裝inotify-tools,這個命令還需要將inotify支援編譯入Linux核心,好在大多數Linux發行版都在核心中啟用了inotify。
inotifywatch命令用於收集關於被監視的檔案系統的統計資料,包括每個 inotify 事件發生多少次。








一、系統環境:
更新源伺服器:192.0.2.20
目的伺服器:192.0.2.21  


二、目的伺服器配置:192.0.2.21 (rsync服務端):
1、檢查rsync是否安裝
rpm -qa|grep rsync 


2、定義rsync配置檔案/etc/rsyncd.conf
192.0.2.21:


cat >> /etc/rsyncd.conf << EOF 
uid = root   
gid = root   
use chroot = no 
max connections = 100   
timeout = 600   
pid file = /var/run/rsyncd.pid    
lock file = /var/run/rsyncd.lock    
log file = /var/log/rsyncd.log    
[web1]   
path = /data/www1/    
ignore errors    
read only = no   
list = no   
hosts allow = 192.0.2.0/255.255.255.0    
auth users = root   
secrets file = /etc/www1.pwd   




3、rsyncd.conf配置檔案詳解
uid = nobody      //執行RSYNC守護程式的使用者
gid = nobody      //執行RSYNC守護程式的組
use chroot = 0    //不使用chroot
max connections = 0   // 最大連線數,0為不限制
port = 873  //預設埠873


下面這些檔案是安裝完RSYNC服務後自動生成的檔案
pid file = /var/run/rsyncd.pid    //pid檔案的存放位置
lock file = /var/run/rsync.lock   //鎖檔案的存放位置.指定支援max connections引數的鎖檔案,預設值是/var/run/rsyncd.lock.
log file = /var/log/rsyncd.log    //日誌記錄檔案的存放位置


Timeout = 300
透過該選項可以覆蓋客戶指定的IP超時時間.透過該選項可以確保rsync伺服器不會永遠等待一個崩潰的客戶端.超時單位為秒鐘,0表示沒有超時定義,這也是預設值.對於匿名rsync伺服器來說,一個理想的數字是600.


Log format = %t %a %m %f %b
透過該選項使用者在使用transfer logging可以自己定製日誌檔案的欄位.其格式是一個包含格式定義符的字串,可以使用的格式定義符如下所示:
%h 遠端主機名
%a 遠端IP地址
%l 檔案長度字元數
%p 該次rsync會話的程式id
%o 操作型別:" send" 或" recv"
%f 檔名
%P 模組路徑
%m 模組名
%t 當前時間
%u 認證的使用者名稱(匿名時是null)
%b 實際傳輸的位元組數
%c 當傳送檔案時,該欄位記錄該檔案的校驗碼
預設log格式為:" %o %h [%a] %m (%u) %f %l" ,一般來說,在每行的頭上會新增" %t [%p] " .在原始碼中同時釋出有一個叫rsyncstats的perl指令碼程式來統計這種格式的日誌檔案.


#transfer logging = yes
使rsync伺服器使用ftp格式的檔案來記錄下載和上載操作在自己單獨的日誌中.


syslog facility = local3 
指定rsync傳送日誌訊息給syslog時的訊息級別,常見的訊息級別是:uth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, sys-log, user, uucp, local0, local1, local2, local3,local4, local5, local6和local7.預設值是daemon.


模組引數
[web1]   //這裡是認證的模組名,在client端需要指定
path = /data/www1/  //需要做映象的目錄,不可缺少!
comment = backup web  //這個模組的註釋資訊
ignore errors    //可以忽略一些無關的IO錯誤
read only = yes  //該選項設定是否允許客戶上載檔案.如果為true那麼任何上載請求都會失敗,如果為false並且伺服器目錄讀寫許可權允許那麼上載是允許的.預設值為true.
list = no        //不允許列檔案
auth users = bak    //認證的使用者名稱,如果沒有這行則表明是匿名,此使用者與系統無關
該選項指定由空格或逗號分隔的使用者名稱列表,只有這些使用者才允許連線該模組.這裡的使用者和系統使用者沒有任何關係.如果" auth users" 被設定,那麼客戶端發出對該模組的連線請求以後會被rsync請求challenged進行驗證身份這裡使用的challenge/response認證協議.使用者的名和密碼以明文方式存放在" secrets file" 選項指定的檔案中.預設情況下無需密碼就可以連線模組(也就是匿名方式).


secrets file = /etc/www1.pwd      //密碼和使用者名稱對比表,密碼檔案自己生成
該選項指定一個包含定義使用者名稱:密碼對的檔案.只有在" auth users" 被定義時,該檔案才有作用.檔案每行包含一個username:passwd對.一般來說密碼最好不要超過8個字元.沒有預設的secures file名,需要限式指定一個(例如:/etc/www1.pwd).注意:該檔案的許可權一定要是600,否則客戶端將不能連線伺服器.


hosts allow = 192.168.9.0/255.255.255.0  //允許主機或網段
該選項指定哪些IP的客戶允許連線該模組.客戶模式定義可以是以下形式:
單個IP地址,例如:192.0.2.20
整個網段,例如:192.168.9.0/24,也可以是192.168.9.0/255.255.255.0
多個IP或網段需要用空格隔開,“*”則表示所有,預設是允許所有主機連線.


hosts deny = 0.0.0.0/0  //禁止主機


4、建立認證檔案/etc/www1.pwd ,此檔案須與配置檔案中指定檔名保持一致
此處格式為:username:password,安全問題,並不建議實際使用中使用root使用者
192.0.2.21:
# echo "root:root" >> /etc/www1.pwd 


並且我們需要設定此檔案的許可權為600


chmod 600 /etc/www1.pwd  
chmod 600 /etc/rsyncd.conf 


5、建立motd檔案(可有可無)
rsyncd.motd記錄了rsync服務的歡迎資訊,你可以在其中輸入任何文字資訊,如:


echo "Welcome to use the rsync services! " >> /var/rsyncd.motd 


6、啟動rsync


/usr/bin/rsync --daemon  


停止
# /etc/init.d/rsyncd stop






新增到自動啟動 
echo "/usr/bin/rsync --daemon" >> /etc/rc.local 


三、更新源伺服器配置:192.0.2.20 (rsync客戶端)


1、inotify 可以監視的檔案系統事件包括:
IN_ACCESS,即檔案被訪問
IN_MODIFY,檔案被 write
IN_ATTRIB,檔案屬性被修改,如 chmod、chown、touch 等
IN_CLOSE_WRITE,可寫檔案被 close
IN_CLOSE_NOWRITE,不可寫檔案被 close
IN_OPEN,檔案被 open
IN_MOVED_FROM,檔案被移走,如 mv
IN_MOVED_TO,檔案被移來,如 mv、cp
IN_CREATE,建立新檔案
IN_DELETE,檔案被刪除,如 rm
IN_DELETE_SELF,自刪除,即一個可執行檔案在執行時刪除自己
IN_MOVE_SELF,自移動,即一個可執行檔案在執行時移動自己
IN_UNMOUNT,宿主檔案系統被 umount
IN_CLOSE,檔案被關閉,等同於(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
IN_MOVE,檔案被移動,等同於(IN_MOVED_FROM | IN_MOVED_TO)
注:上面所說的檔案也包括目錄。




2、更新源伺服器安裝inotify-tools
在安裝inotify-tools前請先確認你的linux核心是否打到了2.6.13,並且在編譯時開啟了CONFIG_INOTIFY選項,也可以透過以下命令檢測


ls /proc/sys/fs/inotify 


如果有 max_queued_events,max_user_instances,max_user_watches 三項就說明支援


下載軟體:3.14 是2010最後一個版本
wget
tar xvf inotify-tools-3.14.tar.gz  
mv inotify-tools-3.14 /opt/
cd /opt/inotify-tools-3.14/
./configure  
make;make install 




安裝inotify-tools後會在相關安裝目錄下生成如下兩個檔案:
ll /usr/local/bin/
-rwxr-xr-x 1 root root 44327 Oct 10 15:32 inotifywait
-rwxr-xr-x 1 root root 41417 Oct 10 15:32 inotifywatch
則表示安裝成功。




注意: 在 源伺服器上需要安裝,目標伺服器上不需要安裝inotify。


3、編寫rsync監控指令碼
vi /root/rsync.sh 


#!/bin/bash  
host1=192.0.2.21
src=/data/www/
des1=web1
user1=root


/usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format  '%T %w%f' -e modify,delete,create,attrib ${src} | while read file  
        do
                rsync -avzP --delete --progress ${src} ${user1}@${host1}::${des1} --password-file=/etc/www1.pwd &&
                echo "${file} was rsynced" >> /tmp/rsync.log 2>&1
                echo "---------------------------------------------------------------------------"  
        done


引數介紹:        
-m, 即--monitor,表示始終保持事件監聽狀態。
-r, 即--recursive,表示遞迴查詢目錄。
-q, 即--quiet,表示列印出監控事件。
-e, 即--event,透過此引數可以指定要監控的事件,常見的事件有modify、delete、create、attrib等
--timefmt:指定時間的輸出格式
--format:指定變化檔案的詳細資訊




建立認證檔案  (rsync客戶端認證檔案只用加入密碼)


echo "root" >> /etc/www1.pwd  
chmod 600 /etc/www1.pwd  
/bin/sh -n /root/rsync.sh  //語法檢查  
chmod +x /root/rsync.sh  


啟動
/root/rsync.sh
出現這個錯誤“/usr/local/bin/inotifywait: error while loading shared libraries: libinotifytools.so.0”


解決方法:
32位系統:ln -s /usr/local/lib/libinotifytools.so.0 /usr/lib/libinotifytools.so.0
64位系統:ln -s /usr/local/lib/libinotifytools.so.0 /usr/lib64/libinotifytools.so.0




放後臺
nohup sh /root/rsync.sh &  


設定自動啟動
echo "nohup sh /root/rsync.sh &" >> /etc/rc.local 






四、同步測試
在更新源伺服器上新建一個檔案,執行以下的命令,看檔案是否可以正常同步,看有無報錯資訊


rsync -avzP --delete --progress /data/www/ root@192.0.2.21::web1 --password-file=/etc/www1.pwd
 
將要更新的檔案提交到更新源伺服器中,這樣就透過inotify+rsync批次的將更新檔案同步到所有的目的伺服器中,相當方便快捷






五、inotify相關引數
inotify定義了下列的介面引數,可以用來限制inotify消耗kernel memory的大小。由於這些引數都是記憶體引數,因此,可以根據應用需求,實時的調節其大小:


/proc/sys/fs/inotify/max_queued_evnets表示呼叫inotify_init時分配給inotify instance中可排隊的event的數目的最大值,超出這個值的事件被丟棄,但會觸發IN_Q_OVERFLOW事件。
/proc/sys/fs/inotify/max_user_instances表示每一個real user ID可建立的inotify instatnces的數量上限。
/proc/sys/fs/inotify/max_user_watches表示每個inotify instatnces可監控的最大目錄數量。如果監控的檔案數目巨大,需要根據情況,適當增加此值的大小。


根據以上在32位或者64位系統都可以執行:


echo 104857600 > /proc/sys/fs/inotify/max_user_watches
echo 'echo 104857600 > /proc/sys/fs/inotify/max_user_watches' >> /etc/rc.local




http://blog.chinaunix.net/uid-25150840-id-5767502.html
==========================================================================
rsync配合crontab的使用
1安裝
檢查rsync是否安裝
沒安裝的要安裝




兩個伺服器:
192.0.2.20 源伺服器  有目錄 /upload
192.0.2.21 目標伺服器  有目錄 /upload




2建立rsyncd.conf檔案
伺服器端建立rsyncd.conf檔案


#vi /etc/rsyncd.conf
#[global]
uid = root
gid = root
use chroot = no
max connections = 10
list = yes
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log
hosts allow = 192.0.2.21 
#允許訪問的IP,就是客戶端ip
[data] 
#指定釋出名,在客戶端呼叫rsync的時候需要用這個
path = /upload 
#釋出的路徑,就是你要備份下來的目錄,這個目錄會被備份到客戶端
read only = no
ignore errors
auth users = root 
#認證使用者為root
secrets file = /etc/sery.pass 
#密碼檔案


儲存退出
//啟動rsync服務端
# rsync --daemon --config=/etc/rsyncd.conf


3密碼
生成客戶端和服務端密碼檔案


客戶端:
# vi /etc/sery_client.pass 
123456


# chmod 600 /etc/sery_client.pass


服務端:
#注意。伺服器端有使用者名稱,客戶端之後密碼,許可權都是600,還有前面的conf檔案也是
# vi /etc/sery.pass
root:123456 
# chmod 600 /etc/sery.pass


4啟動rsync
伺服器端啟動
# rsync --daemon --config=/etc/rsyncd.conf


5檢視監聽狀態
也是伺服器端
# lsof -i:873
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rsync   15187 root    4u  IPv4  83885      0t0  TCP *:rsync (LISTEN)
rsync   15187 root    5u  IPv6  83886      0t0  TCP *:rsync (LISTEN)


# netstat -antp |grep rsync
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      15187/rsync         
tcp        0      0 :::873                  :::*                    LISTEN      15187/rsync         




6將rsync寫進服務端自啟動


還是伺服器端
# echo "/usr/bin/rsync --daemon --config=/etc/rsyncd.conf" >>/etc/rc.local


7測試同步
客戶端執行
# rsync -avzP --delete root@192.0.2.20::data /upload --password-file=/etc/sery_client.pass


1. –a 使用archive模式,保持原有的檔案許可權
2. –v顯示到螢幕上
3. –z傳輸時壓縮資料
4. –P傳輸進度
5. --delete是指如果伺服器端刪除了這一檔案,那麼客戶端也相應把檔案刪除,保持真正的一致
6. data就是之前說的那個釋出名,/root/test客戶端本地存放路徑
7. –password-file 指定密碼檔案


如需同步硬連結,加-H




8 客戶端配置計劃排程任務crontab
 在客戶端上寫進crontab
#vi /root/rsyncd.sh
#!/bin/bash
rsync –avzP –-delete root@192.168.1.64::data /root/test/data –-password-file=/etc/sery_client.pass
#wq


檢視是否正常同步。


測試以下專案,同步正常:
建立檔案
修改檔案
刪除檔案
建立資料夾
資料夾中建立檔案




9/其他
(1)是客戶端和伺服器端連線時也可以使用ssh連結不用password的方法
自動ssh/scp方法==
A為本地主機(即用於控制其他主機的機器) ;192.0.2.21
B為遠端主機(即被控制的機器Server),192.0.2.20


A和B的系統都是Linux
在A上執行命令:
# ssh-keygen -t rsa (連續三次回車,即在本地生成了公鑰和私鑰,不設定密碼)
# ssh root@192.0.2.20 "mkdir .ssh" (需要輸入密碼)
# scp ~/.ssh/id_rsa.pub root@192.0.2.20:.ssh/id_rsa.pub (需要輸入密碼)


在B上的命令:
# touch /root/.ssh/authorized_keys (如果已經存在這個檔案, 跳過這條)
# cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys (將id_rsa.pub的內容追加到authorized_keys 中)


回到A機器:
# ssh root@192.0.2.20 (不需要密碼, 登入成功) 




更簡單的方法
開啟終端執行ssh-keygen,該命令會在~/.ssh/目錄下建立id_rsa、id_rsa.pub兩個檔案,分別為公鑰和私鑰。
將公鑰複製到伺服器的~/.ssh/authorized_keys檔案中就可以了。方法如下:
cat ~/.ssh/id_rsa.pub | ssh -p 22 root@host ‘cat >> ~/.ssh/authorized_keys’,


=====================================================================================================================
三/關於rsync的命令


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有六種不同的工作模式:
  1)複製本地檔案。當SRC和DES路徑資訊都不包含有單個冒號":"分隔符時就啟動這種工作模式。如:rsync -a /data /backup
  2)使用一個遠端shell程式(如rsh、ssh)來實現將本地機器的內容複製到遠端機器。當DST路徑地址包含單個冒號":"分隔符時啟動該模式。如:rsync -avz *.c foo:src
  3)使用一個遠端shell程式(如rsh、ssh)來實現將遠端機器的內容複製到本地機器。當SRC地址路徑包含單個冒號":"分隔符時啟動該模式。如:rsync -avz foo:src/bar /data
  4)從遠端rsync伺服器中複製檔案到本地機。當SRC路徑資訊包含"::"分隔符時啟動該模式。如:rsync -av root@172.16.78.192::www /databack
  5)從本地機器複製檔案到遠端rsync伺服器中。當DST路徑資訊包含"::"分隔符時啟動該模式。如:rsync -av /databack root@172.16.78.192::www
  6)列遠端機的檔案列表。這類似於rsync傳輸,不過只要在命令中省略掉本地機資訊即可。如:rsync -v rsync://172.16.78.192/www


rsync引數的具體解釋如下:
-v, --verbose 詳細模式輸出
-q, --quiet 精簡輸出模式
-c, --checksum 開啟校驗開關,強制對檔案傳輸進行校驗
-a, --archive 歸檔模式,表示以遞迴方式傳輸檔案,並保持所有檔案屬性,等於-rlptgoD
-r, --recursive 對子目錄以遞迴模式處理
-R, --relative 使用相對路徑資訊
-b, --backup 建立備份,也就是對於目的已經存在有同樣的檔名時,將老的檔案重新命名為~filename。可以使用--suffix選項來指定不同的備份檔案字首。
--backup-dir 將備份檔案(如~filename)存放在在目錄下。
-suffix=SUFFIX 定義備份檔案字首
-u, --update 僅僅進行更新,也就是跳過所有已經存在於DST,並且檔案時間晚於要備份的檔案。(不覆蓋更新的檔案)
-l, --links 保留軟鏈結
-L, --copy-links 想對待常規檔案一樣處理軟鏈結
--copy-unsafe-links 僅僅複製指向SRC路徑目錄樹以外的鏈結
--safe-links 忽略指向SRC路徑目錄樹以外的鏈結
-H, --hard-links 保留硬鏈結
-p, --perms 保持檔案許可權
-o, --owner 保持檔案屬主資訊
-g, --group 保持檔案屬組資訊
-D, --devices 保持裝置檔案資訊
-t, --times 保持檔案時間資訊
-S, --sparse 對稀疏檔案進行特殊處理以節省DST的空間
-n, --dry-run現實哪些檔案將被傳輸
-W, --whole-file 複製檔案,不進行增量檢測
-x, --one-file-system 不要跨越檔案系統邊界
-B, --block-size=SIZE 檢驗演算法使用的塊尺寸,預設是700位元組
-e, --rsh=COMMAND 指定使用rsh、ssh方式進行資料同步
--rsync-path=PATH 指定遠端伺服器上的rsync命令所在路徑資訊
-C, --cvs-exclude 使用和CVS一樣的方法自動忽略檔案,用來排除那些不希望傳輸的檔案
--existing 僅僅更新那些已經存在於DST的檔案,而不備份那些新建立的檔案
--delete 刪除那些DST中SRC沒有的檔案
--delete-excluded 同樣刪除接收端那些被該選項指定排除的檔案
--delete-after 傳輸結束以後再刪除
--ignore-errors 及時出現IO錯誤也進行刪除
--max-delete=NUM 最多刪除NUM個檔案
--partial 保留那些因故沒有完全傳輸的檔案,以是加快隨後的再次傳輸
--force 強制刪除目錄,即使不為空
--numeric-ids 不將數字的使用者和組ID匹配為使用者名稱和組名
--timeout=TIME IP超時時間,單位為秒
-I, --ignore-times 不跳過那些有同樣的時間和長度的檔案
--size-only 當決定是否要備份檔案時,僅僅察看檔案大小而不考慮檔案時間
--modify-window=NUM 決定檔案是否時間相同時使用的時間戳視窗,預設為0
-T --temp-dir=DIR 在DIR中建立臨時檔案
--compare-dest=DIR 同樣比較DIR中的檔案來決定是否需要備份
-P 等同於 --partial
--progress 顯示備份過程
-z, --compress 對備份的檔案在傳輸時進行壓縮處理
--exclude=PATTERN 指定排除不需要傳輸的檔案模式
--include=PATTERN 指定不排除而需要傳輸的檔案模式
--exclude-from=FILE 排除FILE中指定模式的檔案
--include-from=FILE 不排除FILE指定模式匹配的檔案
--version 列印版本資訊
--address 繫結到特定的地址
--config=FILE 指定其他的配置檔案,不使用預設的rsyncd.conf檔案
--port=PORT 指定其他的rsync服務埠
--blocking-io 對遠端shell使用阻塞IO
-stats 給出某些檔案的傳輸狀態
--progress 在傳輸時現實傳輸過程
--log-format=formAT 指定日誌檔案格式
--password-file=FILE 從FILE中得到密碼
--bwlimit=KBPS 限制I/O頻寬,KBytes per second
-h, --help 顯示幫助資訊 





來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29519108/viewspace-2151647/,如需轉載,請註明出處,否則將追究法律責任。

相關文章