我講到過利用rsync實現數據的鏡像和備份,可是要實現數據的實時備份,單獨靠rsync還不能實現,本文就講述下如何實現數據的實時備份。html
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同步,這樣恰好解決了同步數據的實時性問題。linux
3、 安裝inotify工具inotify-tools
因爲inotify特性須要Linux內核的支持,在安裝inotify-tools前要先確認Linux系統內核是否達到了2.6.13以上,若是Linux內核低於2.6.13版本,就須要從新編譯內核加入inotify的支持,也能夠用以下方法判斷,內核是否支持inotify:
[root@localhost webdata]# uname -r
2.6.18-164.11.1.el5PAE
[root@localhost webdata]# ll /proc/sys/fs/inotify
總計 0
-rw-r--r-- 1 root root 0 04-13 19:56 max_queued_events
-rw-r--r-- 1 root root 0 04-13 19:56 max_user_instances
-rw-r--r-- 1 root root 0 04-13 19:56 max_user_watches
若是有上面三項輸出,表示系統已經默認支持inotify,接着就能夠開始安裝inotify-tools了。
能夠到http://inotify-tools.sourceforge.net/下載相應的inotify-tools版本,而後開始編譯安裝:
[root@localhost ~]# tar zxvf inotify-tools-3.14.tar.gz
root@localhost ~]# cd inotify-tools-3.14
[root@localhost inotify-tools-3.14]# ./configure
[root@localhost inotify-tools-3.14]# make
[root@localhost inotify-tools-3.14]# make install
[root@localhost inotify-tools-3.14]# ll /usr/local/bin/inotifywa*
-rwxr-xr-x 1 root root 37264 04-14 13:42 /usr/local/bin/inotifywait
-rwxr-xr-x 1 root root 35438 04-14 13:42 /usr/local/bin/inotifywatch
inotify-tools安裝完成後,會生成inotifywait和inotifywatch兩個指令,其中,inotifywait用於等待文件或文件集上的一個特定事件,它能夠監控任何文件和目錄設置,而且能夠遞歸地監控整個目錄樹。
inotifywatch用於收集被監控的文件系通通計數據,包括每一個inotify事件發生多少次等信息。web
4、 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可監控的最大目錄數量。若是監控的文件數目巨大,須要根據狀況,適當增長此值的大小,例如:
echo 30000000 > /proc/sys/fs/inotify/max_user_watches算法
5、 inotifywait相關參數
Inotifywait是一個監控等待事件,能夠配合shell腳本使用它,下面介紹一下經常使用的一些參數:
-m, 即--monitor,表示始終保持事件監聽狀態。
-r, 即--recursive,表示遞歸查詢目錄。
-q, 即--quiet,表示打印出監控事件。
-e, 即--event,經過此參數能夠指定要監控的事件,常見的事件有modify、delete、create、attrib等。
更詳細的請參看man inotifywait。shell
6、 rsync+inotify企業應用案例
案例描述
這是一個CMS內容發佈系統,後端採用負載均衡集羣部署方案,有一個負載調度節點和三個服務節點以及一個內容發佈節點構成,內容發佈節點負責將用戶發佈的數據生成靜態頁面,同時將靜態網頁傳輸到三臺服務節點,而負載調度節點負責將用戶請求根據負載算法調度到相應的服務節點,實現用戶訪問。用戶要求在前端訪問到的網頁數據始終是最新的、一致的。
解決方案
爲了保證用戶訪問到的數據一致性和實時性,必須保證三個服務節點與內容發佈節點的數據始終是一致的,這就須要經過文件同步工具來實現,這裏採用rsync,同時又要保證數據是實時的,這就須要inotify,即:使用inotify監視內容發佈節點文件的變化,若是文件有變更,那麼就啓動rsync,將文件實時同步到三個服務節點。
系統環境
這裏全部服務器均採用Linux操做系統,系統內核版本與節點信息如表1 所示:
表1windows
1 安裝rsync與inotify-tools
inotify-tools是用來監控文件系統變化的工具,所以必須安裝在內容發佈節點,服務節點無需安裝inotify-tools,另外須要在web一、web二、web三、webserver節點上安裝rsync,因爲安裝很是簡單,這裏不在講述。
在這個案例中,內容發佈節點(即server)充當了rsync客戶端的角色,而三個服務節點充當了rsync服務器端的角色,整個數據同步的過程,其實就是一個從客戶端向服務端推送數據的過程。這點與上面咱們講述的案例恰好相反。後端
2 在三個服務節點配置rsync
這裏給出三個服務節點的rsync配置文件,以供參考,讀者可根據實際狀況自行修改。
Web1節點rsyncd.conf配置以下:
uid = nobody
gid = nobody
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安全
[web1]
path = /web1/wwwroot/
comment = web1 file
ignore errors
read only = no
write only = no
hosts allow = 192.168.12.134
hosts deny = *
list = false
uid = root
gid = root
auth users = web1user
secrets file = /etc/web1.pass
Web2節點rsyncd.conf配置以下:
uid = nobody
gid = nobody
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.logbash
[web2]
path = /web2/wwwroot/
comment = web2 file
ignore errors
read only = no
write only = no
hosts allow = 192.168.12.134
hosts deny = *
list = false
uid = root
gid = root
auth users = web2user
secrets file = /etc/web2.pass
Web3節點rsyncd.conf配置以下:
uid = nobody
gid = nobody
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
[web3]
path = /web3/wwwroot/
comment = web3 file
ignore errors
read only = no
write only = no
hosts allow = 192.168.12.134
hosts deny = *
list = false
uid = root
gid = root
auth users = web3user
secrets file = /etc/web3.pass
在三臺服務節點rsyncd.conf文件配置完成後,依次啓動rsync守護進程,接着將rsync服務加入到自啓動文件中:
echo 「/usr/local/bin/rsync --daemon」 >>/etc/rc.local
到此爲止,三個web服務節點已經配置完成。
3 配置內容發佈節點
配置內容發佈節點的主要工做是將生成的靜態網頁實時的同步到集羣中三個服務節點,這個過程能夠經過一個shell腳原本完成,腳本內容大體以下:
#!/bin/bash
host1=192.168.12.131
host2=192.168.12.132
host3=192.168.12.133
src=/web/wwwroot/
dst1=web1
dst2=web2
dst3=web3
user1=web1user
user2=web3user
user3=web3user
/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
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src$user1@$host1::$dst1
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src$user2@$host2::$dst2
/usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/server.pass $src$user3@$host3::$dst3
echo "${files} was rsynced" >>/tmp/rsync.log 2>&1
done
腳本相關解釋以下:
--timefmt:指定時間的輸出格式。
--format:指定變化文件的詳細信息。
這兩個參數通常配合使用,經過指定輸出格式,輸出相似與:
15/04/10 00:29 /web/wwwroot/ixdba.shDELETE,ISDIR was rsynced
15/04/10 00:30 /web/wwwroot/index.htmlMODIFY was rsynced
15/04/10 00:31 /web/wwwroot/pcre-8.02.tar.gzCREATE was rsynced
這個腳本的做用就是經過inotify監控文件目錄的變化,進而觸發rsync進行同步操做,因爲這個過程是一種主動觸發操做,經過系統內核完成的,因此,比起那些遍歷整個目錄的掃描方式,效率要高不少。
有時會遇到這樣的狀況:向inotify監控的目錄(這裏是/web/wwwroot/)寫入一個很大文件時,因爲寫入這個大文件須要一段時間,此時inotify就會持續不停的輸出該文件被更新的信息, 這樣就會持續不停的觸發rsync去執行同步操做,佔用了大量系統資源,那麼針對這種狀況,最理想的作法是等待文件寫完後再去觸發rsync同步。 在這種狀況下,能夠修改inotify的監控事件,即:「-e close_write,delete,create,attrib」。
接着,將這個腳本命名爲inotifyrsync.sh,放到/web/wwwroot目錄下,而後給定可執行權限,放到後臺運行:
chmod 755 /web/wwwroot/inotifyrsync.sh
/web/wwwroot/inotifyrsync.sh &
最後,將此腳本加入系統自啓動文件:
echo 「/web/wwwroot/inotifyrsync.sh &」>>/etc/rc.local
這樣就完成了內容發佈節點的全部配置工做。
4 測試rsync+inotify實時同步功能
全部配置完成後,能夠在網頁發佈節點的/web/wwwroot目錄下添加、刪除或者修改某個文件,而後到三個服務節點對應的目錄查看文件是否跟隨網頁發佈節點的/web/wwwroot目錄下文件發生變化,若是你看到三個服務節點對應的目錄文件跟着內容發佈節點目錄文件同步變化,那麼咱們這個業務系統就配置成功了。
Rsync企業實戰之自動異地備份
Rsync,故名思議,是一個遠程數據同步工具,能夠鏡像整個目錄樹和文件系統,也能夠保持源文件的權限,時間和軟硬連接,能夠優化數據,文件重複數據的刪除,也能夠在LAN/WAN之間快速的同步多臺主機的數據,這主要得益於Rsync的壓縮和Rsync的核心算法,其算法,是本地和遠程兩臺主機之間的文件達到同步並保持一致,而且只傳送兩個文件的不一樣部分,而不是整個數據進行傳送,因此,速度很是快;
一個Rsync server可以同時備份多個客戶端數據,也能夠一個客戶端備份多個Rsync server的數據;
Rsync 支持搭配scp,ssh和daemon模式,默認端口是873,當第一次鏈接的時候,會對數據進行完整備份,以後的全部備份,都是進行增量備份,只備份又變化的數據;
Rsync只支持單向備份,不支持雙向,若是須要雙向同步的,可使用Unison;若是須要實時同步的,能夠結合Rsync+inotify;
Rsync服務以只讀方式提供要備份的數據,避免破壞生產環境的數據;
在這裏,有必要對Rsync的核心算法,進行講解:
假定在名爲 α 和 β 的兩臺計算機之間同步類似的文件 A 與 B,其中 α 對文件A擁有訪問權,β 對文件 B 擁有訪問權。而且假定主機 α 與 β 之間的網絡帶寬很小。那麼 Rsync 算法將經過下面的五個步驟來完成:
β 將文件 B 分割成一組不重疊的固定大小爲 S 字節的數據塊。最後一塊可能會比 S 小。
β 對每個分割好的數據塊執行兩種校驗:一種是32位的滾動弱校驗,另外一種是128位的 MD4 強校驗。
β 將這些校驗結果發給 α。
α 經過搜索文件 A 的全部大小爲 S 的數據塊(偏移量能夠任選,不必定非要是 S 的倍數),來尋找與文件B 的某一塊有着相同的弱校驗碼和強校驗碼的數據塊。這項工做能夠藉助滾動校驗的特性很快完成。
α 發給 β 一串指令來生成文件 A 在 β 上的備份。這裏的每一條指令要麼是對文件 B 經擁有某一個數據塊而不須重傳的證實,要麼是一個數據塊,這個數據塊確定是沒有與文件 B 的任何一個數據塊匹配上的。
Rsync適用於linux、solaris和bsd,在windows平臺下,有cwRsync。
本文,將以Linux的Rsync和以window的cwRsync爲例講解。
源碼安裝
下載rsync服務端程序,
tar zxvf rsync-2.6.9.tar.gz
cd rsync-2.6.9
./configure --prefix=/usr/local/rsync
make
make install
rpm安裝
yum install rsync
本文以yum來安裝
模式選擇
對於負載比較重的,選擇獨立服務啓動
對於負載比較輕的,選擇以xinet.d啓動,選擇此模式,記得要安裝xinet.d (yum install xinet.d)
獨立運行模式
/usr/bin/rsync --daemon --config=/etc/rsyncd.conf (本例選擇此方法)
若是須要系統開機啓動,能夠把上面命令加入到/etc/rc.local文件中。
建立配置文件和口令文件
touch /etc/rsyncd.conf 主要配置文件
touch /etc/rsync.pas 口令文件,此文件須要注意客戶端和服務器端的格式,後續會講解
關於配置文件rsyncd.conf講解
Rsync的配置文件,分爲兩個部分,全局配置和模塊配置,
#全局設置
uid = root 指定模塊以root用戶來傳輸文件,若是匿名用戶的話,這裏填寫nobody
gid = root 指定模塊以root用戶組來傳輸文件,若是匿名傳輸的話,這裏填寫nobody
use chroot = yes 設置爲YES,表示在傳輸文件以前,定位到根目錄下,即PATH指定的目錄,這樣作,主要是出於安全考慮
pid file = /var/run/rsyncd.pid Rsync守護進程把其PID寫入的文件
lock file = /var/run/rsync.lock 指定支持max connections的鎖文件
log file = /var/log/rsyncd.log 指定Rsync守護進程產生的日誌文件,而不是傳送給syslog
#模塊設置
[Jindie] 模塊名稱,後續上傳下載文件配置時,直接使用此名稱名來指定
path = /sda1/JDdatabase 指定此模塊的根目錄,即文件上傳下載都是在此目錄下進行
ignore errors 指定在 rsync 服務器上運行 delete 操做時是否忽略 I/O 錯誤
read only = false 指定是否容許上傳,false表明容許上傳。
write only = false 指定是否容許下載,false表明容許下載。
list = true 指定當客戶請求列出可使用的模塊,該模塊是否被列出。若是false,能夠建立隱藏的模塊。
hosts allow = 192.168.1.65 指定哪些客戶端能夠訪問鏈接此模塊,能夠指定單個IP,整個網段,好比此例爲單個IP
hosts deny = 0.0.0.0/0 指定哪些客戶端不容許鏈接此模塊,此例爲0.0.0.0/0網段,表明整個網絡
一般表示客戶端表示方式,有以下:
單個IP:192.168.1.65
網段IP:192.168.1.0/24
可解析的主機地址:www.baidu.com
域內主機:*.wine9.com
全部主機:*
多個列表項,要用空格隔開;
auth users = xy 指定認證用戶名,一般由空格或者逗號分隔用戶名列表,只有這些用戶能夠鏈接此模塊,用戶名和密碼,以明文形式,保存在口令文件中
syslog facility = local5 指定日誌等級,通常指發送給rsyslog的日誌等級;
secrets file = /etc/rsync.pas 指定Rsync認證口令文件,只有配置了auth users,此配置才生效,這裏要注意客戶端和服 務器端的配置格式。
ignore nonreadable 指定 rysnc 服務器徹底忽略那些用戶沒有訪問權限的文件,這對於在須要備份的目錄中有些不該該被備份者獲取的文件時很是有意義
timeout 600 設置客戶端鏈接超時時間,確保服務器不會永遠等待一個奔潰的客戶端。
dont compress=*.gz 指定哪些文件在傳輸以前,不須要進行壓縮的文件。
max connections = 4 指定此模塊最大的併發鏈接數爲4,超過的告知隨後再試
exclude指定多個由空格隔開的多個文件或目錄(相對路徑),並將其添加到 exclude 列表中。這等同於在客戶端命令中使用 –exclude 來指定模式。
Exclude from指定一個包含 exclude 規則定義的文件名,服務器從該文件中讀取 exclude 列表定義
include指定多個由空格隔開的多個文件或目錄(相對路徑),並將其添加到 include 列表中。這等同於在客戶端命令中使用 –include 來指定模式
Include from指定一個包含 include 規則定義的文件名,服務器從該文件中讀取 include 列表定義
建立口令文件
touch /etc/rsync.pas #口令文件,保存Rsync用戶和密碼驗證信息,不須要是系統帳號;
vi /etc/rsync.pas
xy:abc123 #格式爲 用戶名:口令,此帳號不用是系統帳號
注意與後面的客戶端口令文件的格式進行比較,相較二者不一樣點,這一點,有不少童鞋容易弄錯了,重要的事情說三遍,注意格式,注意格式,注意格式。
口令文件,須要設置口令文件權限,這一步一樣很是重要,Rsync對權限的要求仍是比較敏感的。
#chown root:root /etc/rsync.pas #root:root 指的是當前啓動此服務的用戶,並設置爲屬主
#chmod 600 /etc/rsync.pas #指定啓動此Rsync服務的用戶的權限爲只讀權限,也就是前面提到的屬主的權限。
客戶端本例,選擇windows的cwrsync工具,安裝不用多說。
新建rsync.pas文件,添加內如以下:
由於我使用的用戶名是xy,此設置的密碼,必須跟服務器端rsync.pas口令文件中設置的密碼同樣,好比本例口令爲abc123;
那麼,本例中設置爲:
abc123
windows口令文件的權限必定要設置正確,不然驗證沒法經過,應將口令文件c:\rsync.pas的權限加入系統登陸的帳號讀取權限以及設置其爲該文件的全部者(這裏跟服務器端有點不一樣,正常來講,不管windows仍是liunx,服務器端的這個用戶名,應該是啓動Rsync服務的用戶名,可是對於windows客戶端來講,通常都是系統登陸帳號)
定位到cwRsync客戶端安裝目錄,C:\Program Files (x86)\cwRsync\bin
chmod 600 /cygdrive/c/rsync.pas
chown administrator /cygdrive/c/rsync.pas #若是沒有chown.exe文件,能夠從服務器端的安裝目錄的bin目錄下直接複製過來就可使用,
注:Rsync對路徑的書寫格式,與windows不一樣,它是遵循,postfix書寫格式,
Rsync同步的六種格式
當Rsync已經作好服務器端和客戶端的配置以後,接下來就是經過Rsync命令,像服務器發起命令請求,來完成文件的同步操做,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]
對於以上六種命令格式,
1) rsync [OPTION]... SRC DEST
拷貝本地文件,當SRC和DEST路徑信息都不包含有單個冒號「:「,就啓動此工做模式,
rsync.exe –vzrtopg /data /backup
2) rsync [OPTION]... SRC [USER@]HOST:DEST
使用一個遠程shell程序(如rsh、ssh)來實現將本地機器的內容拷貝到遠程機器。當DST路徑地址包含單個冒號":"分隔符時啓動該模式。如:rsync -avz *.c foo:src
3) rsync [OPTION]... [USER@]HOST:SRC DEST
使用一個遠程shell程序(如rsh、ssh)來實現將遠程機器的內容拷貝到本地機器。當SRC地址路徑包含單個冒號":"分隔符時啓動該模式。如:rsync -avz foo:src/bar /data
4) rsync [OPTION]... [USER@]HOST::SRC DEST
從遠程rsync服務器中拷貝文件到本地機。當SRC路徑信息包含"::"分隔符時啓動該模式。如:rsync -av root@172.16.78.192::www /databack,其中www是在rsync配置文件中,指定的模塊的名稱。
5) rsync [OPTION]... SRC [USER@]HOST::DEST
從本地機器拷貝文件到遠程rsync服務器中。當DST路徑信息包含"::"分隔符時啓動該模式。如:rsync -av /databack root@172.16.78.192::www,其中www是在rsync配置文件中,指定的模塊的名稱。
6) rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
列遠程機的文件列表。這相似於rsync傳輸,不過只要在命令中省略掉本地機信息便可。如:rsync -v rsync://172.16.78.192/www
上傳同步文件
rsync.exe -vzrtopg --progress --delete /cygdrive/c/test/*.txt xy@192.168.31.13::Jindie --password-file=/cygdrive/c/rsync.pas
解釋:
rsync.exe 即rsync命令
vzrtopg 指定參數,傳輸的詳細信息;
--delete 刪除哪些在DST中存在,而SRC中沒有存在的文件或者目錄
/cygdrive/c/test/*.txt 注意這裏的格式,不能使用windows的格式,必須使用POSTFIX標準格式;
xy@192.168.31.13::Jindie xy是有權訪問服務器的用戶名,192.168.31.13是服務器地址,Jindie是服務器端配置文件中指定的模塊,這個模塊中指定用戶信息和同步路徑;服務器地址和模塊之間,用兩個冒號隔開。
--password-file=/cygdrive/c/rsync.pas 口令文件,當中含有xy帳號的密碼,要與服務器端配置文件rsyncd.conf中指定的口令文件中設置的密碼相同。
下載同步文件
rsync.exe -vzrtopg --progress --delete xy@192.168.31.13::Jindie /cygdrive/c/test --password-file=/cygdrive/c/rsync.pas
一般,由於上傳和下載的方向性不一樣,直接調換源文件路徑和目標地址的路徑,便可。
把上面的命令寫入到批處理器文件中,好比test.bat,經過任務計劃來實現定時備份。
C:\Program Files (x86)\cwRsync\bin
rsync.exe -vzrtopg --progress --delete /cygdrive/c/test/*.txt xy@192.168.31.13::Jindie --password-file=/cygdrive/c/rsync.pas
複製上面命令,保存到test.bat文件中,
開始 -- 全部程序-- 附件--系統工具--任務計劃程序
展開 任務計劃程序庫--Microsoft,右擊 「建立基本任務「
建立基本任務嚮導,輸入 」名稱」
點擊 「下一步」
任務觸發器,根據實際須要,設置每日,每週,每個月同步,這裏,我選擇每日備份,能夠減小帶寬壓力。
設置,每日啓動的時間,這裏設置每日,凌晨1點,點擊 「下一步」
選擇 「啓動程序「
瀏覽,選擇 腳本文件
點擊 」完成 「
到此,部署,已經所有完成。