rsync+inotify實現實時同步案例【轉】

 

1.1 inotify介紹

inotify是一種強大的、細粒度的、異步的文件系統事件控制機制。linux內核從2.6.13起,加入了inotify支持,經過inotify能夠監控文件系統中添加、刪除、修改、移動等各類事件,利用這個內核接口,第三方軟件就能夠監控文件系統下文件的各類變化狀況,而inotify-tools正是實施監控的軟件。
2.1基本架構

3.1 基本環境部署(這裏爲了不不兼容的狀況出現,採用統一版本的系統)

主機名 IP地址 系統版本 內核版本
inotify master 10.72.16.112 centos 6.8 2.6.32-642.el6.x86_64
inotify slave 10.72.16.59 centos 6.8 2.6.32-642.el6.x86_64

4.1 inotify-slave部署

這裏就是部署rsync服務,rsync daemon工做模式。
4.1.1檢查是否安裝rsync
 rpm -qa  rsync
結果

4.1.2 新建rsync用戶及模塊目錄並更改其用戶組

useradd rsync -s /sbin/nologin  -M
mkdir /backup   #建立rsync daemon工做模式的模塊目錄
chown rsync.rsync /backup/   #更改模塊目錄的用戶組
ll -d /backup/

 

4.1.3 編寫rsync daemon配置文件/etc/rsyncd.conf

#rsync_config_____start
#created by chensiqi 13:40 2017-3-6
##blog:http://www.cnblogs.com/chensiqiqi/
##rsyncd.conf start##

# 用戶
uid = rsync
# 組
gid = rsync
# 程序安全設置
use chroot = no
# 客戶端鏈接數
max connections = 200
# 超時時間
timeout = 300
# 進程號文件位置
pid file = /var/run/rsyncd.pid
# 進程鎖
lock file = /var/run/rsync.lock
# 日誌文件位置
log file = /var/log/rsyncd.log
##########################################
[backup]
# 使用目錄
path = /backup/
# 有錯誤時忽略
ignore errors
# 可讀可寫(true或false)
read only = false
# 阻止遠程列表(不讓經過遠程方式看服務端有啥)
list=false
# 容許IP
hosts allow = 192.168.197.0/24
# 禁止IP 
hosts deny = 0.0.0.0/32
# 虛擬用戶
auth users = rsync_backup
# 存放用戶和密碼的文件
secrets file = /etc/rsync.password

##rsync_config______end##如下表示沒有拒絕的連接。

 

4.1.4 配置虛擬用戶的密碼文件

echo "rsync_backup:123456" >/etc/rsync.password
#注:rsync_backup爲虛擬用戶,123456爲這個虛擬用戶的密碼
chmod 600 /etc/rsync.password #爲密碼文件提權,增長安全性

 

4.1.5 啓動rsync 服務

rsync --daemon   #啓動rsync服務
ps -ef |grep rsync
root       2389      1  0 10:15 ?        00:00:00 rsync --daemon
root       2392   2305  0 10:15 pts/0    00:00:00 grep rsync
ss    -tunl
tcp   LISTEN     0      5                                                :::873                                             :::*     
tcp   LISTEN     0      5                                                 *:873                                              *:*  

 

4.1.6 經過inotify-master測試推送

inotify-master配置密碼文件,測試推送
echo "123456" >/etc/rsync.password
#注意:這裏只要寫密碼便可,切記。
chmod 600 /etc/rsync.password
echo "hello sjf">test.txt
rsync -avz test.txt rsync_backup@192.168.42.116::backup --password-file=/etc/rsync.password
sending incremental file list
test.txt

sent 79 bytes  received 27 bytes  42.40 bytes/sec
total size is 10  speedup is 0.09
inotify-slave檢查:
ll /backup/
total 4
-rw-r--r-- 1 rsync rsync 10 Oct 29 10:20 test.txt
cat /backup/test.txt 
hello sjf

 

5.1 inotify-master部署

注:
inotify是rsync客戶端安裝和執行的
企業場景壓力測試200-300個同步限制,受網卡,磁盤,帶寬等的制約。
5.1.1 查看當前系統是否支持inotify
ll /proc/sys/fs/inotify/
total 0
-rw-r--r-- 1 root root 0 Oct 29 10:43 max_queued_events
-rw-r--r-- 1 root root 0 Oct 29 10:43 max_user_instances
-rw-r--r-- 1 root root 0 Oct 29 10:43 max_user_watches
#顯示這三個文件則證實支持。
番外:
   /proc/sys/fs/inotify/max_queued_evnets      
