inotify+rsync、sersync 實時備份
作者:Georgekai
歸檔:學習筆記
2018/1/26
inotify+rsync、sersync 實時備份
1.1 定時備份缺點:
1. 浪費系統性能(數據沒變化到時間也會備份)
2. 數據安全性不高(定時任務最短1分鐘同步一次,如果1分鐘內數據變化後,服務器宕機了,就 會丟失數據)
1.2 inotify+rsync
1.2.1 inotify是什麽?
1. 是一種強大的,細粒度的,異步的文件系統事件監控系列
2. linux內核從2.6.13起,加入了inotify的支持
3. 作用:通過inotify可以監控文件系統中的添 加,刪除,修改,移動等各種事件
1.2.2 實時同步原理
1)劃分存儲與備份服務器
2)在存儲服務器上部署監控服務,監控相應文件或目錄中信息的變化
3)變化後,將文件或目錄數據信息進行推送,實現實時同步到rsync服務器
1.2.3 實時備份部署原理過程
1.部署rsync守護進程模式
2.部署inotify實時監控數據變化的服務
1)安裝inotify
yum install inotify-tools -y
inotify-tools包含2個工具:
主要使用inotifywait :在被監控的文件或目錄中等待系統事件的發生
inotifywatch :統計被監控的目錄或文件中,事件的發生次數
2)事件目錄監控命令總結
inotifywait命令語法格式說明圖:
inotifywait -mrq --timefmt "%F" --format "%T %w%f 事件信息:%:e" -e create /data
註:下面有inotifywait命令每個參數的詳解
3)利用腳本方式,將rsync與inotify服務串聯在一起
vim inotify.sh
腳本內容:
#!/bin/bash
#author:georgekai
inotifywait -mrq --format "%w%f" -e create,close_write,delete,moved_to /data|\
while read line
do
rsync -az /data/ [email protected]::backup--password-file=/etc/rsync.password
done
註:腳本在無限循環執行時:(用以下一種方法可中斷執行過程)
1.利用ctrl+z,放到後臺暫停腳本運行,在killall -f inotify,在切換到前臺時,已被殺死
註:jobs #查看後臺停止的進程和對應的序號
fg + 進程序號 #將後臺的命令放前臺繼續執行
bg #將前臺運行的命令放入後臺繼續執行
2. pkill -f inotify #-f:帶inotify字符的進程都殺死
3. kill -9 9857 9859 #kill後面接機進程對應的PID號
shell腳本循環方式:
1. for循環 : 指定循環條件,循環條件不滿足會停止循環
2. while循環:指定循環條件,當循環條件滿足時,會無限循環
3. until循環:指定循環條件,當循環條件不滿足時,會無限循環
4)寫好腳本,並賦予x執行權限,放入/etc/rc.local中
1.2.4 inotifywait常用參數
-m #保持實時監控,前臺監控
-d #類似-m,在後臺監控
-r #遞歸監控
-q #輸出信息少,安靜模式
--timefmt #指定時間輸出的格式
--format #指定指定的輸出類型格式(%w:監控目錄)
-e #指定事件類型(如:modify、create、close_write、move、delete、attrib)
註:-e指定的事件類型,下面有詳詳解
1.2.5 inotify中- -format的常用參數:
%f #監控目錄中哪個文件觸發了這個事件
%w #監控的目錄
%T #--timefmt定義的時間格式
%e #產生事件的信息,多個事件默認以逗號分割
%Xe #輸出連續事件信息時,X表示以什麽符號分割
1.2.6 inotify中 -e參數的常用事件類型:
close_write #文件或目錄在寫入模式打開之後關閉
close_nowrite #文件或目錄在只讀模式打開之後關閉
moved_to #將文件或目錄移動(拉)到監控目錄中
moved_from #將文件或目錄從監控目錄中移動(推)出去
create #在監控目錄中創建文件或目錄
delete #在監控目錄中刪除文件或目錄
測試在監控目錄中對文件的各種操作所觸發的監控事件類型:
1. 創建文件邏輯過程:
touch /data/123.txt
會觸發:/data/ CREATE 123.txt
/data/ OPEN 123.txt
/data/ ATTRIB 123.txt
/data/ CLOSE_WRITE,CLOSE 123.txt
2. 刪除文件邏輯過程:
\rm 999.txt
會觸發:/data/ DELETE 999.txt
3. 修改文件邏輯過程:
echo 123 >> 123.txt
會觸發:/data/ OPEN 123.txt
/data/ MODIFY 123.txt
/data/ CLOSE_WRITE,CLOSE 123.txt
4. 移動文件邏輯過程:
1)將hosts文件移動到data目錄
mv /etc/hosts /data
觸發:/data/ MOVED_TO hosts
2)將data目錄中的hosts文件,移動到/etc下
mv /data/hosts /etc/
觸發:/data MOVED_FROM hosts
5. 修改文件屬性邏輯過程:
mv kai.txt wang.txt ——重命名
觸發:/data/ MOVED_FROM kai.tx
/data/ MOVED_TO wang.txt
1.2.7 inotify服務優化
1. 在/proc/sys/fs/inotify/目錄下有三個文件,對inotify機制有一定的限制:
1)max_user_watches #設置inotifywait或inotifywatch命令可以監控的文件數量(單進程)
註:默認監控文件數8192個
2)max_user_instances #設置每個用戶可以運行的inotifywait或inotifywatch命令的進程數
註: 1. 一個服務識別不同的配置文件,啟動多個進程,就會開啟多個不同的socket條目 生成多個不同的端 口信息,以上操作就實現了一個服務的多實例創建
2. 默認監控進程數128個
3)max_queued_events #設置inotify事件(event)隊列可容納的事件數量
註:1. 默認隊列中可容納16384個事件
2. 監控目錄中文件變化越頻繁,這個值就越大,超過設置的最大值就會被丟棄
2. 對 max_user_watches max_user_instances max_queued_events 三個文件進行優化
建議設置為最大值:50000000,並設置開機自啟(有時間重啟可能會恢復)
echo “50000000” >/proc/sys/fs/inotify/max_user_watches
echo “50000000” >/proc/sys/fs/inotify/max_queued_events
echo "50000000" >/proc/sys/fs/inotiofy/max_user_istances
將這三條命令追加到/etc/rc.local中。
3 查看inotify man手冊
man inotify #有顯示inotify(7),7表示第七個級別
man man #可能查看man的七個級別的含義
man 7 inotify #即可查看inotify中max_queque_event等三個文件的使用幫助
1.2.8 inotify軟件的優點和缺點
優點:監控文件系統事件發生變化,會通過rsync實時同步數據
缺點: 1.發現大於200個文件(大小4-100k),同步時會有延時
2.前面寫的腳本,每次都是全部推送一次,但確實是增量的。也可以只同步變化文件,不 變的可以不理。
3.監控到事件後,rsync同步是單線程的(效率低),serync同步是多線程(效率高)
註:一個進程可管理多個線程
4. inotify實現實時同步需要編寫shell腳本
1.3 sersync軟件(國內金山開發)
1.3.1 sersync功能:
1. 支持配置文件管理
2. 真正的守護守護進程是socket
3. 可以對失敗文件定時重傳(定時任務的功能)
4. 第三方的HTTP接口(例如CDN緩存)
5. 默認多線程同步,效率高(inotify是單線程)
1.3.2 sersync軟件服務部署流程:
1. 部署好rsync守護進程服務
2. 部署sersync實時監控服務
1)確認sersync軟件是否安裝
▲ sersync綠色軟件包的安裝方式(二進制包安裝方式)
sersync軟件官方地址(下載):https://github.com/wsgzao/sersync
▲下載好後,上傳到NFS服務器中
▲因為zip格式的,需要unzip 解壓
▲解壓後將軟件包mv到合適位置/usr/local/下
2)修改sersync配置文件(修改前先備份源文件)
vim /usr/local/sersync/conf/confxml.xml
以下標簽只需了解:
▲. <filter start="false"> #false表示不過濾(默認)
<exclude expression="(.*)\.svn"></exclude>
<exclude expression="(.*)\.gz"></exclude>
<exclude expression="^info/*"></exclude>
<exclude expression="^static/*"></exclude>
</filter>
註:filter標簽用來實現實時同步的排除功能
▲. <inotify>
<delete start="true"/>
<createFolder start="true"/>
<createFile start="false"/>
<closeWrite start="true"/>
<moveFrom start="true"/>
<moveTo start="true"/>
<attrib start="false"/>
<modify start="false"/>
</inotify>
註:指定監控文件或目錄變化的事件信息
3. 啟動sersync服務
1)chmod +x sersync #先授予sersync命令執行權限
2)/bin/sersync -h #查看幫助(都是中文的)
3)/bin/sersync -dro /usr/local/sersync/conf/confxml.xml
註:不要用xinetd管理rsync服務(sersync會調用inotify+rsync服務,配置文件中有)
sersync參數信息:
參數-d:啟用守護進程模式
參數-r:在監控前,將監控目錄與遠程主機用rsync命令推送一遍
參數-n: 指定開啟守護線程的數量,默認為10個
參數-o:指定配置文件,默認使用confxml.xml文件
參數-m:單獨啟用其他模塊,使用 -m refreshCDN 開啟刷新CDN模塊
參數-m:單獨啟用其他模塊,使用 -m socket 開啟socket模塊
參數-m:單獨啟用其他模塊,使用 -m http 開啟http模塊
不加-m參數,則默認執行同步程序
4. 查看服務是否啟動
ps -ef |grep sersync
1.4 互聯網常見數據同步方法總結:
1. inotify(sersync)+rsync ,是文件級別的。
2. drbd數據同步軟件,基於block塊同步
3. 第三方軟件的同步功能:mysql同步(主從復制),oracle,mongodb。
4. 程序雙寫,直接寫兩臺服務器
感覺最新排版好累,思路不清都沒法排
inotify+rsync、sersync 實時備份