實時備份

第1章 實時備份介紹

1.1 定時備份缺點

1. 浪費系統性能(數據沒發生變化,但到時間也會備份)

2. 數據安全性不高(定時任務最短備份週期1分鐘同步一次,如果1分鐘內數據變化後,服務器宕機了, 數據就會丟失)

1.2 實時備份過程

1. 劃分存儲與備份服務器

2. 在存儲服務器上部署監控服務,監控相應文件或目錄中數據信息的變化

3. 將監控文件或目錄,變化的數據信息進行推送,實現實時備份到rsync服務器中

第2章 實時備份部署原理(Inotify+rsync實現實時備份部署)

2.1 實時備份原理

image.png 

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 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

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

image.png 

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指定的事件類型,下面有詳詳解

image.pngimage.png 

image.png 

3.1.1 inotifywait中- -format的常用參數

%f              ----------監控目錄中哪個文件觸發了這個事件

%w             ----------監控的目錄

%T             ----------timefmt定義的時間格式

%e             -----------產生事件的信息,多個事件默認以逗號分割

%Xe            -----------輸出連續事件信息時,X表示以什麼符號分割

image.png 

3.1.2 inotifywait中 -e參數的常用事件類型

close_write             -----------文件或目錄在寫入模式打開之後關閉

close_nowrite           -----------文件或目錄在只讀模式打開之後關閉

moved_to              ------------將文件或目錄移動(拉)到監控目錄中

moved_from           ------------將文件或目錄從監控目錄中移動(推)出去

create                  ------------在監控目錄中創建文件或目錄

delete                  ------------在監控目錄中刪除文件或目錄

 

image.png 

image.png 

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/    

image.png  

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. 利用產品業務邏輯解決(讀寫分離,備讀不到,讀主)。


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