表示調用inotify_init時分配給inotify instance中可排隊的event的數目的最大值,超出這個值的事件被丟棄,但會觸發IN_Q_OVERFLOW事件。
   /proc/sys/fs/inotify/max_user_instances 
表示每個real user ID可建立的inotify instatnces的數量上限。
   /proc/sys/fs/inotify/max_user_watches 
表示每一個inotify instatnces可監控的最大目錄數量。若是監控的文件數目巨大,須要根據狀況,適當增長此值的大小。
例如: echo 30000000 > /proc/sys/fs/inotify/max_user_watches

優化:
echo "50000000" >/proc/sys/fs/inotify/max_user_watches echo "50000000" >/proc/sys/fs/inotify/max_queued_events 

 

 

5.1.2 inotify的安裝

inotify能夠編譯安裝也能夠直接yum安裝
我這裏採用的是yum安裝的方式
yum -y install inotify-tools
固然我這裏也給出編譯安裝的方法
wget  http://jaist.dl.sourceforge.net/project/inotify-tools/inotify-tools/3.13/inotify-tools-3.13.tar.gz
tar zxf inotify-tools-3.13.tar.gz
cd inotify-tools-3.13
./configure --prefix=/usr/local/inotify-3.13 #配置inotify,並指定安裝路徑爲/usr/local/inotify-3.13
make && make install
注意這裏安裝完成後記得將命令所在路徑引入環境變量
vi /etc/profile
PATH=$JAVA_HOME/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:$JAVA_HOME/bin:/usr/local/inotify-3.13/bin
source /etc/profile

 

 

5.1.3 inotify之inotifywait命令經常使用參數詳解

inotifywait --help
-r|--recursive   Watch directories recursively. #遞歸查詢目錄
-q|--quiet      Print less (only print events). #打印監控事件的信息
-m|--monitor   Keep listening for events forever.  Without this option, inotifywait 
will exit after one  event is received.        #始終保持事件監聽狀態
--excludei <pattern>  Like --exclude but case insensitive.    #排除文件或目錄時,不區分大小寫。
--timefmt <fmt> strftime-compatible format string for use with %T in
--format string. #指定時間輸出的格式
--format <fmt>  Print using a specified printf-like format string; read the man page for more details.
#打印使用指定的輸出相似格式字符串
-e|--event <event1> [ -e|--event <event2> ... ] Listen for specific event(s).  
If omitted, all events are  listened for.  
 #經過此參數能夠指定須要監控的事件
以下所示:
Events:
access           file or directory contents were read       #文件或目錄被讀取。
modify           file or directory contents were written    #文件或目錄內容被修改。
attrib           file or directory attributes changed      #文件或目錄屬性被改變。
close            file or directory closed, regardless of read/write mode    #文件或目錄封閉,不管讀/寫模式。
open             file or directory opened                    #文件或目錄被打開。
moved_to         file or directory moved to watched directory    #文件或目錄被移
動至另一個目錄。
move             file or directory moved to or from watched directory    #文件或目
錄被移動另外一個目錄或從另外一個目錄移動至當前目錄。
create           file or directory created within watched directory     #文件或目錄被建立在當前目錄
delete           file or directory deleted within watched directory     #文件或目錄
被刪除
unmount          file system containing file or directory unmounted  #文件系統被
卸載

 

 

測試create

在第一個窗口輸入以下內容:
[root@backup ~]# ls /backup
[root@backup ~]# inotifywait -mrq --timefmt '%y %m %d %H %M' --format '%T %w%f' -e create /backup

在第二個窗口:輸入以下內容
[root@backup ~]# cd /backup
[root@backup backup]# touch chensiqi

此時回到第一個窗口出現以下內容:
17 03 11 07 19 /backup/chensiqi

#命令說明
inotifywait:ionotify的命令工具
-mrq:-q只輸入簡短信息 -r,遞歸監控整個目錄包括子目錄 -m進行不間斷持續監聽
--timefmt 指定輸出的時間格式 
--format:指定輸出信息的格式
-e create:制定監控的時間類型,監控建立create事件。

 

 

5.1.4 編寫監控腳本並加載到後臺執行

