Sersync實現觸發式文件同步

目錄

1:序言 1

2inotify 1

2.1inotify簡介 1

2.2inotify可以監視的文件系統事件 1

3rsync 1

3.1rsync簡介 1

3.2Rsync特性 2

4sersync 2

4-1sersync簡介 2

4-2sersync優點 2

5:兩種架構 2

5.1inotify-tools + rsync 2

5.2sersync + rsync 2

6:爲什麼要用rsync+sersync 2

7:具體操作: 3

7.1:實驗環境 3

7.2:目標服務器操作 3

(1) 關閉selinux 3

(2) 開啓防火器tcp873端口(rsync默認端口) 3

(3) 安裝rsync服務軟件 4

(4) rsync交由超級管理進程管理 4

(5) 創建rsyncd.conf配置文件 4

(6) 創建用戶認證文件 5

(7) 設置文件權限 5

(8) 啓動rsync 5

(9) 創建同步目錄與同步所用的賬戶 5

7.3:在源服務器上操作 6

(1)關閉selinux 6

(2)開啓防火牆 tcp 873端口 6

(3)安裝rsync客戶端軟件 7

(4)rsync交由xinetd管理 7

(6)創建認證文件,設置文件權限 7

(7) 測試服務器到源服務器之間的數據同步 7

(8) 安裝sersync工具,實時觸發rsync進行同步 8

(8-1)查看服務器內核是否支持inotify 8

(8-2)查看並修改inotify默認參數(inotify默認內核參數值太小) 8

(8-3)安裝sersync 9

(8-4)配置sersync 10

(8-5)設置sersync監控開機自動啓動 10

(8-6)添加腳本監控sersync是否正常運行,因爲有時候sersync腳本會自動關掉,因此需要寫一個腳本自動的去檢測該進程是否存在,不存在就啓動 11

(8-7)腳本寫好後,添加到計劃任務裏,每5分鐘檢查一次 11

7.4:測試 11

(1)刪除 11

(2)新建 12

(3)修改 12

8 可能遇到的問題 13

(1)測試的時候遠程路徑輸錯 13

(2)測試的時候chdir failed 13

(3)同步多個目錄 13

(4)不同用戶同步不同目錄 13

(5)同步多臺主機 13

9 小結 14

附:rsync參數 14

 

 

觸發式文件同步

1:序言

    如果我們後端有多臺網站服務器或者文件服務器,而且沒有好的文件同步機制,那麼當我們升級程序或者更新文件的時候,就需要每臺服務器或者目錄都要更新,這樣就很容易出問題,並很容易導致兩邊的文件不一致,從而出現很多莫名其妙的問題,因此我們需要使用好的文件同步方式來實現幾個後端服務器文件的同步,目前廣泛採用的方案是使用rsync+inotify的方式來實現文件的觸發更新。原理是採用inotify來對文件進行監控,當監控到文件有文件發生改變的時候,就會調用rsync實現觸發式實時同步!基於inotify+rsync進行二次開發實現文件同步的小工具sersync,能夠很方便的實現文件觸發式同步。

2inotify

    2.1inotify簡介

Inotify是基於inode級別的文件系統監控技術,是一種強大的,細粒度的異步機制,它滿足各種各樣的文件監控需要,不僅限於安全和性能,內核要求2.6.13以上,inotify能監控非常多的文件系統事件,通過監控這些事件來監控文件系統是否發生變更,然後通過rsync來更新發生變更的文件。

    2.2inotify可以監視的文件系統事件

IN_ACCESS                          // 文件被訪問

IN_MODIFY                          // 文件被write

IN_ATTRIB                           // 文件屬性被修改,如chmod,chown,touch

IN_CLOSE_WRITE                    // 可寫文件被close

IN_CLOSE_NOWRITE                 // 不可寫文件被close

IN_OPEN                            // 文件被open

IN_MOVED_FROM                   // 文件被移走 如mv,cp

IN_MOVED_TO                      // 文件被移來

IN_CREATE                         // 創建新文件

IN_DELETE                         // 文件被刪除,如rm

IN_DELETE_SELF,                   // 自動刪除,即一個可執行文件在執行時刪除自己

IN_UNMOUNT                      // 宿主文件系統被umount

IN_CLOSE                          // 文件被關閉,等同於

IN_CLOSE_WRITE|IN_CLOSE_NOWRITE

IN_MOVE                          //  文件被移動,等同於IN_MOVED_FROM /TO

備註:上面的文件也包括目錄

