linux 利用rsync實現檔案增量同步
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 顯示幫助資訊
介紹兩種方法:
利用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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux 檔案同步工具之 rsyncLinux
- rsync檔案同步工具常見模式有哪些?linux運維學模式Linux運維
- rsync同步和備份檔案到本地
- rsync實時同步
- 在Linux中,rsync 同步資料時,如何過濾出所有.txt的檔案不同步?Linux
- kettle 實現mysql單表增量同步MySql
- 利用pearcmd實現裸檔案包含
- rsync+inotify實時同步
- 小白都會的rsync遠端同步原理及-------(定期同步與rsync+inotify實時同步)實驗
- CentOS7 下使用 rsync+sersync 配置檔案自動同步CentOS
- Linux-檔案寫入和檔案同步Linux
- 基於rsync實現海量檔案高速傳輸的解決方案
- 檔案伺服器rsync伺服器
- Linux檔案系統的實現Linux
- Linux之rsync同步分發指令碼編寫.Linux指令碼
- rsync 守護程式及實時同步
- rsync命令快速刪大檔案
- rsync 同步目錄
- 資料同步rsync
- Rsync資料同步
- rsync遠端同步
- rsync+inotify資料的實時同步
- rsync+inotify實現實時同步(小業務場景解決方案)
- 利用訊號量semaphore實現兩個程式讀寫同步 Linux CLinux
- 資料同步——rsync遠端同步
- MySQL Binlog 增量同步工具 go-mysql-transfer 實現詳解MySqlGo
- RestCloud ETL實踐之無標識位實現增量資料同步RESTCloud
- Linux中利用csvquote處理csv檔案Linux
- 實現手機和PC檔案同步 GitLab和TermuxGitlabUX
- 檔案共享服務之實時備份(inotify+rsync)
- lvs 負載均衡兩臺Discuz+rsync+innotify實現資料同步負載
- 資料庫系列——基於Canal實現MySQL增量資料同步資料庫MySql
- Linux命令---rsyncLinux
- 超實用!!rsync分散式 + inotify監控實時同步分散式
- 如何利用samba(smb服務)實現網路檔案共享Samba
- SpringBoot利用Nginx作為檔案伺服器實現檔案上傳和訪問Spring BootNginx伺服器
- rsync同步檔案到遠端機器,卡住10多秒--問題解決過程
- 怎麼利用AbstractQueuedSynchronizer實現自定義同步元件?元件