1. 程式人生 > >實時備份工具之inotify+rsync

實時備份工具之inotify+rsync

rsync inotify

1.inotify簡介

inotify 是一個從 2.6.13 內核開始,對 Linux 文件系統進行高效率、細粒度、異步地監控機制, 用於通知用戶空間程序的文件系統變化。可利用它對用戶空間進行安全、性能、以及其他方面的監控。Inotify 反應靈敏,用法非常簡單,並且比 cron 任務的繁忙輪詢高效得多。如果內核版本不低於 2.6.13,系統就支持 inotify。 如果存在
/usr/include/sys/inotify.h 文件, 表明內核支持 inotify。

[root@localhost ~]#  ls -l /proc/sys/fs/inotify/     #列出文件目錄,出現下面的內容,說明服務器內核支持inotify
total 0
-rw-r--r-- 1 root root 0 Oct 13 05:39 max_queued_events
-rw-r--r-- 1 root root 0 Oct 13 05:39 max_user_instances
-rw-r--r-- 1 root root 0 Oct 13 05:39 max_user_watches

2.inotify的作用

inotify 可以監控文件,也可以監控目錄。當監控目錄時,它可以同時監控目錄及目錄中的各子目錄及文件的。此外, inotify 使用文件描述符作為接口,因而可以使用通常的文件 I/O 操作 select、 poll 和 epoll 來監視文件系統的變化。

3.inotify實現數據實時同步原理

無論是手動執行 rsync 還是把 rsync 客戶端發出的數據同步請求命令做成周期性任務計劃, 每隔一段時間不管有沒有數據變化都發出一次數據同步請求命令, 同步一次數據。 服務端和客戶端都有時間差。所以, 使用內核提供的 inotify 機制,當數據發生改變時(刪除、修改等)就觸發 rsync 客戶端發出數據 同步請求。 從而實現數據的實時傳輸。

rsync + inotify 機制實現的兩臺服務器數據同步如下圖如示:

技術分享圖片

4.inotify的安裝與使用

[root@localhost ~]# yum install -y inotify-tools
[root@localhost ~]# inotifywait -mrq --timefmt ‘%d%m%Y %H:%M‘ --format ‘%T %w%f‘ -e create /backup  #創建對目錄/backup的監控
17102017 00:02 /backup/1.txt
17102017 00:02 /backup/2.txt
17102017 00:02 /backup/3.txt
17102017 00:02 /backup/4.txt
17102017 00:02 /backup/5.txt

5.inotify之inotifywait命令詳解

參數詳解:
-r:遞歸查詢目錄
-q:打印監控時間信息
-m:始終保持時間監聽狀態
--excludei: 排除文件或目錄時,不區分大小寫。
--timefmt: 指定時間輸出的格式
--format: 打印使用指定的輸出類似格式字符串
a、 %w:顯示被監控文件的文件名;
b、 %f:如果發生某事件的對象是目錄,則顯示被監控目錄的名字;默認顯示為空串;
c、 %T:使用--timefmt 選項中自定義的時間格式;
d、 %e 表示發生的事件
e、 %Xe 事件以“X”分隔
-e:指定需要監控的事件
access: 文件或目錄被讀取
modify: 文件或目錄內容被修改
attrib: 文件或目錄屬性被改變
close: 文件或目錄封閉,無論讀/寫模式
open:文件或目錄被打開
move_to:文件或目錄被移動到另外一個目錄
move:文件或目錄被移動另一個目錄或從另一個目錄移動到當前目錄
create:文件或目錄被創建在當前目錄
delete:文件或目錄被刪除
unmount:文件系統被卸載
常用組合:close_write,modify,delete,create,attrib 

6.編寫監控腳本

[root@nfs scripts]# vim inotify.sh
#!/bin/bash
/usr/bin/inotifywait -mrq ‘%w%f‘ -e close_write,modify,delete,create /backup | while read line
do
cd /backup && rsync -azP ./ [email protected]::backup/ --password-file=/etc/rsync.password >/dev/null 2>&1
done
exit 0
[root@nfs scripts]# sh inotify.sh &             #<==運行腳本監控/backup
[root@nfs scripts]# touch /backup/{1..10}.log           #<==NFS上創建文件進行測試    
[root@backup backup]# ll                    #<==備份服務上查看是否備份成功   
total 4
-rw-r--r-- 1 rsync rsync    0 Oct 17 00:28 10.log
drwxr-xr-x 2 rsync rsync 4096 Oct 12 21:43 192.168.0.165
-rw-r--r-- 1 rsync rsync    0 Oct 17 00:28 1.log
-rw-r--r-- 1 rsync rsync    0 Oct 17 00:28 2.log
-rw-r--r-- 1 rsync rsync    0 Oct 17 00:28 3.log
-rw-r--r-- 1 rsync rsync    0 Oct 17 00:28 4.log
-rw-r--r-- 1 rsync rsync    0 Oct 17 00:28 5.log
-rw-r--r-- 1 rsync rsync    0 Oct 17 00:28 6.log
-rw-r--r-- 1 rsync rsync    0 Oct 17 00:28 7.log
-rw-r--r-- 1 rsync rsync    0 Oct 17 00:28 8.log
-rw-r--r-- 1 rsync rsync    0 Oct 17 00:28 9.log
[root@nfs scripts]# echo "/bin/bash /server/scripts/inotify.sh &" >> /etc/rc.local  #<==設置開機啟動

7.修改inotify默認參數(inotify默認內核參數值太小)

查看系統默認參數值
sysctl -a | grep max_queued_events
結果是:fs.inotify.max_queued_events = 16384
sysctl -a | grep max_user_watches
結果是:fs.inotify.max_user_watches = 8192
sysctl -a | grep max_user_instances
結果是:fs.inotify.max_user_instances = 128
修改參數:
sysctl -w fs.inotify.max_queued_events="99999999"
sysctl -w fs.inotify.max_user_watches="99999999"
sysctl -w fs.inotify.max_user_instances="65535"
vim /etc/sysctl.conf #添加以下代碼
fs.inotify.max_queued_events=99999999
fs.inotify.max_user_watches=99999999
fs.inotify.max_user_instances=65535
:wq! #保存退出
參數說明:
max_queued_events:
inotify隊列最大長度,如果值太小,會出現"** Event Queue Overflow **"錯誤,導致監控文件不準確
max_user_watches:
設置inotifywait或inotifywatch命令可以監視的文件數量(單進程)
max_user_instances:
每個用戶創建inotify實例最大值
【inotify在實際生產環境中,對於50-200KB的文件,inotify的最發並發量為200-300,如果客戶端寫入速度大於這個量,將會造成短暫的延遲】

8.總結

rysnc+inotify實時備份流程:
a.實現從NFS客戶端到rsync服務端的rsync的部署
b.實現從NFS客戶端對NFS目錄文件系統時間的實時監控
c.當監控到NFS目錄文件系統事件變化後,觸發rsync推送變化的文件

技術分享圖片

高並發數據實時同步方案:
(1)inotify(sersync)+rsync,是文件級別
(2)drbd文件系統級別,基於block塊文件
(3)第三方軟件的同步功能:
mysql同步,oracle,mongodb
(4)程序雙寫,直接寫入兩臺服務器
(5)業務邏輯解決(讀寫分離,備讀不到,讀主)

實時備份工具之inotify+rsync