3rsync

    3.1rsync簡介

    Rsyncremote synchronize,它在同步文件的同時,可以保持原來文件的權限,時間,軟硬鏈接等附加信息,rsync是用rsync算法提供了一個客戶機和遠程文件服務器的文件同步的快速方法,而且可以通過ssh方式來傳輸文件,這樣保密性也非常好,另外它還是免費的軟件。

    3.2Rsync特性

(1) 能更新整個目錄和樹和文件系統

(2) 由選擇性的保留符號鏈接,硬鏈接,文件屬於,權限,設備以及時間等

(3) 對於安裝來說,無任何特殊權限要求

(4) 對於多個文件來說,內部流水線減少文件等待的延時

(5) 能用ssh,rsh或直接端口作爲傳輸入端口

(6) 支持匿名rsync同步文件,是理想的鏡像工具

4sersync

    4-1sersync簡介

Sersync利用inotifyrsync對服務器進行實時同步,其中inotify用於監控文件系統事件,rsync時目前廣泛使用的同步算法,其優點時只對文件不同的部分進行操作,所以其優勢大大超過使用掛接文件系統的方式來進行鏡像同步。

    4-2sersync優點

(1) Sersync是使用c++編寫,由於只同步發生更改的文件,因此比其它同步工具更節約時      間,帶寬

(2) 安裝方便,配置簡單

(3) 使用多線程進行同步,能夠保證多個服務器實時同步狀態

(4) 自帶出錯處理機制,通過失敗隊列出錯的文件重新出錯,如果仍舊失敗,則每10個小      時對同步的文件重新同步

(5) 自帶crontab功能,只需在xml配置文件中開啓,即可按您的要求,每隔一段時間整體      同步一次

(6) 自帶sockethttp協議拓展,你可以方便的進行二次開發

 

5:兩種架構

    5.1inotify-tools + rsync

(1)inotify-tools只能記錄下被監聽的目錄發生了變化(包括增刪改),並沒有把具體時        哪個文件或者哪個目錄發生了變化記錄下來

(2)Rsync在同步的時候,並不知到具體時哪個文件或者哪個目錄發生了變化,每次都是      對整個目錄進行同步,當數據量很大時,整個 目錄同步都非常耗時(rsync要對整個      目錄遍歷查找對比文件),因此效率很低

    5.2sersync + rsync

(1)sersync可以記錄下被監聽目錄中發生變化的(包括增刪改)具體某一個文件或某一個目錄的名字

(2)Rsync在同步的時候,只同步發生變化的這個文件或目錄(每次發生變化的數據相對於整個目錄來說時很小的,rsync在遍歷查找文件時,速度很快),因此,效率很高

6:爲什麼要用rsync+sersync

(1)sersync是基於inotify開發的,類似於inotify-tools的工具

(2)sersync可以記錄下被監聽目錄中發生變化的(包括增,刪,改)具體某一個文件或某一個目錄的名字,然後使用rsync同步的時候,只同步發生變化的這個文件或者這個目錄

7:具體操作:

    7.1:實驗環境

操作系統:Red Hat Enterprise Linux Server 6.5 (santiago)

源服務器:   192.168.4.5

目標服務器: 192.168.4.100  192.168.4.205

目的: 把源服務器上/home/www.zhang.com 目錄實時同步到目標服務器的  /home/www.zhang.com

    7.2:目標服務器操作

(1) 關閉selinux

setenforce 0                    //立即生效,不用重啓

1AD927882CC948C7B98BFC76CD1A1ED8

 

E6C53C2AD5F14F09B4FB3E84B8A043D6

 

(2) 開啓防火器tcp873端口(rsync默認端口)

A1C0A0C871A5499F8E3FA678204A675E

 

591E2A830C3645C8B28896ED9F854967

 

 

/etc/init.d/iptables restart                     //重啓防火牆使配置生效

(3) 安裝rsync服務軟件

827684A3B8D740E6AD5F30035EE72A23

 

DE5FB1899E0A4C25AB3A38576A785F5A

 

(4) rsync交由超級管理進程管理

152ACC88B53945AD921B7AEB879EF5B7

 

C1BE65EECD2F42E6BD354095BA3D6951

 

/etc/init.d/xinetd start          //啓動xinetd守護進程

(5) 創建rsyncd.conf配置文件

A28116503ED2415ABCF64A9208D63088

 

F1E637B60A40413981DE929A293A26A0

 

(6) 創建用戶認證文件

9B6D8F4AAC4E440F92DD5D7F0B7A006A

 

E988D77D244E4CE788A81EBBE01C16AB

 

 

(7) 設置文件權限

B5FF78856FCF4B9289872CAF1A8B656A

 

(8) 啓動rsync

0A882AC69B3445C0ADFE31941C7205B6

 

(9) 創建同步目錄與同步所用的賬戶

