1. 程式人生 > >利用inotify和rsync實現數據同步

利用inotify和rsync實現數據同步

幫助信息 delete 版本 rbo modify 啟用 gre 多個 roo

一.rsync是什麽?

它是Linux系統下文件同步可數據傳輸的工具,采用rsync算法使客戶機與服務器,主服務器與備份服務器數據同步。rsync也能實現中斷後恢復傳輸。rsync支持增量備份。
二.rsync有4種模式
1.本地模式。
2.遠程shell模式
3.查詢模式
4.C/S模式
我們來安裝rsync測試一下吧。安裝很簡單的
tar xvf rsync-3.0.9.tar.gz

cd rsync-3.0.9

./configure

make && make install

rsync --help 查看選項
-v, --verbose ##詳細模式

-r, --recursive ##遞歸

-u, --update ##更新

-t, --times ##保持時間

-z, --compress ##啟用壓縮

-o, --owner ##保持屬主

-g, --group ##保持屬組

-p, --perms ##保持權限

--delete ##以前邊目錄為準,同步

--progress ##顯示傳輸過程

--exclude=PATTERN ##不同步模式匹配的文件

--password-file=FILE ##密碼文件位置

###########################更新參數############################

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 顯示幫助信息

########################更新完畢#####################################

1.本地模式

rsync -rv /etc/passwd . ##拷貝passwd 到當前目錄

2.遠程shell模式
rsync -rv /etc/passwd 172.16.1.3:/tmp ##把passwd拷貝到遠程主機上

3.列表模式

############################更新##############################

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 [email protected]::www /databack
  5)從本地機器拷貝文件到遠程rsync服務器中。當DST路徑信息包含"::"分隔符時啟動該模式。如:rsync -av /databack [email protected]::www
  6)列遠程機的文件列表。這類似於rsync傳輸,不過只要在命令中省略掉本地機信息即可。如:rsync -v rsync://172.16.78.192/www

#################################更新完畢####################################################

rsync -r 172.16.1.3:/tmp ##查看遠程目錄下的文件

前三種模式都可以用ssh來實現,我們著重來研究第四種
規劃:
Master:172.16.1.2
Slave:172.16.1.2
一、Master上安裝配置rsync
1.1 安裝就不說了,剛才那樣就行
1.2 配置rsync
安裝時生成配置文件樣例在/usr/local/share/man/man5下,叫rsyncd.conf.5 拷備到/etc/下叫rsyncd.conf,rsyncd.conf文件由多個模塊組成,包含全局參數和模塊參數,前面的是註釋,主要內容有:
uid = nobody ##全局配置開始,指文件傳輸時模塊進程的uid

gid = nobody ##同上gid

   use chroot = no          ##是否讓進程離開工作目錄

   max connections = 4      ##最大並發數

   syslog facility = local5 ##記錄日誌的facility

   pid file = /var/run/rsyncd.pid  ##pid位置

   [ftp]                    ##模塊配置開始

path = /var/ftp/pub ##需要備份的目錄,必須指定,

comment = whole ftp area ##註釋

   read only = no           ##客戶端是否只讀

   write only = no          ##是否只能寫

   hosts allow = *          ##允許同步主機

   hosts deny = 192.168.0.0/24 ##禁止訪問的主機

list = yes ##是否允許列出所有模塊

uid = root

gid = root

   auth users = slave       ##可以連接該模塊的user

   secrets file = /etc/rsync.pass  ##密碼文件在哪,需要自己建立

1.3 建立密碼文件 /etc/rsync.pass 如下格式,並確保權限為600或400
slave:helloworld

1.4 啟動守戶進程
rsync --daemon ##啟動守護進程

netstat -tlnp |grep rsync 查看是否啟動,查看監聽端口

二、slave端rsync設置
2.1 安裝rsync 看上方
2.2 不需要配置文件,直接運行命令即可,為了不用輸入密碼,建立密碼文件,並確保權限為600
echo "helloworld" >/root/rsync.pass.slave

2.3 rsync的選項過多,我們把它寫到一個腳本中,需要的時候運行即可
vi /root/rsync.sh

#!/bin/bash

/usr/local/bin/rsync -vzrtogp --delete --progress \

[email protected]::ftp /var/ftp/pub --password-file=/root/rsync.pass.slave

chmod +x /root/rsync.sh ##修改權限

