實時備份
1.1 定時備份缺點
1. 浪費系統性能(數據沒發生變化,但到時間也會備份)
2. 數據安全性不高(定時任務最短備份周期1分鐘同步一次,如果1分鐘內數據變化後,服務器宕機了, 數據就會丟失)
1.2 實時備份過程
1. 劃分存儲與備份服務器
2. 在存儲服務器上部署監控服務,監控相應文件或目錄中數據信息的變化
3. 將監控文件或目錄,變化的數據信息進行推送,實現實時備份到rsync服務器中
第2章 實時備份部署原理(Inotify+rsync實現實時備份部署)
2.1 實時備份原理
2.2 Inotify軟件服務介紹
Inotify是一種強大的,細粒度的,異步的文件系統事件監控機制
Linux內核從2.6.13起,加入了Inotify支持
通過Inotify可以監控文件系統中添加、刪除、修改、移動等各種事件
Inotify軟件應用前提:
linux內核從2.6.13起,加入了Inotify支持,所以要求Linux內核2.6.13及以上方可使用
[root@nfs01 ~]# cd /proc/sys/fs/inotify/ [root@nfs01 inotify]# ll total 0 -rw-r--r-- 1 root root 0 Jan 26 09:20 max_queued_events -rw-r--r-- 1 root root 0 Jan 26 09:20 max_user_instances -rw-r--r-- 1 root root 0 Jan 26 09:20 說明:顯示這三個文件則證明系統支持Inotify程序功能 [root@nfs01 inotify]# cat max_queued_events 16384 [root@nfs01 inotify]# cat max_user_instances 128 [root@nfs01 inotify]# cat max_user_watches 8192 |
通過man proc 獲取內核中Inotify信息說明: /proc/sys/fs/epoll (since Linux 2.6.28) This directory contains the file max_user_watches, which can be used to limit the amount of ker-nel memory consumed by the epoll interface. For further details, see inotify(7). [root@backup ~]# man man 7 MANUAL SECTIONS The standard sections of the manual include: 1 User Commands 2 System Calls 3 C Library Functions 4 Devices and Special Files 5 File Formats and Conventions 6 Games et. Al. 7 Miscellanea 8 System Administration tools and Daemons |
2.3 rsync守護進程模式要部署
參考以前的文檔
2.4 inotify實時監控數據變化服務部署
2.4.1 第一個裏程:確認inotify軟件是否安裝
擴展yum源(擴展的倉庫):epel(企業級linux的yum源的擴展倉庫)
ü 阿裏雲epel源:通過訪問阿裏yum源鏡像地址獲取
ü 直接安裝epel源方式:yum install epel-release
安裝Inotify: yum install inotify-tools -y
[root@nfs01 ~]# yum install inotify-tools -y [root@nfs01 ~]# rpm -qa inotify-tools inotify-tools-3.14-1.el6.x86_64 [root@nfs01 inotify]# rpm -ql inotify-tools /usr/bin/inotifywait /usr/bin/inotifywatch |
inotify-tools包括2個工具
1. /usr/bin/inotifywait --- 開啟實時監控服務,監控目錄或文件的數據變化
2. /usr/bin/inotifywatch --- 收集被監控的文件系統使用的統計數據,指文件系統事件發生的次數統計。
說明:yum安裝後可以直接使用,如果編譯安裝需要進入到相應的軟件目錄的bin目錄下使用
2.4.2 第二個裏程:事件目錄監控命令總結(後續有參數的詳解)
inotifywait -mrq /data
inotifywait -mrq --timefmt "%y/%m/%d %H:%M" --format "%T %w%f" /data
inotifywait -mrq --timefmt "%F" --format "%T %w%f 事件信息:%e" /data
inotifywait -mrq --timefmt "%F" --format "%T %w%f 事件信息:%:e" -e create /data
腳本需要編寫監控命令:
inotifywait -mrq --format "%w%f" -e create,close_write,delete,moved_to /data
2.4.3 第三個裏程碑:利用腳本的方式,將以上兩個服務串聯在一起
[root@nfs01 scripts]# vim inotify.sh [root@nfs01 scripts]# cat inotify.sh #!/bin/bash
inotifywait -mrq --format "%w%f" -e create,close_write,delete,moved_to /data|\ while read line do rsync -az /data/ --delete [email protected]::backup --password-file=/etc/rsync.password done |
擴展:shell腳本循環方式
1. for循環:指定循環條件,循環條件不滿足會停止循環
2. while循環:指定循環條件,循環條件滿足時,會無限循環(實現死循環)
3. until循環:指定循環條件,循環體檢不滿足時,會無限循環
註意:腳本在無限循環執行時的中斷操作
1. 利用ctrl+z,只是暫停腳本運行(暫停的進程),在killall -f inotify,再切換到前臺時,已被殺死
註:
ctrl+z ---------將當前進程掛起,即調入後臺並停止執行
jobs -------查看後臺停止的進程和對應的進程號(PID)
fg + 進程序號 ------將後臺的命令放前臺繼續執行
bg ------將前臺運行的命令放入後臺繼續執行
2. pkill -f inotify -f:帶inotify字符的進程都殺死
3. kill -9 9857 9859 ----------kill後面接進程對應的PID號(-9 選項用於強制終止)
2.4.4 第四個裏程碑:開機自動運行
給腳本賦予x執行權限,將執行命令放入/etc/rc.local中
第3章 重要參數說明
3.1 inotifywait常用參數
-m #保持實時監控,前臺監控
-d #類似-m,在後臺監控
-r #遞歸監控
-q #輸出信息少,安靜模式
--timefmt #指定時間輸出的格式
--format #指定指定的輸出類型格式(%w:監控目錄)
-e #指定事件類型(如:modify、create、close_write、move、delete、attrib)
註:-e指定的事件類型,下面有詳詳解
3.1.1 inotifywait中- -format的常用參數
%f ----------監控目錄中哪個文件觸發了這個事件
%w ----------監控的目錄
%T ----------timefmt定義的時間格式
%e -----------產生事件的信息,多個事件默認以逗號分割
%Xe -----------輸出連續事件信息時,X表示以什麽符號分割
3.1.2 inotifywait中 -e參數的常用事件類型
close_write -----------文件或目錄在寫入模式打開之後關閉
close_nowrite -----------文件或目錄在只讀模式打開之後關閉
moved_to ------------將文件或目錄移動(拉)到監控目錄中
moved_from ------------將文件或目錄從監控目錄中移動(推)出去
create ------------在監控目錄中創建文件或目錄
delete ------------在監控目錄中刪除文件或目錄
3.2 測試在監控目錄中對文件的各種操作所觸發的監控事件類型
3.2.1 創建文件邏輯過程
[root@nfs01 data]# touch wuhuang.txt |
[root@nfs01 data]# inotifywait -m /data/ /data/ CREATE wuhuang.txt /data/ OPEN wuhuang.txt /data/ ATTRIB wuhuang.txt /data/ CLOSE_WRITE,CLOSE wuhuang.txt |
3.2.2 刪除文件邏輯過程
[root@nfs01 data]# rm wuhuang.txt -f |
[root@nfs01 data]# inotifywait -m /data/ /data/ DELETE wuhuang.txt |
3.2.3 修改文件邏輯過程
[root@nfs01 data]# echo 123>wuhuang.txt |
[root@nfs01 data]# inotifywait -m /data/ /data/ OPEN wuhuang.txt /data/ MODIFY wuhuang.txt /data/ CLOSE_WRITE,CLOSE wuhuang.txt |
3.2.4 移動文件邏輯過程
將/data/目錄下的wuhuang.txt移動到/tmp
[root@nfs01 data]#mv wuhuang.txt /tmp/ |
[root@nfs01 data]# inotifywait -m /data/ /data/ MOVED_FROM wuhuang.txt |
將/tmp/wuhuang.txt移動到/data/目錄下
[root@nfs01 data]#mv /tmp/wuhuang.txt ./ |
[root@nfs01 data]# inotifywait -m /data/ /data/ MOVED_TO wuhuang.txt |
將/etc/hosts復制到/data
[root@nfs01 data]#cp /etc/hosts ./ |
[root@nfs01 data]# inotifywait -m /data/ /data/ CREATE hosts /data/ OPEN hosts /data/ MODIFY hosts /data/ CLOSE_WRITE,CLOSE hosts |
將/data/wuhuang.txt復制到/tmp
[root@nfs01 data]# cp wuhuang.txt /tmp/ |
[root@nfs01 data]# inotifywait -m /data/ /data/ OPEN wuhuang.txt /data/ CLOSE_NOWRITE,CLOSE wuhuang.txt |
3.2.5 修改文件屬性信息
[root@nfs01 data]# chmod 600 wuhuang.txt |
[root@nfs01 data]# inotifywait -m /data/ /data/ ATTRIB wuhuang.txt |
3.2.6 對文件進行重命名
[root@nfs01 data]# mv wuhuang.txt wh.txt |
[root@nfs01 data]# inotifywait -m /data/ /data/ MOVED_FROM wuhuang.txt /data/ MOVED_TO wh.txt |
註意:Tab鍵也會觸發監控,測試時為了更好的看到效果,盡量少用Tab鍵
3.3 Inotify服務優化
3.3.1 在/proc/sys/fs/inotify/目錄下有三個文件,對inotify機制有一定的限制
(1) max_user_watches: 設置inotifywait或inotifywatch命令可以監視的文件數量(單進程)
默認監控文件數量:8192
(2)max_user_instances: 設置每個用戶可以運行的inotifywait或inotifywatch命令的進程數
默認監控進程數:128
一個服務識別不同的配置文件,啟動多個進程,開啟多不同的socket條目,生成多個不同端口信息
以上操作就實現了一個服務的多實例創建
(3) max_queued_events: 設置inotify實例事件(event)隊列可容納的事件數量
默認隊列中事件數量:16384
監控目錄中文件變化越頻繁,這個值就越大,超過設置的最大值就會被丟棄
針對以上三個文件可做優化:
建議設置為最大值:50000000,並設置開機自啟(有時候重啟可能會恢復,需要放在/etc/rc.local)
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中。
參考man幫助:
man inotify ---------有顯示inotify(7),7表示第七個級別
man man ----------可能查看man的七個級別的含義
man 7 inotify ----------即可查看inotify中max_queque_event等三個文件的使用幫助
第4章 Inotify軟件的優缺點
4.1 優點
監控文件系統事件變化,通過同步工具(rsync)實時同步數據
4.2 缺點
1. 並發如果大於200個文件(大小4-100k),同步時就會有延時
2. 前面寫的腳本,每次都是全部推送一次,但確實是增量的。也可以只同步變化文件,不 變化的可以不理。
3. 監控到事件後,rsync同步是單線程的(效率低),serync同步是多線程(效率高)
註:一個進程可管理多個線程
4. inotify實現實時同步需要編寫shell腳本
第5章 sersync軟件
5.1 sersync功能信息
1. 支持配置文件管理
2. 真正的守護進程是socket
3. 可以對失敗文件定時重傳(定時任務的功能)
4. 第三方的HTTP接口(例如CDN緩存)
5. 默認多線程同步,效率高(inotify是單線程)
5.2 sersync軟件服務部署流程
5.2.1 部署rsync守護進程服務
5.2.2 第一個裏程碑:確認軟件是否安裝(sersync)
綠色軟件包的安裝方式(二進制包安裝方式)
sersync軟件官方地址:https://github.com/wsgzao/sersync
進行軟件下載
將下載好的軟件程序上傳到服務器中(nfs服務器)
解壓縮軟件程序包: unzip sersync_installdir_64bit.zip
將軟件程序目錄移動到指定目錄中: mv sersync/ /usr/local/
5.2.3 第二個裏程碑:編寫sersync配置文件(修改前先備份源文件)
vim /usr/local/sersync/conf/confxml.xml
註:此處只列出主要修改項
<sersync> <localpath watch="/home/"> <!-- 這裏填寫被監控服務器(NFS)要同步的文件夾路徑--> <remote ip="8.8.8.8" name="rsync"/> <!-- 這裏填寫rsync服務器的IP地址和模塊名--> <!--<remote ip="192.168.28.39" name="tongbu"/>--> <!--<remote ip="192.168.28.40" name="tongbu"/>--> </localpath> <rsync> <commonParams params="-artuz"/> <!-- 這裏填寫rsync命令的參數的認證信息--> <auth start="true" users="rsync" passwordfile="/app/local/sersync/user.pass"/> <!-- rsync+密碼文件 這裏填寫rsync服務器的認證信息--> <userDefinedPort start="false" port="874"/><!-- port=874 --> <timeout start="false" time="100"/><!-- timeout=100 --> <ssh start="false"/> </rsync> |
一些標簽了解(詳細內容參見官網)
<filter start="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> 說明:inotify指定監控文件或目錄變化的事件信息 |
5.2.4 第三個裏程碑:啟動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服務,如果rsync是由xinetd啟動的會不識別)
[root@nfs01 bin]# pwd /usr/local/sersync/bin [root@nfs01 bin]# chmod +x sersync [root@nfs01 bin]# ./sersync -h set the system param execute:echo 50000000 > /proc/sys/fs/inotify/max_user_watches execute:echo 327679 > /proc/sys/fs/inotify/max_queued_events parse the command param _______________________________________________________ 參數-d:啟用守護進程模式 參數-r:在監控前,將監控目錄與遠程主機用rsync命令推送一遍 c參數-n: 指定開啟守護線程的數量,默認為10個 參數-o:指定配置文件,默認使用confxml.xml文件 參數-m:單獨啟用其他模塊,使用 -m refreshCDN 開啟刷新CDN模塊 參數-m:單獨啟用其他模塊,使用 -m socket 開啟socket模塊 參數-m:單獨啟用其他模塊,使用 -m http 開啟http模塊 不加-m參數,則默認執行同步程序 |
5.2.5 第四個裏程碑:查看服務是否啟動
ps -ef |grep sersync
5.3 高並發數據實時同步方案小結
1. inotify(sersync)+rsync ,是文件級別的。
2. drbd文件系統級別,基於block塊同步,缺點:備節點數據不可用
3. 第三方軟件的同步功能:mysql同步(主從復制),oracle,mongodb。
4. 程序雙寫,直接寫兩臺服務器
5. 利用產品業務邏輯解決(讀寫分離,備讀不到,讀主)。
實時備份