1. 浪費系統性能(數據沒發生變化,但到時間也會備份)mysql
2. 數據安全性不高(定時任務最短備份週期1分鐘同步一次,若是1分鐘內數據變化後,服務器宕機了, 數據就會丟失)linux
1. 劃分存儲與備份服務器git
2. 在存儲服務器上部署監控服務,監控相應文件或目錄中數據信息的變化github
3. 將監控文件或目錄,變化的數據信息進行推送,實現實時備份到rsync服務器中sql
Inotify是一種強大的,細粒度的,異步的文件系統事件監控機制mongodb
Linux內核從2.6.13起,加入了Inotify支持shell
經過Inotify能夠監控文件系統中添加、刪除、修改、移動等各類事件express
Inotify軟件應用前提:
linux內核從2.6.13起,加入了Inotify支持,因此要求Linux內核2.6.13及以上方可以使用vim
[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 max_user_watches 說明:顯示這三個文件則證實系統支持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 |
參考之前的文檔
擴展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目錄下使用
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
[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 rsync_backup@172.16.1.41::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 選項用於強制終止)
給腳本賦予x執行權限,將執行命令放入/etc/rc.local中
-m #保持實時監控,前臺監控
-d #相似-m,在後臺監控
-r #遞歸監控
-q #輸出信息少,安靜模式
--timefmt #指定時間輸出的格式
--format #指定指定的輸出類型格式(%w:監控目錄)
-e #指定事件類型(如:modify、create、close_write、move、delete、attrib)
注:-e指定的事件類型,下面有詳詳解
%f ----------監控目錄中哪一個文件觸發了這個事件
%w ----------監控的目錄
%T ----------timefmt定義的時間格式
%e -----------產生事件的信息,多個事件默認以逗號分割
%Xe -----------輸出連續事件信息時,X表示以什麼符號分割
close_write -----------文件或目錄在寫入模式打開以後關閉
close_nowrite -----------文件或目錄在只讀模式打開以後關閉
moved_to ------------將文件或目錄移動(拉)到監控目錄中
moved_from ------------將文件或目錄從監控目錄中移動(推)出去
create ------------在監控目錄中建立文件或目錄
delete ------------在監控目錄中刪除文件或目錄
[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 |
[root@nfs01 data]# rm wuhuang.txt -f |
[root@nfs01 data]# inotifywait -m /data/ /data/ DELETE wuhuang.txt |
[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 |
將/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 |
[root@nfs01 data]# chmod 600 wuhuang.txt |
[root@nfs01 data]# inotifywait -m /data/ /data/ ATTRIB wuhuang.txt |
[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鍵
(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等三個文件的使用幫助
監控文件系統事件變化,經過同步工具(rsync)實時同步數據
1. 併發若是大於200個文件(大小4-100k),同步時就會有延時
2. 前面寫的腳本,每次都是所有推送一次,但確實是增量的。也能夠只同步變化文件,不 變化的能夠不理。
3. 監控到事件後,rsync同步是單線程的(效率低),serync同步是多線程(效率高)
注:一個進程可管理多個線程
4. inotify實現實時同步須要編寫shell腳本
1. 支持配置文件管理
2. 真正的守護進程是socket
3. 能夠對失敗文件定時重傳(定時任務的功能)
4. 第三方的HTTP接口(例如CDN緩存)
5. 默認多線程同步,效率高(inotify是單線程)
綠色軟件包的安裝方式(二進制包安裝方式)
sersync軟件官方地址:https://github.com/wsgzao/sersync
進行軟件下載
將下載好的軟件程序上傳到服務器中(nfs服務器)
解壓縮軟件程序包: unzip sersync_installdir_64bit.zip
將軟件程序目錄移動到指定目錄中: mv sersync/ /usr/local/
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指定監控文件或目錄變化的事件信息 |
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參數,則默認執行同步程序 |
ps -ef |grep sersync
1. inotify(sersync)+rsync ,是文件級別的。
2. drbd文件系統級別,基於block塊同步,缺點:備節點數據不可用
3. 第三方軟件的同步功能:mysql同步(主從複製),oracle,mongodb。
4. 程序雙寫,直接寫兩臺服務器
5. 利用產品業務邏輯解決(讀寫分離,備讀不到,讀主)。