rsync+inotify實時同步
資料實時同步
在生產中有一種需求是,當目錄下的檔案資料發生變化時,就將資料備份到備份伺服器上。實現這樣的需求需要做到以下兩點:
- 利用監控服務(inotify),監控到要同步伺服器的目錄檔案的變化
- 發現目錄資料發生變化就利用rsync服務將資料傳送到備份伺服器
因此,利用rsync+inotify可實現資料的實時同步。
Inotify介紹
Inotify是一種強大的,細粒度的。非同步的檔案系統事件監控機制,linux核心從2.6.13起,加入了 Inotify支援,通過Inotify可以監控檔案系統中新增、刪除,修改、移動
等各種事件,利用這個核心介面,第三方軟體就可以監控檔案系統下檔案的各種變化情況,而 inotify-tools 正是實施這樣監控的軟體。
Inotify實際是一種事件驅動機制,它為應用程式監控檔案系統事件提供了實時響應事件的機制,而無須通過諸如cron等的輪詢機制來獲取事件。cron等機制不僅無法做到實時性,而且消耗大量系統資源。相比之下,inotify基於事件驅動,可以做到對事件處理的實時響應,也沒有輪詢造成的系統資源消耗,是非常自然的事件通知介面,也與自然世界事件機制相符合。
Inotify安裝
環境介紹
[root@moli-linux03 ~] uname -r 3.10.0-862.2.3.el7.x86_64 [root@moli-linux03 ~] cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core)
安裝前提
需要2.6.13以後核心版本才能支援inotify軟體。2.6.13核心之後版本,在沒有安裝inotify軟體之前,應該有這三個檔案。
[root@moli-linux03 ~] ll /proc/sys/fs/inotify/ 總用量 0 -rw-r--r--. 1 root root 0 2月3 12:24 max_queued_events -rw-r--r--. 1 root root 0 2月3 12:24 max_user_instances -rw-r--r--. 1 root root 0 2月3 12:24 max_user_watches [root@moli-linux03 ~]
三個檔案的說明
檔案 | 預設值 | 作用說明 | |
---|---|---|---|
max_user_watches | 8192 | 設定inotifywait或inotifywatch命令可以監視的檔案數量(單程序) | |
max_user_instances | 128 | 設定每個使用者可以執行的inotifywait或inotifywatch命令的程序數 | |
max_queued_events | 16384 | 設定inotify例項事件(event)佇列可容納的事件數量 |
注:可以將三個檔案的數值調大,監聽更大的範圍
安裝方式
可選擇yum安裝或者編譯安裝,yum安裝需要配置有epel源,編譯安裝需要到github下載原始碼包。
yum安裝
yum install -y inotify-tools
編譯安裝(原始碼包地址:https://github.com/rvoicilas/...
tar -zxftar -zxf inotify-tools-3.13.tar.gz ./configure make make install
inotify主要安裝的兩個軟體
inotifywait
: (主要)
在被監控的檔案或目錄上等待特定檔案系統事件(open close delete等)發生,執行後處於阻塞狀態,適合在shell指令碼中使用
inotifywatch
:
收集被監控的檔案系統使用的統計資料,指檔案系統事件發生的次數統計。
說明:在實時實時同步的時候,主要是利用inotifywait對目錄進行監控
inotifywait重要命令引數說明
引數 | 說明 |
---|---|
-m | 始終保持事件監聽 |
-r | 遞迴監控目錄資料資訊變化 |
-q | 輸出資訊少(只打印事件資訊) |
-timefmt | 指定時間輸出格式 |
-format | 列印使用指定的輸出類似格式字串;即實際監控輸出內容 |
-e | 指定監聽指定的事件,如果省略,表示所有事件都進行監聽 |
-e[引數]可以指定的事件型別
事件名稱 | 說明 |
---|---|
close_write | 檔案或目錄關閉,在寫入模式開啟之後關閉的。 |
move | 檔案或目錄不管移動到或是移出監控目錄都觸發事件 |
create | 檔案或目錄建立在監控目錄中 |
delete | 檔案或目錄被刪除在監控目錄中 |
示例測試
對一個伺服器開啟兩個終端視窗,終端1執行建立,刪除,修改,移動檔案等操作
,終端2執行inotifywait
命令。
建立事件
[root@終端2 ~] inotifywait -mrq/root/rsync_test --timefmt "%d-%m-%y %H:%M" --format "%T %w%f 事件資訊: %e" -e create [root@終端1 rsync_test]# touch 1.txt 下面顯示出事件資訊,在終端一執行建立檔案操作之後終端二才顯示的事件 03-02-19 12:48 /root/rsync_test/1.txt 事件資訊: CREATE
刪除事件
[root@moli_linux1 ~]#inotifywait -mrq/data --timefmt "%d-%m-%y %H:%M" --format "%T %w%f 事件資訊: %e" -e delete [root@moli_data ~]# rm -f 1.txt
修改事件
[root@moli_linux1 ~]# inotifywait -mrq/data --timefmt "%d-%m-%y %H:%M" --format "%T %w%f 事件資訊: %e" -e close_write [root@moli_data ~]# echo "hahaha"> 2 .txt
移動事件move_to
把其他目錄檔案移動到監控目錄
[root@moli_linux1 ~]#inotifywait -mrq/data --timefmt "%d-%m-%y %H:%M" --format "%T %w%f 事件資訊: %e" -e moved_to [root@moli_data ~]# mv /etc/passwd .
移動事件move_from
把監控目錄檔案移到其他目錄
[root@moli_linux1 ~]# inotifywait -mrq/data --timefmt "%d-%m-%y %H:%M" --format "%T %w%f 事件資訊: %e" -e moved_from [root@moli_data ~]# mv 2.txt /tmp
inotifywait --timefmt時間引數說明
命令引數 | 說明 |
---|---|
%y | 年份資訊,顯示資訊為十進位制,並且沒有世紀資訊 |
%m | 顯示月份,顯示資訊為十進位制(範圍 01-12 ) |
%d | 每月的第幾天,顯示倍息為十進位制數(範圍是 01-31 ) |
%H | 小時資訊,顯示資訊為十進位制,使用 24小時制(範圍 00-23 ) |
%M | 顯示分鐘,顯示資訊為十進位制(範圍 00-59 ) |
inotifywait --format引數說明
命令引數 | 說明 |
---|---|
%w | 事件出現時,監控檔案或目錄的名稱資訊 |
%f | 事件出現時,將顯示監控目錄下觸發事件的檔案或目錄資訊,否則為空 |
%e | 顯示發生的事件資訊,不同的事件資訊用逗號進行分隔 |
%T | 輸出時間格式中定義的時間格式資訊,通過 --timefmt option 語法格式指定時間資訊這個格式是通過strftime函式進行匹配時間格式資訊的 |
Linux檔案同步工具rsync
介紹
rsync是一款開源,快速,多功能的可實現增量的本地或遠端的資料映象同步備份的優秀工具。適用於多個平臺。從軟體名稱可以看出來是遠端同步的意思(remote sync)。可使本地主機不同分割槽或目錄之間及本地和遠端兩臺主機之間的資料快速同步映象,遠端備份等功能。
在同步備份時,預設情況下,rsync通過其獨特的“quick check”演算法,僅同步大小或者最後修改時間發生變化的檔案或目錄(也可根據許可權,屬主等變化同步,需要制定引數)。甚至是隻同步一個檔案裡變化的內容部分,所以可以實現快速的同步資料的功能。
提示:傳統的cp,scp工具拷貝每次均為完整拷貝,而rsync除了完整拷貝,還具備增量拷貝的功能,因此從此效能及效率上更勝一籌。
Rsync的特性
1)支援拷貝特殊檔案如連結,裝置等
2)可以有排除指定檔案或目錄同步的功能,相當於打包命令tar
3)可以保持原來檔案或目錄的許可權,時間,軟硬連結等所有屬性均不改變。
4)可實現增量同步,即只同步發生變化的資料,因此資料傳輸效率更高
5)可以使用rcp,rsh,ssh等方式來配合傳輸檔案,也可以通過直接的socker連結
6)支援匿名的或認證的程序模式傳輸,方便進行資料備份及映象。
核心演算法介紹
假定在名為α和β的兩臺計算機之間同步相似的檔案 A 與 B ,其中α對檔案 A 擁有訪問權,β對檔案 B 擁有訪問權。並且假定主機α與β之間的網路頻寬很小。那麼 rsync 演算法將通過下面的五個步驟來完成:
- β將檔案 B 分割成一組不重疊的固定大小為 S 位元組的資料塊。最後一塊可能會比 S 小。
- β對每一個分割好的資料塊執行兩種校驗:一種是 32 位的滾動弱校驗,另一種是 128 位的 MD4 強校驗。
- β將這些校驗結果發給α。
- α通過搜尋檔案 A 的所有大小為 S 的資料塊 ( 偏移量可以任選,不一定非要是 S 的倍數 ) ,來尋找與檔案 B 的某一塊有著相同的弱校驗碼和強校驗碼的資料塊。這項工作可以藉助滾動校驗的特性很快完成。
- α發給β一串指令來生成檔案 A 在β上的備份。這裡的每一條指令要麼是對檔案 B 經擁有某一個數據塊而不須重傳的證明,要麼是一個數據塊,這個資料塊肯定是沒有與檔案 B 的任何一個數據塊匹配上的。
結論:rsync就是會同步我們指定的兩端目錄之間的資料,這個資料可以是特殊的資料。同步之前就先進行兩端的資料的比對,只會同步兩者之間不同的部分,並保留檔案原本的屬性。並且支援匿名的方式進行同步傳輸。所以rsync在備份,同步上就會較為快速。
rsync命令常用選項
選項 | 說明 |
---|---|
-a(重要) | 包含-rtplgoD選項 |
-r(重要) | 同步目錄時要加上,類似cp命令的-r選項 |
-v(重要) | 同步時顯示一些資訊,讓我們知道同步的過程 |
-l | 保留軟連結 |
-L | 同步軟連結時會把原始檔給同步 |
-p | 保持檔案的許可權屬性 |
-o | 保持檔案的屬主 |
-g | 保持檔案的屬組 |
-D | 保持裝置檔案資訊 |
-t | 保持檔案的時間屬性 |
--delete | 刪除DEST中SRC沒有的檔案 |
--exclude | 過濾指定檔案,如--exclude "logs" 會把檔名包含logs的檔案或者目錄過濾掉,不同步 |
-p | 顯示同步過程,比如速率,比-v更加詳細 |
-u | 如果DEST中的檔案比SRC新,就不會同步 |
-z | 傳輸時壓縮 |
rsync的簡單示例
示例1 將目錄下1.txt拷貝到本目錄下的2.txt
在本地裡使用rsync就類似於cp命令
[root@moli-linux03 rsync_test]# ls 1.txt [root@moli-linux03 rsync_test]# rsync -av 1.txt 2.txt sending incremental file list 1.txt sent 87 bytesreceived 35 bytes244.00 bytes/sec total size is 0speedup is 0.00 [root@moli-linux03 rsync_test]# ls 1.txt2.txt
示例2 把/etc/passwd檔案拷貝到遠端主機的/tmp目錄下,並改名叫1.txt
rsync -av /etc/passwd [email protected]:/tmp/1.txt
示例3 通過ssh同步,指定埠號
rsync -av -e "ssh -p 22" /etc/passwd 192.168.199.3:/tmp/test
示例4 通過服務進行同步
(休息一下...)