1、什麼是rsync
2、rsync的功能特性
3、編譯安裝rsync軟件
4、rsync的應用模式
5、rsync 藉助ssh通道技術案例
6、企業案例一:搭建遠程容災備份系統
練習一推送文件方式同步並排除指定的目錄和文件
練習二測試主機之間數據徹底同步(無差別同步)
練習三rsync多目錄多模塊同步
配置防火牆容許rsync服務
附加一:rsync服務端部署流程回顧
附加二:rsync自我模擬排錯思路及實戰
附加三rsync生產排錯整理個人FAQ
inotify介紹
企業應用案例:利用rsync+inotify搭建實時同步系統
---------------------------------------rsync+inotify學習---------------------------------------
rsync的優勢和不足
與傳統的cp、tar備份方式相比,rsync具備安全性高、備份迅速、支持增量備份等優勢,經過rsync能夠解決對實時性要求不高的數據備份需求,
例如,按期備份文件服務器數據到遠端服務器,對本地磁盤按期進行數據鏡像等。
隨着應用系統的規模不斷擴大,對數據的安全性和可靠性提出了更高的要求,rsync在高端業務系統中也逐漸暴露出來不少不足,首先,rsync同步數據時,
須要掃描全部文件後進行對比,而後進行差量傳輸,若是文件數據達到了百萬甚至千萬量級,掃描全部文件將是很是耗時的,並且發生變化每每是其中不多的一部分,
所以rsync是很是低效的方式,其次,rsync不能實時監測、同步數據。雖然它能夠經過Linux守護進程的方式觸發同步,可是兩次觸發動做必定會有時間差,可能致使服務端和客戶端數據出現不一致,沒法在出現應用故障時完成恢復數據。基於這個緣由,rsync+inotify組合就出現了。
重點是inotify的使用方法:
初識inotify
inotify是一種強大的、細粒度的、異步的文件系統事件監控機制、Linux內核從2.6.13版本其,
加入了對inotify的支持,經過inotify能夠監控文件系統中添加、刪除、修改、移動等各類細微事件,利用這個內核接口,第三方軟件能夠監控文件系統下
的文件的各類變化狀況、inotify-tools就是這樣的一個第三方軟件。
在安裝inotify-tools前請先確認你的Linux內核是否達到了2.6.13,而且在編譯時開啓CONFIG_INOTIFY選項,
1》查看當前系統是否支持inotify
[root@b-server lianglab]# uname -r
2.6.18-308.el5
[root@b-server src]# ll /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Jan 4 02:32 max_queued_events
-rw-r--r-- 1 root root 0 Jan 4 02:32 max_user_instances
-rw-r--r-- 1 root root 0 Jan 4 02:32 max_user_watches
2》上傳inotify源碼包到服務器上,若是能夠鏈接互聯網,可使用wget在網絡上下載。
[root@b-server lianglab]# cd /usr/local/src/
[root@b-server src]# ls
inotify-tools-3.14.tar.gz
3》編譯安裝系統。
[root@b-server src]# ls
inotify-tools-3.14.tar.gz
[root@b-server src]# tar zxvf inotify-tools-3.14.tar.gz
-----------省略-------
inotify-tools-3.14/INSTALL
inotify-tools-3.14/ltmain.sh
inotify-tools-3.14/depcomp
[root@b-server src]#
[root@b-server src]# cd inotify-tools-3.14
[root@b-server inotify-tools-3.14]# ./configure --prefix=/usr/local/inotify-tools-3.14
-----------省略---------
config.status: creating libinotifytools/src/inotifytools/Makefile
config.status: creating config.h
config.status: creating libinotifytools/src/inotifytools/inotify.h
config.status: executing depfiles commands
config.status: executing libtool commands
[root@b-server inotify-tools-3.14]# make
-----------省略---------
cd . && /bin/sh ./config.status config.h
config.status: creating config.h
config.status: config.h is unchanged
make[2]: Leaving directory `/usr/local/src/inotify-tools-3.14'
make[1]: Leaving directory `/usr/local/src/inotify-tools-3.14'
[root@b-server inotify-tools-3.14]# make install
-----------省略---------
make[2]: Nothing to be done for `install-exec-am'.
make[2]: Nothing to be done for `install-data-am'.
make[2]: Leaving directory `/usr/local/src/inotify-tools-3.14'
make[1]: Leaving directory `/usr/local/src/inotify-tools-3.14'
[root@b-server inotify-tools-3.14]#
咱們在作一個軟鏈接
[root@b-server inotify-tools-3.14]# ln -s /usr/local/inotify-tools-3.14/ /usr/local/inotify
[root@b-server inotify-tools-3.14]#
[root@b-server inotify-tools-3.14]# ll /usr/local/inotify-tools-3.14/bin/inotifywa*
-rwxr-xr-x 1 root root 47224 Jan 4 02:46 /usr/local/inotify-tools-3.14/bin/inotifywait
-rwxr-xr-x 1 root root 43586 Jan 4 02:46 /usr/local/inotify-tools-3.14/bin/inotifywatch
[root@b-server inotify-tools-3.14]#
安裝完inotify-tools後,會生成inotifywait和inotifywatch兩個指令,
其中,inotifywait用於等待文件或文件集上的一個特定事件,能夠監控任何文件和目錄設置,而且能夠遞歸地監控整個目錄樹,
inotifwatch用於收集被監控的文件系通通計數據,包括美國inotify事件發生多少次等信息。
[root@b-server inotify]# ll
total 16
drwxr-xr-x 2 root root 4096 Jan 4 02:46 bin #inotify執行命令(二進制)
drwxr-xr-x 3 root root 4096 Jan 4 02:46 include #inotify程序所需用的頭文件
drwxr-xr-x 2 root root 4096 Jan 4 02:46 lib #動態連接的庫文件
drwxr-xr-x 4 root root 4096 Jan 4 02:46 share #幫助文檔
[root@b-server inotify]#
inotifywait相關參數介紹:
-m "monitor"表示始終保持事件監聽狀態
-r "recursive"表示遞歸查詢目錄
-q "quiet"表示打印出監控事件
-e "event"經過此參數能夠指定要監控的事件,經常使用的事件有,nodify、delete、create、attrib等等。
Events:
access file or directory contents were read #文件或目錄被讀取
modify file or directory contents were written #文件或目錄內容被修改
attrib file or directory attributes changed #文件或目錄屬性被改變
close_write file or directory closed, after being opened in
writeable mode
close_nowrite file or directory closed, after being opened in
read-only mode
close file or directory closed, regardless of read/write mode #文件或目錄封閉、不管讀/寫模式
open file or directory opened #文件或目錄被打開
moved_to file or directory moved to watched directory #文件或目錄被移動至另一個目錄
moved_from file or directory moved from watched directory
move file or directory moved to or from watched directory #文件或目錄被移動另外一個目錄或從另外一個目錄移動到當前目錄。
create file or directory created within watched directory #文件或目錄被建立在當前目錄。
delete file or directory deleted within watched directory #文件或目錄被刪除
delete_self file or directory was deleted
unmount file system containing file or directory unmounted #文件系統被卸載。
[root@b-server bin]#
建立事件監控腳本-------重點。
#vi realtime_rsync.sh
#!/bin/bash
#created by lianglab 21:55 2013-6-13
#QQ 865362365
# http://hi.baidu.com/zll56281688
## inotify_rsync.sh ##
#para
host=192.168.1.100
src=/lianglab
dst=lianglab
user=backup
rsync_passfile=/etc/rsync.password
inotify_home=/usr/local/inotify/
#judge
if [ ! -e "$src" ] \
|| [ ! -e "${rsync_passfile}" ] \
|| [ ! -e "${inotify_home}/bin/inotifywait" ] \
|| [ ! -e "/usr/bin/rsync" ];
then
echo "Check File and Folder"
exit 0
fi
${inotify_home}/bin/inotifywait -mrq --timefmt '%d/%m/%y $H:%M' --format '%T %w%f%e' -e modify,close_write,delete,create,attrib $src \
| while read file
do
#rsync -avzP --delete --timeout=100 --password-file=${rsync_passfile} $src$user$host::$dst >/dev/null 2>&1
cd $src && rsync -aruz -R --delete ./ --timeout=100 $user@$host::$dst --password-file=${rsync_passfile} >/dev/null 2>&1
done
exit 0
---------------------------------------------------------------------
推送失敗
[root@b-server lianglab]# sh -x /home/realtime_rsync.sh
+ host=192.168.1.100
+ src=/lianglab
+ dst=lianglab
+ user=backup
+ rsync_passfile=/etc/rsync.password
+ inotify_home=/usr/local/inotify/
+ '[' '!' -e /lianglab ']'
+ '[' '!' -e /etc/rsync.password ']'
+ '[' '!' -e /usr/local/inotify//bin/inotifywait ']'
+ '[' '!' -e /usr/bin/rsync ']'
+ /usr/local/inotify//bin/inotifywait -mrq --timefmt '%d/%m/%y $H:%M' --format '%T %w%f%e' -e modify,close_write,delete,create,attrib /lianglab
+ read file
+ cd /lianglab
+ rsync -aruz -R --delete ./ --timeout=100 backup@192.168.1.100::lianglab --password-file=/etc/rsync.password
/home/realtime_rsync.sh: line 25: dev/null: No such file or directory
+ read file
+ cd /lianglab
+ rsync -aruz -R --delete ./ --timeout=100 backup@192.168.1.100::lianglab --password-file=/etc/rsync.password
/home/realtime_rsync.sh: line 25: dev/null: No such file or directory
+ read file
+ cd /lianglab
+ rsync -aruz -R --delete ./ --timeout=100 backup@192.168.1.100::lianglab --password-file=/etc/rsync.password
/home/realtime_rsync.sh: line 25: dev/null: No such file or directory
+ read file
[root@b-server lianglab]#
推送成功
[root@b-server lianglab]# sh -x /home/realtime_rsync.sh
+ host=192.168.1.100
+ src=/lianglab
+ dst=lianglab
+ user=backup
+ rsync_passfile=/etc/rsync.password
+ inotify_home=/usr/local/inotify/
+ '[' '!' -e /lianglab ']'
+ '[' '!' -e /etc/rsync.password ']'
+ '[' '!' -e /usr/local/inotify//bin/inotifywait ']'
+ '[' '!' -e /usr/bin/rsync ']'
+ /usr/local/inotify//bin/inotifywait -mrq --timefmt '%d/%m/%y $H:%M' --format '%T %w%f%e' -e modify,close_write,delete,create,attrib /lianglab
+ read file
+ cd /lianglab
+ rsync -aruz -R --delete ./ --timeout=100 backup@192.168.1.100::lianglab --password-file=/etc/rsync.password
+ read file
+ cd /lianglab
+ rsync -aruz -R --delete ./ --timeout=100 backup@192.168.1.100::lianglab --password-file=/etc/rsync.password
+ read file
+ cd /lianglab
+ rsync -aruz -R --delete ./ --timeout=100 backup@192.168.1.100::lianglab --password-file=/etc/rsync.password
+ read file
咱們測試一下,建立23個文件
[root@b-server lianglab]# for f in `seq 23`;do touch $f;done
[root@b-server lianglab]# ls
1 11 13 15 17 19 20 22 3 5 7 9 b d liang2.txt null
10 12 14 16 18 2 21 23 4 6 8 a c liang1.txt liang.txt
[root@b-server lianglab]#
[root@b-server lianglab]# sh -x /home/realtime_rsync.sh
+ host=192.168.1.100
+ src=/lianglab
+ dst=lianglab
+ user=backup
+ rsync_passfile=/etc/rsync.password
+ inotify_home=/usr/local/inotify/
+ '[' '!' -e /lianglab ']'
+ '[' '!' -e /etc/rsync.password ']'
+ '[' '!' -e /usr/local/inotify//bin/inotifywait ']'
+ '[' '!' -e /usr/bin/rsync ']'
+ /usr/local/inotify//bin/inotifywait -mrq --timefmt '%d/%m/%y $H:%M' --format '%T %w%f%e' -e modify,close_write,delete,create,attrib /lianglab
+ read file
+ cd /lianglab
+ rsync -aruz -R --delete ./ --timeout=100 backup@192.168.1.100::lianglab --password-file=/etc/rsync.password
+ read file
+ cd /lianglab
+ rsync -aruz -R --delete ./ --timeout=100 backup@192.168.1.100::lianglab --password-file=/etc/rsync.password
+ read file
+ cd /lianglab
+ rsync -aruz -R --delete ./ --timeout=100 backup@192.168.1.100::lianglab --password-file=/etc/rsync.password
+ read file
+ cd /lianglab
+ rsync -aruz -R --delete ./ --timeout=100 backup@192.168.1.100::lianglab --password-file=/etc/rsync.password
+ read file
+ cd /lianglab
+ rsync -aruz -R --delete ./ --timeout=100 backup@192.168.1.100::lianglab --password-file=/etc/rsync.password
+ read file
+ cd /lianglab
咱們在到服務器端查看一下,
[root@rsync lianglab]# ls
1 10 11 12 13 14 15 16 17 18 19 2 20 21 22 23 3 4 5 6 7 8 9 a b c d liang1.txt liang2.txt liang.txt null
[root@rsync lianglab]#
[root@rsync lianglab]# ls | wc -l
31
[root@rsync lianglab]#
[root@b-server lianglab]# rm -rf *
[root@b-server lianglab]#
咱們建立99個目錄
[root@b-server lianglab]# for f in `seq 99`;do mkdir -p $f;done
[root@b-server lianglab]#
[root@rsync lianglab]# ls
1 12 15 18 20 23 26 29 31 34 37 4 42 45 48 50 53 56 59 61 64 67 7 72 75 78 80 83 86 89 91 94 97
10 13 16 19 21 24 27 3 32 35 38 40 43 46 49 51 54 57 6 62 65 68 70 73 76 79 81 84 87 9 92 95 98
11 14 17 2 22 25 28 30 33 36 39 41 44 47 5 52 55 58 60 63 66 69 71 74 77 8 82 85 88 90 93 96 99
[root@rsync lianglab]# ls | wc -l
99
[root@rsync lianglab]#
------------------------企業應用案例:利用rsync+inotify搭建實時同步系統。-------------------------------------
案例描述:
國內著名上市公司lianglab,因爲業務不斷增加,搭建了一個CMS內容發佈系統、後端採用負載均衡集羣部署方案,由一個負載調度節點、
3個服務節點及一個內容發佈節點構成,內容發佈節點負責將用戶發佈的數據生成靜態頁面,同時將靜態網頁傳輸給3個服務節點,而負載調度節點負責將
用戶請求根據負載算法調度到相應的服務節點上,實現用戶訪問,用戶要求在前端訪問到的網頁數據始終是最新的、一致的。
解決方案:
爲了保證用戶訪問到的數據一致性和實時性,必須保證3個服務節點上的數據和內容發佈節點上的數據始終是一致的,這就須要經過文件同步工具來實現,
這裏採用rsync,同時又要保證數據的實時性,這就須要inotify,及利用inotify監視內容發佈節點文件的變化,若是文件有變更,那麼就啓動rsync,
將文件實時同步到2個節點上。
系統環境
節點名稱 內核版本 用途 IP地址 網頁數據路徑
a-server(rsync) 2.6.18-308.el5 代碼更新 192.168.1.100 /data/httpd/wwwroot
b-server(web1) 2.6.18-308.el5 服務節點1 192.168.1.110 /data/httpd/wwwroot
c-server(web2) 2.6.18-308.el5 服務節點2 192.168.1.120 /data/httpd/wwwroot
一、安裝rsync與inotify-tools
inotify-tools是用來監控文件系統變化的工具,所以必須安裝在內容發佈節點上,服務節點上無需安裝inotify-tools,另外須要在b-server、c-server和server節點上安裝rsync,安裝很是簡單,前面都說過了,就很少作介紹了。
這個案例中,內容發佈節點(即Server) 充當rsync客戶端的角色,而2個服務節點充當了rsync服務器端的角色,整個數據同步的過程其實就是一個從客戶端向服務端發送數據的過程。
================================
web節點服務器配置
第一步:咱們在web節點上配置rsync服務
#mkdir -p /data/httpd/wwwroot
第二步:建立rsync配置文件
vi /etc/rsyncd.conf
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
[www]
path = /data/httpd/wwwroot/
comment = update
ignore errors
read only = no
write only = no
hosts allow = 192.168.1.0/255.255.255.0
list = false
uid = root
gid = root
auth users = root
secrets file = /etc/web.password
第三步:建立rsync認證文件
#vi /etc/web.password
123456
root:123456
第四步:設置權限,開啓服務,並添加到開機自啓動
#chmod 600 /etc/web.password
#rsync --daemon
#echo "rsync --daemon" >>/etc/rc.local
配置服務端(rsync+inotify)
第一步:建立存放代碼目錄
#mkdir -p /data/httpd/wwwroot
第二步:安裝inotify
#cd /usr/local/src
#tar zxvf inotify-tools-3.14.tar.gz
#cd inotify-tools-3.14
#./configure
#make
#make install
第三步:編寫同步更新腳本文件
vi inotify_rsync88.sh
#!/bin/bash
src=/data/httpd/wwwroot/
des=www
host="192.168.1.110 192.168.1.120"
/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
for hostip in $host
do
rsync -vzrtopg --delete --progress --password-file=/etc/web.password $src root@$hostip::$des
done
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done
第四步:建立rsync認證文件
#vi /etc/web.password
123456
root:123456
#chmod u+x /etc/web.password
第五步:啓動並添加到開啓自啓動中。
#nohup /bin/bash /home/inotify_rsync88.sh &
#echo "nohup /bin/bash /home/inotify_rsync88.sh &" >>/etc/rc.local
第六步:測試
咱們到192.168.1.100上進入目錄/data/httpd/wwwroot/
#touch liang.txt
在到兩臺web機器上看/data/httpd/wwwroot/目錄是否有liang.txt文件了。
附錄1、rsync命令經常使用參數
經常使用參數說明:
-v --verbose 詳細模式輸出,傳輸時的進度等信息。
-z --compress 對備份的文件在傳輸時進行壓縮處理。
-r --recusive 對子目錄以遞歸模式處理
-t --time 保持穩健時間信息
-o --owner 保持穩健屬主信息
-p --perms 保持文件權限
-g --group 保持文件屬組信息
--progress 顯示備份過程
-a --archive 歸檔模式,表示以遞歸方式傳輸文件,並保持全部文件屬性,等於-rtopsD1
-e --rsh=COMMAND 使用的信道協議,指定替代rsh的shell程序,例如:ssh
--exclude=PATTERN 指定排除不須要傳輸的文件模式
-D --devices 保持設備文件信息
-l ----links 保留軟鏈接
-u --update
============================================================================html
參考文獻:老男孩51CTO視頻教程http://edu.51cto.com/course/course_id-875.html 前端
南非螞蟻《高性能Linux服務器構建實戰》一書web