#!/bin/bash
#sjf
host01=10.72.16.59  #inotify-slave的ip地址
src=/backup/                   #本地監控的目錄
dst=backup                     #inotify-slave的rsync服務的模塊名
user=rsync_backup              #inotify-slave的rsync服務的虛擬用戶
rsync_passfile=/etc/rsync.password           #本地調用rsync服務的密碼文件
#inotify_home=/usr/share/doc/inotify-3.14     #inotify的安裝目錄
inotify_home=/usr/local/inotify-3.13   #這個是yum安裝的軟件的安裝所在目錄
#judge
if [ -z "$src" ] || [ -z "${rsync_passfile}" ] || [ -z "${inotify_home}/bin/inotifywait" ] || [ -z "/usr/bin/rsync" ]; then
    echo "Check File and Folder" 
    exit 9 
fi
${inotify_home}/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src | while read file
do
    cd $src && rsync -aruz -R --delete ./  --timeout=100 $user@$host01::$dst --password-file=${rsync_passfile} >/dev/null 2>&1
done
exit 0
inotify-master操做:
cd /backup/
for i in `seq 200`;do  touch   $i  ;done  #建立200個文件
ls -l --time-style=full-iso
total 0
-rw-r--r-- 1 root root 0 2016-10-29 11:38:16.183409656 +0800 1
-rw-r--r-- 1 root root 0 2016-10-29 11:38:16.225409783 +0800 10
-rw-r--r-- 1 root root 0 2016-10-29 11:38:16.526410667 +0800 100
-rw-r--r-- 1 root root 0 2016-10-29 11:38:16.528410673 +0800 101
-rw-r--r-- 1 root root 0 2016-10-29 11:38:16.530410679 +0800 102
-rw-r--r-- 1 root root 0 2016-10-29 11:38:16.533410688 +0800 103
-rw-r--r-- 1 root root 0 2016-10-29 11:38:16.535410694 +0800 104
-rw-r--r-- 1 root root 0 2016-10-29 11:38:16.538410703 +0800 105
-rw-r--r-- 1 root root 0 2016-10-29 11:38:16.539410707 +0800 106
-rw-r--r-- 1 root root 0 2016-10-29 11:38:16.552410742 +0800 107

 

inotify-slave檢查
ll  --time-style=full-iso
total 0
-rw-r--r-- 1 rsync rsync 0 2016-10-29 11:38:16.000000000 +0800 1
-rw-r--r-- 1 rsync rsync 0 2016-10-29 11:38:16.000000000 +0800 10
-rw-r--r-- 1 rsync rsync 0 2016-10-29 11:38:16.000000000 +0800 100
-rw-r--r-- 1 rsync rsync 0 2016-10-29 11:38:16.000000000 +0800 101
-rw-r--r-- 1 rsync rsync 0 2016-10-29 11:38:16.000000000 +0800 102
-rw-r--r-- 1 rsync rsync 0 2016-10-29 11:38:16.000000000 +0800 103
-rw-r--r-- 1 rsync rsync 0 2016-10-29 11:38:16.000000000 +0800 104
-rw-r--r-- 1 rsync rsync 0 2016-10-29 11:38:16.000000000 +0800 105
-rw-r--r-- 1 rsync rsync 0 2016-10-29 11:38:16.000000000 +0800 106
-rw-r--r-- 1 rsync rsync 0 2016-10-29 11:38:16.000000000 +0800 107
-rw-r--r-- 1 rsync rsync 0 2016-10-29 11:38:16.000000000 +0800 108

 

這樣咱們結合inotify的測試就完成了,是否是很簡單!

轉自
做者:sjfbjs
連接:https://www.jianshu.com/p/28f9f7cbfd9c
參考:
inotify+rsync實現實時同步部署 - Williamer - 博客園 https://www.cnblogs.com/hackerer/p/5243639.html
真正的inotify+rsync實時同步 完全告別同步慢 - 琴酒網絡 - 博客園 https://www.cnblogs.com/ginvip/p/6430986.html
Linux實戰教學筆記21:Rsync數據同步工具 - 陳思齊 - 博客園 https://www.cnblogs.com/chensiqiqi/p/6514315.html
Linux實戰教學筆記23:Inotify事件監控工具 - 陳思齊 - 博客園 https://www.cnblogs.com/chensiqiqi/p/6542268.html
相關文章
相關標籤/搜索