1. inotify+sersync實時復制應用簡介
1.1 實時復制介紹
利用實時復制方式,實現實時備份重要數據信息。實時復制是企業數據備份最重要的方式,主要用于對用戶提交的數據的實時備份。對于用戶提交到服務器上的普通文件(壓縮包、視頻、文檔等),可采用inotify/sersync+rsync實時備份方式;對于數據文件還有較復雜的分布式存儲工具自身可以實現將數據同時備份成多份,例如:FastDFS、GlusterFS等;對于提交到數據庫中的數據,可使用數據庫的主從復制(例如:MySQL、Oracle)方式備份,這是軟件自帶的實時復制備份方式。
1.2 實時復制細節實現說明
實時復制軟件會監控磁盤文件系統的變化,比如:指定一個/data目錄,實時復制軟件服務進程會實時監控這個/data目錄中數據的變化,即文件系統block與inode信息的變化。
一旦/data目錄文件發生變化,就會執行sync命令,將變化的數據信息推送到備份服務器相應的備份目錄中,從而完成數據的實時備份。
1.3 實時復制軟件介紹
企業中較為常用的實時復制軟件有如下兩種:(推薦使用第二個)
| 軟件服務 | 依賴程序 | 部署難點 | 說明
|inotify-tools| rsync守護進程務 | 復制腳本編寫 | 監控目錄數據變化,實時數據復制
| sersync | rsync守護進程務| 配置文件編寫 | 監控目錄數據變化,實時數據復制
1.4 實時復制inotify機制簡介
Inotify是一種異步的系統事件監控機制,linux內核從2.6.13起,加入了Inotify支持,通過Inotify可以監控文件系統中添加、刪除,修改、移動等各種事件。實際上inotify-tools是一個監控指定目錄數據實時變化的軟件程序。
(sersync軟件是在inotify基礎上進行開發的,功能要更加強大些,支持配置文件配置,多了定時重試機制,過濾機制,提供接口做CDN數據更新,支持多線程操作)。
inotify機制優點:監控文件系統事件變化,通過復制工具實現實時數據復制,支持多線程實時復制。
inotify機制缺點:實測并發如果大于200個文件(10~100K),復制會有延遲。
1.5 inotify工具命令介紹
1.5.1 inotify-tools工具主要命令:
inotifywait:在被監控的目錄等待特定文件系統事件發生,執行后處于阻塞狀態,適合在shell腳本中使用。
inotifywatch:收集被監控的文件系統使用的統計數據,指文件系統時間發生的次數統計。
1.5.2 inotifywait命令參數詳細說明
| 命令參數|參數說明|
| -m(--monitor)| 始終保持事件監聽狀態※|
| -d(--daemon) | 類似-m參數,只是將命令運行在后臺記錄觸發的事件信息在指定文件中,利用—outfile參數定義程序日志使用—syslog參數 |
| -r| 遞歸監控目錄數據信息變化※ |
| -o(--outfile<file>) | 打印事件到文件中,相當于標準正確輸出 |
| -s(--syslog) | 發送錯誤到syslog相當于標準錯誤輸出 |
| -q(--qulet) | 輸出信息少(只打印事件信息) |
| --excludei<pattern> | 排除文件或目錄時,不區分大小寫|
| --timefmt<fmt> | 指定時間輸出的格式|
| --fromat<fmt> | 打印使用指定的輸出類似格式字符串;即實際監控輸出的內容|
| -e | 指定監聽指定的事件,如果省略,表示所有時間都進行監聽※ |
| 時間名稱| 事件說明|
| access| 文件或目錄內容被讀取|
| modify | 文件或目錄內容被寫入 |
| attrib | 文件或目錄屬性改變 |
| close_write | 文件或目錄關閉,在寫入模式打開之后關閉的※ |
| close_nowrite | 文件或目錄關閉,在只讀模式打開之后關閉的 |
| close | 文件或目錄關閉,不管讀或是寫模式 |
| open | 文件或目錄被打開 |
| moved_to | 文件或目錄被移動到監控的目錄中 |
| moved_from| 文件或目錄被移動從監控的目錄中 |
| move| 文件或目錄不管移動到或是移動出監控目錄都吃觸發事件|
| create| 文件或目錄創建在監控的目錄中※|
| delete | 文件或目錄被刪除在監控的目錄中※ |
| delete_self| 文件或目錄被刪除|
| unmount| 文件系統包含的文件或目錄不能卸載 |
2. inotify+rsync實時復制項目實踐
## 2.1 前提:backup rsync服務端部署完成然后在nfs01中定義密碼認證變量,并測試數據推送和拉?。?
[root@nfs01 ~]# echo 'export RSYNC_PASSWORD=oldboy' >>/etc/bashrc #<==定義密碼環境變量
[root@nfs01 ~]# source /etc/bashrc #<==使配置生效
[root@nfs01 ~]# echo $RSYNC_PASSWORD #<==檢查,確保生效
oldboy
[root@nfs01 /]# rsync -avz /data rsync_backup@172.16.1.41::backup
sending incremental file list #<==出現以下幾行提示,說明rsync服務環境是正常的
data/
sent 72 bytes received 28 bytes 200.00 bytes/sec
total size is 0 speedup is 0.00
2.2 檢查Linux系統是否支持inotify實時監控
[root@nfs01 /]# uname -r #<==內核是3.10,支持inotify機制
3.10.0-957.5.1.el7.x86_64
[root@nfs01 /]# ls -l /proc/sys/fs/inotify/
總用量 0
-rw-r--r-- 1 root root 0 4月 19 12:27 max_queued_events #<==設置可容納的事件數量
-rw-r--r-- 1 root root 0 4月 19 09:45 max_user_instances #<==設置每個用戶可以運行的進程數
-rw-r--r-- 1 root root 0 4月 19 12:27 max_user_watches #<==設置可以監視的文件數量
顯示以上三個文件證明系統支持inotfiy程序功能
2.3 inptify-tools安裝
[root@nfs01 /]# yum install epel-release -y #<==安裝epel源,默認的官方源沒有inotify-tools
[root@nfs01 /]# yum install inotify-tools -y #<==下載inotify軟件工具
[root@nfs01 /]# rpm -ql inotify-tools|head -2 #<==查看(必須出現以下兩個命令)
/usr/bin/inotifywait
/usr/bin/inotifywatch
2.4 測試實踐
xshell中打開兩個nsf01窗口,第一個窗口輸入如下命令,第二個窗口進入/data目錄下創建文件。
inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e create /data
![M1GXVTFBZL5LGIA@V$D]L~S.png](https://upload-images.jianshu.io/upload_images/16833174-0c668bd3bc1fabea.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2.5 編寫實時監控和復制腳本
執行的命令和編寫的腳本如下:
[root@nfs01 /]# mkdir /server/scripts/ -p
[root@nfs01 /]# cd /server/scripts/
[root@nfs01 /server/scripts]# cat monitor.sh
#!/bin/sh
cmd="/usr/bin/inotifywait"
$cmd -mrq --format '%w%f' -e close_write,delete /data|\
while read line
do
#刪除事件發生
[ ! -e "$line" ] && cd /data &&\
rsync -az --delete ./ rsync_backup@172.16.1.41::backup && continue
#處理增改事件
rsync -az --delete $line rsync_backup@172.16.1.41::backup
done
#測試沒有問題之后,在nfs01上讓腳本在后臺運行,并放入/etc/rc.local中
[root@nfs01 /]# /bin/sh /server/scripts/monitor.sh & #<==&表示讓腳本在后臺運行
[1] 45998
[root@nfs01 /]# tail -2 /etc/rc.local
/bin/sh /server/scripts/monitor.sh &
2.6 inotify優化
[root@nfs01 /]# cat /proc/sys/fs/inotify/max_user_watches
50000000
[root@nfs01 /]# cat /proc/sys/fs/inotify/max_queued_events
327679
[root@nfs01 /]# echo "50000000" >/proc/sys/fs/inotify/max_user_watches
[root@nfs01 /]# echo "50000000" >/proc/sys/fs/inotify/max_queued_events
#以上兩個參數重啟可能會失效,所以放在/etc/rc.local中
[root@nfs01 /]# tail -2 /etc/rc.local
echo "50000000" >/proc/sys/fs/inotify/max_user_watches
echo "50000000" >/proc/sys/fs/inotify/max_queued_events
3. sersync項目實踐
3.1 先測試客戶端能否推送成功(nfs01上)
[root@nfs01 /]# rsync -az /data/ [rsync_backup@172.16.1.41::backup]
3.2 部署sersync服務(nfs01上)
#sersync_oldboy_64bit_20160928.tar.gz #<==配置文件壓縮包
#鏈接: https://pan.baidu.com/s/1ZGz9tQYKHYqolnjZ9WL7Cw 提取碼: u82f
[root@nfs01 /]# mkdir -p /server/tools/
[root@nfs01 /]# cd /server/tools/
[root@nfs01 /server/tools]# tar xf sersync_oldboy_64bit_20160928.tar.gz
[root@nfs01 /server/tools]# mkdir /application/ -p
[root@nfs01 /server/tools]# mv application/sersync /application/
3.3 sersync配置文件(nfs01中)
[root@nfs01 /server/tools]# cd /application/sersync/
[root@nfs01 /application/sersync]# ls
bin conf logs readme.txt
[root@nfs01 /application/sersync]# cd conf/
[root@nfs01 /application/sersync/conf]# ls
confxml.xml confxml.xml.ori
[root@nfs01 /application/sersync/conf]# cat -n confxml.xml
1 <?xml version="1.0" encoding="ISO-8859-1"?>
2 <head version="2.5">
3 <host hostip="localhost" port="8008"></host>
4 <debug start="false"/>
5 <fileSystem xfs="false"/>
6 <filter start="false">
7 <exclude expression="(.*)\.svn"></exclude>
8 <exclude expression="(.*)\.gz"></exclude>
9 <exclude expression="^info/*"></exclude>
10 <exclude expression="^static/*"></exclude>
11 </filter>
12 <inotify>
13 <delete start="true"/>
14 <createFolder start="true"/>
15 <createFile start="false"/>
16 <closeWrite start="true"/>
17 <moveFrom start="true"/>
18 <moveTo start="true"/>
19 <attrib start="false"/>
20 <modify start="false"/>
21 </inotify>
22
23 <sersync>
24 <localpath watch="/data">
25 <remote ip="172.16.1.41" name="backup"/>
26 <remote ip="172.16.1.41" name="oldboy"/>
27 <!--<remote ip="192.168.8.39" name="tongbu"/>-->
28 <!--<remote ip="192.168.8.40" name="tongbu"/>-->
29 </localpath>
30 <rsync>
31 <commonParams params="-artuz"/>
32 <auth start="true" users="rsync_backup" passwordfile="/etc/rsync.password"/>
33 <userDefinedPort start="false" port="874"/><!-- port=874 -->
34 <timeout start="true" time="100"/><!-- timeout=100 -->
35 <ssh start="false"/>
36 </rsync>
37 <failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
38 <crontab start="false" schedule="600"><!--600mins-->
39 <crontabfilter start="false">
40 <exclude expression="*.php"></exclude>
41 <exclude expression="info/*"></exclude>
42 </crontabfilter>
43 </crontab>
44 <plugin start="false" name="command"/>
45 </sersync>
46
47 <plugin name="command">
48 <param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix-->
49 <filter start="false">
50 <include expression="(.*)\.php"/>
51 <include expression="(.*)\.sh"/>
52 </filter>
53 </plugin>
54
55 <plugin name="socket">
56 <localpath watch="/opt/tongbu">
57 <deshost ip="192.168.138.20" port="8009"/>
58 </localpath>
59 </plugin>
60 <plugin name="refreshCDN">
61 <localpath watch="/data0/htdocs/cms.xoyo.com/site/">
62 <cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
63 <sendurl base="http://pic.xoyo.com/cms"/>
64 <regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
65 </localpath>
66 </plugin>
67 </head>
3.4 啟動服務并添加到/etc/rc.local中
[root@nfs01 /application/sersync/conf]# /application/sersync/bin/sersync -d -n 10 -o /application/sersync/conf/confxml.xml #<==開啟服務
[root@nfs01 /application/sersync/conf]# tail -3 /etc/rc.local
/application/sersync/bin/sersync -d -n 10 -o /application/sersync/conf/confxml.xml &>/dev/null
4. 拓展知識
#配置:systemctl start sersync啟動方案
#參考網址:https://blog.51cto.com/oldboy/2155931
[root@nfs01 /data]# cat /etc/rc.d/init.d/sersync
#!/bin/bash
# chkconfig: 2345 21 81
# description: rsync service start and stop scripts
# Author: oldboy
# Organization: www.oldboyedu.com
start(){
/application/sersync/bin/sersync -d -o /application/sersync/conf/confxml.xml &>/dev/null
}
stop(){
killall sersync 2>/dev/null
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
sleep 2
start
;;
*)
echo $"Usage:$0 {start|stop|restart}"
exit 1
esac
[root@nfs01 /data]# chmod +x /etc/rc.d/init.d/sersync
[root@nfs01 /data]# cat /usr/lib/systemd/system/sersync.service
[Unit]
Description=sersyncd service
After=network.target
[Service]
Type=forking
ExecStart=/etc/rc.d/init.d/sersync start
ExecReload=/etc/rc.d/init.d/sersync restart
ExecStop=/etc/rc.d/init.d/sersync stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
chmod +x /usr/lib/systemd/system/sersync.service
[root@nfs01 /data]# systemctl enable sersync.service
Created symlink from /etc/systemd/system/multi-user.target.wants/sersync.service to /usr/lib/systemd/system/sersync.service.
[root@nfs01 /data]# systemctl status sersync.service
● sersync.service - sersyncd service
Loaded: loaded (/usr/lib/systemd/system/sersync.service; enabled; vendor preset: disabled)
Active: inactive (dead)
[root@nfs01 /data]# systemctl stop sersync
[root@nfs01 /data]# ps -ef|grep sersync|grep -v grep
[root@nfs01 /data]# systemctl start sersync