0F7E91C27F9E449088524F619A8A7F7A

 

    7.3:在源服務器上操作

(1)關閉selinux

Setenforce = 0      //立即生效

A8F1F84C0D2E48E4820CD7734E74B16B

 

AC29F0079CDE446E842835A6608A28EB

 

(2)開啓防火牆 tcp 873端口

BE5FA121D6DE49AE9CEEA020381CB83E

 

C9A21B990F114766821BAD5FC2C4C749

 

/etc/init.d/iptables restart

(3)安裝rsync客戶端軟件

EF912AFCF76749959D80EF139B395977

 

7032FE78397D48CFB5DE0033F5F3663A

 

(4)rsync交由xinetd管理

1FD8B8D3184240A6BB8CFF673A582DC7

 

970B1C64BD264A97A7DD9E6F8DA031B1

/etc/init.d/xinetd  start

(6)創建認證文件,設置文件權限

6C5B7449061848D7AE7E07B3C56FC156

 

A9BFC36950EA4B8CA25B2D3B86797909

 

477F1BEE45344C44ACC62366EA438974

 

(7)測試服務器到源服務器之間的數據同步

BCF92DF21BFB4E9A9D39867B7AF4BFC1

 

A5EB0FB3FE49480EB31FB0E00A81143E

 

如果沒變的話就不會傳輸

380778079FE5485AB44A89E2BE80C32E

 

(8)安裝sersync工具,實時觸發rsync進行同步

(8-1)查看服務器內核是否支持inotify

方法一:查看服務器內核是否支持inotigy,如果出現一下內容,說明服務器支持inotify

BF98E07DED4541A2960FD54B903B36DF

 

方法二:linux下支持inotify的內核最小爲2.6.13,可以輸入命令:uname  -r查看內核大小

D573CCFA36854AA6A0637383808BCFDB

 

(8-2)查看並修改inotify默認參數(inotify默認內核參數值太小)

Max_queued_events inotify: 隊列最大長度,如果值太小,會出現**Event Queue Overflow**錯誤,導致監控文件不準確

Max_user_watches: 要同步的文件包含多少目錄,可以用:find /home/www.dalu.com -type d |wc -l統計,必須保證max_user_watches值大於統計結果(這裏/home/www.dalu.com爲同步文件目錄)

Max_user_instances:每個用戶創建inotify實例最大值

ADB0AF496B09441DBF7A79A9FE3D0445

 

臨時修改默認參數

D66BC9B9594D4BBB9210FCD1F9ED0148

 

將修改寫入配置文件

DE35E0AD961B4868A705E1E41C98091E

 

75C49F7791F14FFEAEF1A7373E8915C1

 

(8-3)安裝sersync

下載地址:https://sersync.googlecode.com/files/sersync2.5.4_64bit_binary_stable_final.tar.gz

7D0CB953BD9240C9917C4F9F57BB7738

 

(8-4)配置sersync

5AE09B6C2E0F46FC82FEE26E2E9E6D5E

 

EEC155BDC39A4F89BACA691029A13A77

 

參數說明:

24:<Localpath watch=”/home/www.dalu.com”       //源服務器同步目錄

25:<Remote ip = “192.168.4.100”                 //目標服務器ip,每行一個

25:Name=”home_www.dalu.com”/>               //目標服務器rsync同步用戶名

31:<auth start=”true”                            //認證開始

31:users=”home_www.dalu.com_user”             //目標服務器rsync同步用戶名

31:passwordfile=”/etc/passwd.txt” >               //目標服務器rsync同步用戶的密碼在源                                               服務器的存放路徑

36:<failLog path=”/tmp/rsync_fail_log.sh”           //腳本運行失敗日誌記錄

37:<crontab start=”true”                          //設置爲true,每隔600分鐘執行一次                                                全盤同步

(8-5)設置sersync監控開機自動啓動

E83EBD3D5EA540788E979F535BEF2C6E

 

DD46753DD2534BABBC97C41307AA7298

 

(8-6)添加腳本監控sersync是否正常運行,因爲有時候sersync腳本會自動關掉,因此需要寫一個腳本自動的去檢測該進程是否存在,不存在就啓動

87D089BF05484616B8FBD98A75A0CB9D

 

9C3FEC97F708446C8712743FEBDF6BF5

 

(8-7)腳本寫好後,添加到計劃任務裏,每5分鐘檢查一次

DD832F14136348429F0BB7A15DE49CA7

 

6907E8020447434FAA95A3101CE6F74F

 

    7.4:測試

(1)刪除

查看源服務器同步目錄

C29730E4565B43FF9EB85BEEBD3BE4DF

 