三、測試
在master的目錄中添加文件,查看是否能同步
cp /etc/passwd /var/ftp/pub

slave運行腳本測試
sh /root/rsync.sh

查看/var/ftp/pub 中是否多了個文件
四、客戶端創建備份策略,每隔5秒同步一次
大家都知道cron只能精確到分,下面我們用腳本實現每5秒同步一次
vi cron.sh

#!/bin/bash

for ((i=1;i<=12;i++));do

echo "/1 * /root/rsync.sh" >> /var/spool/cron/root

sleep 5

done

再次在/var/ftp/pub中添加文件,看是否能正常同步。
這種方式有個弊端,就是客戶端每隔5秒須同步一次,這樣的頻率是十分浪費資源的,間隔時間長的話數據又不能保持一致,rsync每次同步都需要比對文件更改,如果文件多了,這樣是非常低效的,所以我們得用更高效的方法,那就是inotify。
inotify是什麽?
inotify 是一種強大的,細粒度的異步文件系統事件監控機制。通過inotify可以監控文件系統中的添加、刪除、修改等,利用這個內核接口,第三方的軟件可以監控文件系統的變化,從而觸發rsync的同步操作,我們用inotify-tools來實現這個功能。

思路:inotify-tool應該裝在需要被監控的主機上,假如我們把它安裝在master上,監控自己的文件系統,當文件系統發生變化時,它應該通知客戶端來同步,比如:

ssh 172.16.1.3 ‘/root/rsync.sh‘

前提雙機ssh互信。

還有一種做法可能比這個好些,把inotify-tool安裝在slave上,來監控slave的文件系統,當slave中文件系統有變化時,就把自己的數據同步到master上去,不過好想兩者角色調轉了。

五、嘗試第一種思路

5.1 master上安裝notify-tools

下載:http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz

tar xvf inotify-tools-3.14.tar.gz

cd inotify-tools-3.14

./configure

make && make install

5.2 生成了兩個執行程序 usr/local/bin/inotifywait /usr/local/bin/inotifywatch,inotifywait用來監控文件系統的更改,inotifywatch用來統計更改文件系統事件的。

5.3 inotifywait的一些參數

-m --monitor ##始終監控

-r --recursive ##遞歸的

-q --quiet ##打印監控事件

-e --event ##指出要監控的事件,有:modify,delete,create,attrib等

5.4 運行 inotifywait -mrq --timefmt ‘%d/%m/%y %H:%M‘ --format ‘%T %w%e‘ -e modify,delete,create,attrib /var/ftp/pub 往/var/ftp/pub中添加一個文件,查看有沒有輸出,如果有,代表一切正常。

--timefmt 時間格式

--format 變化文件的詳細信息

5.5 寫一個腳本來實現,當/var/ftp/pub/中文件有變化時,讓slave同步

vi inotify_slave.sh

#!/bin/bash

inotifywait -mrq --timefmt ‘%d/%m%y %H%M‘ --format ‘%T %w%f%e‘ \

-e modify,delete,create,attrib /var/ftp/pub | while read files

do

ssh 172.16.1.3 ‘/root/rsync.sh‘    ##雙機互信已經做好

done

5.6 測試

運行腳本,在/var/ftp/pub中添加文件測試

sh inotify_slave.sh &

cp -R /etc/rc.d/init.d /var/ftp/pub

查看slave中文件是否同步

六、另一種思路,在slave上安裝inotify_tools

6.1 安裝就不贅述了

6.2 結束master上運行的腳本

6.3 寫個腳本來監控slave的/var/ftp/pub,當/var/ftp/pub文件系統發生變化,立刻同步到master上,這樣一來slave就成了真正的master,master變成了slave

vi inotify_to_master.sh

#!/bin/bash

inotifywait -mrq --timefmt ‘%d/%m%y %H%M‘ --format ‘%T %w%f%e‘ \

-e modify,delete,create,attrib /var/ftp/pub/ | while read files

do

  rsync -vzrtogpg --delete --progress  /var/ftp/pub [email protected]::ftp \

--password-file=/root/pass.rsync

done

6.4 往slave的/var/ftp/pub中添加文件,運行測試

sh inotify_to_master.sh &

cp -R /etc/yum /var/ftp/pub

查看master中是否同步.

利用inotify和rsync實現數據同步