1、rsynclinux
1、rsync介紹算法
Rsync是一個遠程數據同步工具,可經過LAN/WAN快速同步多臺主機間的文件。Rsync原本是用以取代rcp的一個工具,它當前由 rsync.samba.org維護。Rsync使用所謂的「Rsync演算法」來使本地和遠程兩個主機之間的文件達到同步,這個算法只傳送兩個文件的不一樣部分,而不是每次都整份傳送,所以速度至關快。運行Rsync server的機器也叫backup server,一個Rsync server可同時備份多個client的數據;也能夠多個Rsync server備份一個client的數據。shell
Rsync能夠搭配rsh或ssh甚至使用daemon模式。Rsync server會打開一個873的服務通道(port),等待對方Rsync鏈接。鏈接時,Rsync server會檢查口令是否相符,若經過口令查覈,則能夠開始進行文件傳輸。第一次連通完成時,會把整份文件傳輸一次,下一次就只傳送二個文件之間不一樣的部份。vim
2、rsync特色安全
(1)能夠鏡像保存整個目錄樹或文件系統;bash
(2)較高的數據傳輸效率;服務器
(3)能夠藉助於ssh實現安全數據傳輸;網絡
(3)支持匿名傳輸;併發
3、rsync命令的工做模式:ssh
第一種模式:shell模式,也稱做本地模式;
第二種模式:遠程shell模式,能夠利用ssh協議承載其遠程傳輸過程;
第三種模式:列表模式,僅列出源中的內容,-nv
第四種模式:服務模式,此時rsync工做爲守護進程,能接收客戶端的數據同步請求;
4、rsync命令的語法
rsync命令的選項: -n: 同步測試,不執行真正的同步過程; -v: 詳細輸出模式 -q: 靜默模式 -c: checksum,開啓校驗功能 -r: 遞歸複製 -a: 歸檔,保留文件的原有屬性; -p: 保留文件的權限; -t: 保留文件的時間戳; -l: 保留符號連接 -g: 保留屬組 -o: 保留屬主 -D:保留設備文件 -e ssh: 使用ssh做爲傳輸承載; -z: 壓縮後傳輸; --progress: 顯示進度條 --stats: 顯示如何執行壓縮和傳輸
注意:rsync命令中,使用-r選項時,若是源路徑是目錄,且給複製路徑時末尾有/,則會複製目錄中的內容,而非目錄本身;若是末尾沒有/,則會同步目錄自己及目錄中的全部文件;目標路徑末尾是否有/可有可無;
2、rsync+inotify實現數據實時同步更新
1、rsync+inotify組合的必要性和好處(如下原理內容來源於網絡)
(1)rsync
與傳統的cp、tar備份方式相比,rsync具備安全性高、備份迅速、支持增量備份等優勢,經過rsync能夠解決對實時性要求不高的數據備份需求,例如按期的備份文件服務器數據到遠端服務器,對本地磁盤按期作數據鏡像等。
隨着應用系統規模的不斷擴大,對數據的安全性和可靠性也提出的更好的要求,rsync在高端業務系統中也逐漸暴露出了不少不足,首先,rsync同步數據時,須要掃描全部文件後進行比對,進行差量傳輸。若是文件數量達到了百萬甚至千萬量級,掃描全部文件將是很是耗時的。並且正在發生變化的每每是其中不多的一部分,這是很是低效的方式。其次,rsync不能實時的去監測、同步數據,雖然它能夠經過linux守護進程的方式進行觸發同步,可是兩次觸發動做必定會有時間差,這樣就致使了服務端和客戶端數據可能出現不一致,沒法在應用故障時徹底的恢復數據。基於以上緣由,rsync+inotify組合出現了!
(2)inotify
Inotify 是一種強大的、細粒度的、異步的文件系統事件監控機制,linux內核從2.6.13起,加入了Inotify支持,經過Inotify能夠監控文件系統中添加、刪除,修改、移動等各類細微事件,利用這個內核接口,第三方軟件就能夠監控文件系統下文件的各類變化狀況,而inotify-tools就是這樣的一個第三方軟件。rsync能夠實現觸發式的文件同步,可是經過crontab守護進程方式進行觸發,同步的數據和實際數據會有差別,而inotify能夠監控文件系統的各類變化,當文件有任何變更時,就觸發rsync同步,這樣恰好解決了同步數據的實時性問題。
2、實驗拓撲圖:
注意:作數據的實時同步時,通常是從客戶端同步到服務端。
3、rsync服務端(172.16.140.1)配置
rsync沒有本身的配置文件,要手動建立rsync的配置文件/etc/rsyncd.conf,該配置文件分爲兩部分全局配置段和共享配置段,共享配置段能夠有多個。
[root@localhost ~]# vim /etc/rsyncd.conf # Global Settings #全局配置段 uid = nobody #以哪一個用戶的身份獲取數據,nobody是最小權限的用戶 gid = nobody use chroot = no #服務運行時,要不要鎖定在家目錄下 max connections = 10 #服務器端可容許的最大併發鏈接數 strict modes = yes #是否工做在嚴格模式下 pid file = /var/run/rsyncd.pid #rsync的pid文件路徑 log file = /var/log/rsyncd.log #rsync的日誌文件路徑 # Directory to be synced #共享配置段 [rsync_data] #同步的共享目錄名稱,多個共享目錄名稱不能重名 path = /rsync_mydata #共享目錄的實際路徑,要同步的數據存放的位置 ignore errors = yes #表示在複製文件的過程當中,若發生錯誤,是繼續複製(yes)仍是終止複製(no) read only = no #是否限定客戶端以只讀的方式從服務端拉取數據。若服務端共享的數據只用於下載,則設爲yes。若容許客戶端向服務端推送數據,則設爲no。 write only = no #設爲no表示只容許客戶端往裏寫數據,不能拉取數據。 hosts allow = 172.16.0.0/16 #容許哪些主機來訪問,作白名單的。 hosts deny = * # 作黑名單的。 list = false #是否容許用戶列出文件列表 uid = root #以哪一個用戶的身份來獲取數據 gid = root auth users = hjq #容許哪些用戶來拉取數據,作身份驗證 secrets file = /etc/rsyncd.passwd #存放用戶驗證的信息
編輯用戶驗證文件,其中用戶名和密碼都是明文的,因此該文件的權限要設爲600。
[root@localhost ~]# vim /etc/rsyncd.passwd hjq:hjq [root@localhost ~]# chmod 600 /etc/rsyncd.passwd
rsync是依賴於超級守護進程xinetd工做的,要把xinetd也啓動起來。
[root@localhost ~]# yum -y install xinetd [root@localhost ~]# chkconfig rsync on [root@localhost ~]# service xinetd start [root@localhost ~]# ss -tnl #rsyncd服務監聽於873/tcp端口上
4、rsync客戶端(172.16.40.1)配置
(1)安裝inotify-tools
因爲inotify特性須要Linux內核的支持,在安裝inotify-tools前要先確認Linux系統內核是否達到了2.6.13以上,若是Linux內核低於2.6.13版本,就須要從新編譯內核加入inotify的支持。
也能夠用以下方法判斷,內核是否支持inotify。若是有如下三項,表示系統已經默認支持inotify。
三個參數的簡單解析:
max_queued_evnets:表示調用inotify_init時分配給inotify instance中可排隊的event的數目的最大值,超出這個值的事件被丟棄,但會觸發IN_Q_OVERFLOW事件。
max_user_instances:表示每個real user ID可建立的inotify instatnces的數量上限。
max_user_watches:表示每一個inotify instatnces可監控的最大目錄數量。若是監控的文件數目巨大,須要根據狀況,適當增長此值的大小,例如:echo "9000000" > /proc/sys/fs/inotify/max_user_watches
若查明內核支持inotify,就能夠使用yum安裝inotify-tools,這裏使用的版本是inotify-tools-3.14-1.el6.x86_64
# yum install -y inotify*
inotify-tools安裝完成後,會生成inotifywait和inotifywatch兩個指令。
inotifywait用於等待文件或文件集上的一個特定事件,它能夠監控任何文件和目錄設置,而且能夠遞歸地監控整個目錄樹。
inotifywatch用於收集被監控的文件系通通計數據,包括每一個inotify事件發生多少次等信息。
(2)inotifywait命令參數解析
參數說明
inotifywait
語法:
inotifywait [-hcmrq] [-e ] [-t ] [--format ] [--timefmt ] [ ... ]
參數:
-h,--help
輸出幫助信息
@
排除不須要監視的文件,能夠是相對路徑,也能夠是絕對路徑。
--fromfile
從文件讀取須要監視的文件或排除的文件,一個文件一行,排除的文件以@開頭。
-m, --monitor
接收到一個事情而不退出,無限期地執行。默認的行爲是接收到一個事情後當即退出。
-d, --daemon
跟--monitor同樣,除了是在後臺運行,須要指定--outfile把事情輸出到一個文件。也意味着使用了--syslog。
-o, --outfile
輸出事情到一個文件而不是標準輸出。
-s, --syslog
輸出錯誤信息到系統日誌
-r, --recursive
監視一個目錄下的全部子目錄。
-q, --quiet
指定一次,不會輸出詳細信息,指定二次,除了致命錯誤,不會輸出任何信息。
--exclude
正則匹配須要排除的文件,大小寫敏感。
--excludei
正則匹配須要排除的文件,忽略大小寫。
-t , --timeout
設置超時時間,若是爲0,則無限期地執行下去。
-e , --event
指定監視的事件。
-c, --csv
輸出csv格式。
--timefmt
指定時間格式,用於--format選項中的%T格式。
--format
指定輸出格式。
%w 表示發生事件的目錄
%f 表示發生事件的文件
%e 表示發生的事件
%Xe 事件以「X"分隔
%T 使用由--timefmt定義的時間格式
(3)配置inotify
建立一個共享目錄,用於存放要同步的數據
# mkdir /inotify_data
提供一個腳本
# vim /tmp/inotify_rsync.sh #!/bin/bash host=172.16.140.1 #rysnc服務端的地址 src=/inotify_data/ #rsync客戶端的用於同步數據的目錄 dst=rsync_data #rysnc服務端導出的共享目錄名 username=hjq #rysnc服務端上/etc/rsyncd.passwd這個文件中定義的用戶名 /usr/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/rsyncd.passwd $src $username@$host::$dst echo "${files} was rsynced" >> /var/log/rsync.log 2>&1 #將信息寫入日誌 done
在rsync客戶端提供/etc/rsyncd.passwd密碼文件,在rsync客戶端中只要提供rsync同步的密碼就好了,不用提供用戶名。
#vim /etc/rsyncd.passwd hjq # chmod 600 /etc/rsyncd.passwd #密碼文件的權限應爲600
賦予該腳本執行的權限
# chmod +x /tmp/inotify_rsync.sh
把腳本添加到開機啓動的文件中
# echo "/tmp/inotify_rsync.sh" >> /etc/rc.d/rc.local
5、實驗操做
rsync服務端(172.16.140.1):
剛開始rsync服務端的/mydata共享目錄,沒有文件
rsync客戶端(172.16.40.1):
運行腳本
複製文件到rsync客戶端的共享目錄上
rsync服務端(172.16.140.1):
數據成功同步過來了!