rsync+inotify實現數據實時備份
§·實驗案例:rsync配合inotify實現數據的實時備份 5
§·rsync簡單介紹
傳統的數據備份方式有cp命令,cp命令的源文件和目標文件都在本地,實現的是對文件的一種完整復制。
wget命令通過網絡進行備份,不支持增量備份。
§·什么是rsync
rsync是Linux/unix系統下的文件同步和數據傳輸工具,它采用的“rsync”算法,使一個客戶機和遠程文件服務器之間的文件同步。通過rsync可以將同一個服務器的數據從一個分區備份到另一個分區,也可以將本地系統的數據通過網絡傳輸當時備份到任何一個遠程主機上,rsync可以在中斷之后恢復傳輸,rsync只傳輸源文件和目標文件之間不一致的部分,rsync可以執行完整備份或增量備份。
§·rsync的功能特性
rsync即remote sync。從軟件名稱上就可以看出來它實現的功能,rsync有如下特性:
1.可以鏡像保存整個目錄樹和文件系統;
2.可以增量同步數據,文件傳輸效果高,因而同步時間很短;
3.可以保持原有文件的權限,時間等屬性;
4.加密傳輸數據,可以保證數據的安全性;
5.可以使用rcp ssh等方式傳輸文件,當然也可以通過Socket連接傳輸文件;
6.支持匿名傳輸。
介紹:rsync:remote sync(遠程同步,也可以做本地同步,實現的是增量同步,對比文件特征碼)
功能:本地同步如cp ,遠程同步如:scp (rsync不具備加密)
§·rsync的優點和不足
rsync具有安全性高,備份迅速,支持增量備份的優點,通過rsync可以解決對實時性要求不高的數據備份需要。
rsync在高端業務系統中逐漸暴露出很多的不足:
1,rsync同步數據時,需要掃描所有文件后進行對比,然后進行差量傳輸。如果如文件數量達到百萬甚至千萬量級,掃描所有文件將是非常耗時的。
2.其次rsync不能實時監控同步數據。
§·初識inotify
inotify是一種強大的 細粒度的 異步的文件系統時間監控機制,linux內核從2.6.13版本起,加入了對inotify的支持。通過inotify可以監控文件系統中添加,刪除,修改,移動等各種細微時間,利用這個內核接口,第三方軟件可以監控文件系統下文件的各種變化情況,inotify-tools就是這樣的一個第三方軟件。
rsync可以實現觸發式的文件同步,但是通過crontab守護進程方式進行觸發,同步的數據和實際的數據會有差異,而inotify可以監控文件系統的各種變化,當文件有任何變動時,會觸發rsync同步,這樣剛好解決了同步數據的實時性問題。
§·rsync命令工作模式
第一種:shell模式,也稱為本地模式
Local: rsync [OPTION...] SRC... [DEST] [root@love681 rsync-test-dir]# rsync -av /etc ./ [root@love681 rsync-test-dir]# ls etc
第二種:遠程shell模式,此時可以利用ssh協議承載其數據傳輸過程
第三種:列表模式(干跑模式)其工作方式與ls相似,僅列出源的內容: -nv
Access via remote shell: Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST](獲取目標文件) Push: rsync [OPTION...] SRC... [USER@]HOST:DEST(上傳文件) # rsync fstab root@10.1.16.20:/root/rsync-test
第四種:服務器模式,此時rsync可以工作為守護進程,能夠接收客戶端的數據傳輸請求;在使用時,可以在客戶端使用rsync命令把文件發送給守護進程,也可以向服務器獲取數據文件。
§·rsync常用命令選項
-n:在不確定命令是否能按愿意執行時,務必要事先測試:-n可以完成此功能;
-v:–verbose ,詳細輸出模式;
-q:–quiet,靜默模式;
-c:–checksum,開啟校驗功能,強制對文件傳輸進行校驗;
-r:–recursive,遞歸模式;
-a:–archives,歸檔,保留文件的原有屬性;
-p:–perms 保留文件的權限;
-t:–times 保留文件的時間戳;
-l:–links 保留文件的符號鏈接;
-g:–group保留文件的屬組;
-o:–owne保留文件的屬主;
-D: –devices 保留設備文件
-e:ssh 表示使用ssh協議作為承載;
-z : 對文件壓縮后傳輸;
–progress : 顯示進度條;
–stats :顯示如何執行壓縮和傳輸的過程
—
注意:rsync命令使用時,如果源參數的末尾有斜線,就會復制指定目錄的內容,而不會復制目錄本身;如果沒有斜線,則會復制目錄本身;目標參數末尾的斜線沒有作用,命令使用如下:
#rsync -r /mydata/data /backups/ :會把目錄data直接同步到/backups目錄中;
#rsync -r /mydata/data/ /backups/ :會把目錄data/中的所有文件直接同步到/backups目錄中;
§·配置rsync以守護進程的方式運行
※·安裝并啟動 xinetd
#yum -y install xinetd rsync
※·為rsync服務器提供配置文件
配置文件為: /etc/rsyncd.conf
定義一個全局配置和多個rsync的共享配置:
#Global Settings uid = nobody gid = nobody use chroot = no max connetions = 10 strict modes = yes pid file = /var/run/rsyncd.pid log file = /var/log/rsyncd.log #Directory to be rsynced [rsynced_name] path = /path/to/some_dir ignore errors = yes read only = no write only = no hosts allow = white_list_ip/net hosts deny = *
說明:
1.二者都不出現時,默認為允許訪問;
2.只出現hosts allow : 定義白名單,但是沒有被匹配到的主機由默認規則處理,即為允許;
3.只出現hosts deny : 定義黑名單,出現在名單中的都被拒絕,不匹配的即為允許;
4.二者同時出現,先檢查hosts allow 如果匹配就allow,否則,檢查hosts deny,如果匹配則拒絕;如果二
者均無匹配,則有默認規則處理,即為允許。
list = falseuid = rootgid = rootauth users = usernamesecrets file = /etc/rsyncd.passwd
※·配置/etc/rsyncd.passwd文件格式
文件格式(明文):
username:password
文件權限設置為:600
※·配置服務開機啟動
#chkconfig rsync on
#service xinetd start
監聽于 873/tcp
※·客戶端測試命令
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] (下載數據) rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST] 格式:rsync -av username@10.1.16.20::rsynced_name/* ./ Push: rsync [OPTION...] SRC... [USER@]HOST::DEST (上傳數據) rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST 格式 :rsync -av /etc username@10.1.16.20::rsynced_name
§·實驗案例:rsync配合inotify實現數據的實時備份
§·rsync備份服務器的搭建
(別人可以備份數據到服務器,也可以把服務器上的數據同步到自己的本地去)
1 .提供其配置文件:
~]# yum -y install xinetd rsync #服務器端安裝rsync服務器軟件(該軟件也包含客戶端工具) ~]# vim /etc/rsyncd.conf #編輯主配置文件(默認該文件是沒有的) uid = nobody gid = nobody use chroot = no max connetions = 10 strict modes = yes pid file = /var/run/rsyncd.pid log file = /var/log/rsyncd.log [ixdba] #服務器被訪問時的對外地址(必要重要) path = /webdata #服務器上世紀存放數據的目錄 comment = ixdba files #描述信息 ignore errors = yes #是否忽略錯誤 read only = no #只讀 關閉 write only = no #只寫 關閉 hosts allow = * #允許訪問的主機 list = false uid = root #啟動rsync服務的用戶 gid = root #啟動rsync該服務的組 auth users = user1,user2 #遠程登錄服務器的認證用戶 secrets file = /etc/server.pass #認證用戶的密碼文件
2.由于rsync服務為xinetd管理的服務的,添加rsync服務開機自動啟動
#chkconfig --add rsync #chkconfig rsync on #service xinetd start 監聽于 873/tcp
3.設置服務器密碼文件:
注意把文件權限改為:600權限,不讓其他人可以看到密碼
vim /etc/server.pass user1:123456 user2:666666
※·rsync客戶端連接服務器
1.客戶端準備密碼文件,方便自動登錄rsync服務器
注意把文件權限改為:600權限,不讓其他人可以看到密碼
vim /etc/rsync-back 123456
2.使用命令連接到rsync服務器
[root@Centos7 ~]# rsync -vzrtopg --delete --progress user1@10.1.16.44::ixdba /ixdba.net --password-file=/etc/server.pass
# -vzrtopg : 查看前面介紹,備份文件是不改變文件屬性
v是:即詳細輸出模式;
z是:表示–compress壓縮
r是:表示–recursive,對子目錄以遞歸模式處理
t是:–times,保持的時間信息
o是:–owner,保持文件的屬組
p是:–perms,保持文件的權限
g是:–group 保持文件的屬組信息
# –delete : 以rsync服務器端基準進行數據鏡像同步,以服務器的數據為準
# –progress :顯示數據鏡像同步的過程
# user1@10.1.16.44::ixdba :對rsync服務器ixdba模塊進行備份
# /ixdba.net : 客戶端存放數據的路徑
# –password-file=/etc/server.pass :指定user1的密碼文件路徑
3.讓其自動備份服務器上的數據,需要在crontab計劃任務
crontab -e 30 3 * * * /usr/bin/rsync -vzrtopg --delete --progress user1@10.1.16.44::ixdba /ixdba.net --password-file=/etc/server.pass
§·rsync服務器配置小結:
以上兩步的搭建保證了客戶端可以把服務器上的數據每天備份一次,我們配合inotify程序的,來實現數據實現備份。linux 2.6.13以后的內核提供了 inotify文件監控機制,通過rsync與inotify的組合,完全可以實現rsync服務器端與客戶端數據的實時同步。
§·安裝inotify工具inotify-tools
※·判斷系統內核是否支持inotify
1.內核版本大于:2.6.13
[root@localhost ixdba.net]# uname -r 2.6.18-308.el5 [root@localhost ixdba.net]# ll /proc/sys/fs/inotify/ 總計 0 -rw-r--r-- 1 root root 0 10-14 22:51 max_queued_events -rw-r--r-- 1 root root 0 10-14 22:51 max_user_instances -rw-r--r-- 1 root root 0 10-14 22:51 max_user_watches [root@localhost ixdba.net]#
※·安裝inotify-tools
◎·該軟件需要自己下載編譯安裝。inotify-tools-3.13
~}#cd inotify-tools-3.13 ~}#./configure ~}#make ~}#make install
◎·inotify-tools-3.13生成的兩個命令文件
生成的兩個程序文件
[root@love681 inotify-tools-3.13]# ll /usr/local/bin/inotifywa* -rwxr-xr-x 1 root root 38582 Oct 13 13:25 /usr/local/bin/inotifywait -rwxr-xr-x 1 root root 40353 Oct 13 13:25 /usr/local/bin/inotifywatch [root@love681 inotify-tools-3.13]#
inotifywait :用于等待文件或文件集上的一個特定時間,可以監控任何文件和目錄設置,并且可以遞歸地監控整個目錄樹。
inotifywatch :用于手機被監控的文件系統統計數據,包括每個inotify時間發生多少次等信息。
————————————————————————————————————————————————
關于inotify定義的一些接口參數,可以限制inotify消耗kernel menory的大小,有一下幾個參數可以了解下:
[root@love681 /]# cat /proc/sys/fs/inotify/max_queued_events 16384 #表示調用inotify_init是分配到的inotify instances中可排隊的event數的最大值,超出這個值的時間被丟棄,但會觸發IN_Q_OVERFLOW事件,默認值為:16384 [root@love681 /]# cat /proc/sys/fs/inotify/max_user_instances 128 #表示每一個real user ID可參見的inotify nstances的數量上限,默認值為 128 [root@love681 /]# cat /proc/sys/fs/inotify/max_user_watches 8192 #表示每個inotify 實例相關聯的watches的上限,也就是每一個inotify實例可以監控的最大目錄數量,如果監控的文件數目巨頭,需要根據時間情況適當的增加此值的大小。默認為:8192,調整方式為: echo 30000000 > /proc/sys/fs/inotify/max_user_watches inotify instances 英文翻譯為:通知實例
inotifywait命令相關解釋
inotifywait是一個監控等待事件,可以配合shell腳本使用它。下面介紹一下常用的參數:
-m :—monitor ,表示始終保持事件監聽狀態
-r : –recursive , 表示遞歸查詢目錄
-q : –quiet ,表示打印出監控事件
-e : –event 通過此參數可以指定要監控的事件,常見的事件有 modify ,delete ,create , attrib 等等
modify : 修改文件
delete : 刪除文件
create : 創建文件
attrib : 改變文件的屬性
close_write : 等待寫的操作完成
◎使用inotifywait腳本實時監控文件狀態觸發rsync上傳命令
在服務器上搭建好rsync服務,客戶機就可以自動的定時的上傳文件到服務器上,不需要手工的輸入用戶名和密碼,那我們現在只需要在客戶機上配置一個腳本,當客戶機上指定的監控目錄有文件變化時,自動觸發本地的rsync命令上傳指定監控下的文件即可。
配置實例腳本一 :inotify腳本命令如下:
####inotify+rsync實現數據實時同步的腳本文件 #!/bin/bash host=192.168.12.131 src=/web/wwwroot/ dst=web1 user=user1 inot_cmd=/usr/local/bin/inotifywait ###把命令產生的信息管道傳到while循序語句中 inot_cmd -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 $user@$host::$dst echo "${files} was resynced " >> /tmp/rsync.log 2>&1 done #### --timefmt : 指定時間的輸出格式 #### --format : 指定變化文件的詳細信息 這兩個參數一般配合使用,通過指定輸出格式輸出類型一下的內容: 15/04/10 00:29 /web/wwwroot/ixdba.sh DELETE ,ISDIR was rsynced 15/04/10 00:30 /web/wwwroot/index.html MODIFY was rsynced 15/04/10 00:31 /web/wwwroot/prce-8.02.tar.gz CREATE was rsynced
這個腳本的作用就是通過inotify監控文件目錄的變化,監控的文件變化為 -e后面定義的變化:創建文件,刪除文件,修改文件,文件屬性修改,只有其中一項有變動,就執行rsync把本地文件上傳至rsync服務器上。
通過這樣的腳本,就可以實現在一臺本地rsync客戶端電腦上修改文件,可以自動同步數據到遠程或本地服務器上,服務器的數量可以是多臺。
§·小結:rsync配合inotify實現數據的實時備份
1 . 搭建多臺rsync服務器,搭建rsync服務器的要求就是,本地的客戶機上傳數據和下載數據不需要人工的干預即 可實現
2. 設置rsync客戶端實現備份遠程服務器上數據,或把本地的數據同步到遠程服務器上。
如果是備份遠程rsync服務器上的數據,可以在本地rsync客戶機上做一個計劃任務,定時去備份服務器上的數據。
如果是需要把本地的數據實時的上傳到rsync服務器上去,就需要配合inotify的通知機制,實時的監控本地需要同步是的數據,當有數據該變時,inotify腳本自動觸發rsync命令同步本地數據至服務器上。
3. inotify是由內核提供的文件系統監視機制,可以監視文件的 打開,關閉,移動/重命名,刪除,創建或者改變屬性等等,具體的inotify的機制,參考擴展 notify的機制一文。
原創文章,作者:linux_root,如若轉載,請注明出處:http://www.www58058.com/56003