查看目標服務器同步目錄

30FC4E87942B4230935AC2657B6FBB38

 

刪除源服務器同步目錄中以l開頭的文件並查看

59A35B9505B448E29A9AE34190319B93

 

查看目標服務器的同步目錄

6E8210FFD66740CA931A21AA25046257

 

(2)新建

在目標服務器創建新文件

5E733BC27D7A4BF19F00735D12DB2797

 

查看源服務器同步目錄

8F4B54187EB6407BA2AC1918920F1425

 

(3)修改

在源服務器修改new_document.txt內容

058A8895AF9D42D38EEDC0E8B1E5A694

 

查看目標服務器中new_ducument內容

D349168FB7574B27AC677B6D5A18E4C8

 

8 可能遇到的問題

(1)測試的時候遠程路徑輸錯

4CA32E1E7C1D47FAA866AAAB1B6EAA49

 

/去掉即可

8906C44973B84ADAAD17B5279BE2EB20

 

(2)測試的時候chdir failed

初遇這個問題,有點不知所措,因爲這個沒有學過,只做過本地同步,而且沒那麼多選項,沒有那麼多配置文件項,只能百度,但是度娘說是selinux的問題,但是我早就把selinux給關了,按他的方法做下來,依然沒有解決問題。只能翻看自己的配置文件,最後發現,配置文件中的同步目錄和創建的同步目錄不是一個目錄,改了之後可以了。

(3)同步多個目錄

Sersync是多線程的,可以同步多個目錄,但是不能寫在同一個配置文件中,必須重寫,並啓起一個sersync進程。

(4)不同用戶同步不同目錄

剛開始將用戶和密碼都寫在了一個文件中,但是老報語法錯誤,之後我將認證文件寫在了不同文件中,並在相應的文件中做了修改,並設置爲600權限,就可以了。

(5)同步多臺主機

要是同步多臺主機,修改.xml文件,多加幾個remote ip 就可以了

544EDF4068924E268B3DE09DD574DA56

 

9 小結

(1)通過以上操作,可使服務器的/home/www.dalu.com/目錄能從主服務器實時更新,升級的時候只升級主服務器的文件,從服務器也會自動更新過去,減少工作量以及出錯的概率。

(2)當同步的目錄數據量不大時,建議使用inotify+rsync;當數據量很大時(幾百G甚至1T以上),建議使用sersync+rsync

附:rsync參數

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 指定使用rshssh方式進行數據同步

 

--rsync-path=PATH 指定遠程服務器上的rsync命令所在路徑信息

 

-C, --cvs-exclude 使用和CVS一樣的方法自動忽略文件,用來排除那些不希望傳輸的文件

 

--existing 僅僅更新那些已經存在於DST的文件,而不備份那些新創建的文件

 

--delete 刪除那些DSTSRC沒有的文件

 

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

IN_ACCESS   被監控項目或者被監控目錄中的條目被訪問過。例如,一個打開的文件被讀取。

IN_MODIFY   被監控項目或者被監控目錄中的條目被修改過。例如,一個打開的文件被修改。

IN_ATTRIB     被監控項目或者被監控目錄中條目的元數據被修改過。例如,時間戳或者許可被修改。

IN_CLOSE_WRITE        一個打開的,等待寫入的文件或目錄被關閉。

IN_CLOSE_NOWRITE  一個以只讀方式打開的文件或目錄被關閉。

IN_CLOSE    一個掩碼,可以很便捷地對前面提到的兩個關閉事件(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)進行邏輯操作。

IN_OPEN    文件或目錄被打開。

IN_MOVED_FROM     被監控項目或者被監控目錄中的條目被移出監控區域。該事件還包含一個 cookie 來實現 IN_MOVED_FROM 與 IN_MOVED_TO 的關聯。

IN_MOVED_TO          文件或目錄被移入監控區域。該事件包含一個針對 IN_MOVED_FROM 的 cookie。如果文件或目錄只是被重命名,將能看到這兩個事件,如果它只是被移入或移出非監控區域,將只能看到一個事件。如果移動或重命名一個被監控項目,監控將繼續進行。參見下面的 IN_MOVE-SELF。

IN_MOVE    可以很便捷地對前面提到的兩個移動事件(IN_MOVED_FROM | IN_MOVED_TO)進行邏輯操作的掩碼。

IN_CREATE 在被監控目錄中創建了子目錄或文件。

IN_DELETE  被監控目錄中有子目錄或文件被刪除。

IN_DELETE_SELF  被監控項目本身被刪除。監控終止,並且將收到一個 IN_IGNORED 事件。

IN_MOVE_SELF    監控項目本身被移動。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章