Linux下Rsync+Inotify-tools實現資料實時同步

2012013977發表於2017-08-19
一:rsync、xinetd、inotify概念
1.rsync

rsync是類unix/linux系統下的資料映象備份工具。使用快速增量備份工具Remote Sync可以遠端同步,支援本地複製,或者與其他SSH、rsync主機同步。rsync是通過超級守護程式xinetd進行觸發同步和管理的。CentOS6.4預設已經安裝rsync,但未安裝xinetd
2.inotify
Inotify 是一種強大的、細粒度的、非同步的檔案系統事件監控機制,linux核心從2.6.13起,加入了Inotify支援,通過Inotify可以監控檔案系統中新增、修改、移動等各種細微事件,利用這個核心介面,第三方軟體就可以監控檔案系統下檔案的各種變化情況,而inotify-tools就是這樣的一個第三方軟體。
3、rsync+inotify 之推薦理由
1)伺服器效能:rsync+crontab會定時去檢查是否有檔案更新,即便沒有更新也會去檢查,這勢必會造成伺服器效能下降;而rsync+inotify組合是觸發式更新,只有在資料檔案有變化時,才會去更新,因此相對前者而言,是提高了伺服器效能
2)資料實時性:rsync+crontab是週期性任務計劃,不能保證資料的實時性;rsync+inotify組合是觸發式更新,只要有資料變化,就立刻同步更新
3)當同步的目錄資料量巨大時,建議使用 Rsync+sersync 架構,具體配置參考:http://www.osyunwei.com/archives/7447.html
二:實驗環境及目的
作業系統:CentOS 6.X
源伺服器:192.168.199.132
目標伺服器:192.168.199.131
目的:把源伺服器上/data目錄實時同步到目標伺服器的/data下
三:配置目標伺服器(client)192.168.199.131
1、關閉SELINUX

vi /etc/selinux/config #編輯防火牆配置檔案
#SELINUX=enforcing #註釋掉
#SELINUXTYPE=targeted #註釋掉
SELINUX=disabled #增加
:wq! #儲存,退出
setenforce 0  #立即生效
2、開啟防火牆tcp 873埠(Rsync預設埠)
vi /etc/sysconfig/iptables #編輯防火牆配置檔案
-A INPUT -p tcp -m tcp --dport 873 -j ACCEPT
:wq! #儲存,退出
/etc/init.d/iptables restart #最後重啟防火牆使配置生效
3、安裝Rsync服務端軟體,安裝前先使用 whereis rsync 檢視系統是否已安裝rsync,出現下面的提示,說明已經安裝
rsync: /usr/bin/rsync /usr/share/man/man1/rsync.1.gz,那就直接 yum install xinetd 就行了
yum install rsync xinetd #安裝
vi /etc/xinetd.d/rsync #編輯配置檔案,設定開機啟動rsync
disable = no #修改為no
:wq! #儲存退出
/etc/init.d/xinetd start #啟動(CentOS中是以xinetd來管理Rsync服務的)

4、建立rsyncd.conf配置檔案

vi /etc/rsyncd.conf #建立配置檔案,新增以下程式碼
log file = /var/log/rsyncd.log #日誌檔案位置,啟動rsync後自動產生這個檔案,無需提前建立
pidfile = /var/run/rsyncd.pid  #pid檔案的存放位置
lock file = /var/run/rsync.lock  #支援max connections引數的鎖檔案
secrets file = /etc/rsync.pass  #使用者認證配置檔案,裡面儲存使用者名稱稱和密碼,後面會建立這個檔案
motd file = /etc/rsyncd.Motd  #rsync啟動時歡迎資訊頁面檔案位置(檔案內容自定義)
[test] #自定義模組名稱
path = /data/ #rsync服務端資料目錄路徑
comment = test #模組名稱與[home_www.osyunwei.com]自定義名稱相同
uid = root #設定rsync執行許可權為root
gid = root #設定rsync執行許可權為root
port=873  #預設埠
use chroot = no #預設為true,修改為no,增加對目錄檔案軟連線的備份
read only = no  #設定rsync服務端檔案為讀寫許可權
list = no #不顯示rsync服務端資源列表
max connections = 200 #最大連線數
timeout = 600  #設定超時時間
auth users = root #執行資料同步的使用者名稱,可以設定多個,用英文狀態下逗號隔開
hosts allow = 192.168.199.131 #允許進行資料同步的客戶端IP地址,可以設定多個,用英文狀態下逗號隔開
hosts deny = 192.168.21.254 #禁止資料同步的客戶端IP地址,可以設定多個,用英文狀態下逗號隔開
:wq!  #儲存,退出
5、建立使用者認證檔案
vi /etc/rsync.pass #配置檔案,新增以下內容
home_www.osyunwei.com_user:123456  #格式,使用者名稱:密碼,可以設定多個,每行一個使用者名稱:密碼
:wq!  #儲存,退出
6、設定檔案許可權
chmod 600 /etc/rsyncd.conf  #設定檔案所有者讀取、寫入許可權
chmod 600 /etc/rsync.pass  #設定檔案所有者讀取、寫入許可權,這兩個不設定的話會報錯
7、啟動rsync
/etc/init.d/xinetd start  #啟動
service xinetd stop   #停止
service xinetd restart #重新啟動
chkconfig --list  #檢查rsync執行狀態
ss -antl  #檢查873埠是否成功監聽
四:配置源伺服器(client)192.168.199.132
一):安裝Rsync客戶端
1、關閉SELINUX

vi /etc/selinux/config #編輯防火牆配置檔案
#SELINUX=enforcing #註釋掉
#SELINUXTYPE=targeted #註釋掉
SELINUX=disabled #增加
:wq! #儲存,退出
setenforce 0 #立即生效
2、開啟防火牆tcp 873埠(Rsync預設埠,做為客戶端的Rsync可以不用開啟873埠)
vi /etc/sysconfig/iptables #編輯防火牆配置檔案
-A INPUT -p tcp -m tcp --dport 873 -j ACCEPT
:wq! #儲存,退出
/etc/init.d/iptables restart #最後重啟防火牆使配置生效
3、安裝Rsync客戶端軟體
whereis rsync   #檢視系統是否已安裝rsync,出現下面的提示,說明已經安裝
rsync: /usr/bin/rsync /usr/share/man/man1/rsync.1.gz
yum install  xinetd  #只安裝xinetd即可,CentOS中是以xinetd來管理rsync服務的
yum install rsync xinetd #如果預設沒有rsync,執行此命令進行安裝rsync和xinetd
vi /etc/xinetd.d/rsync #編輯配置檔案,設定開機啟動rsync
disable = no #修改為
/etc/init.d/xinetd start #啟動(CentOS中是以xinetd來管理rsync服務的)
4、建立認證密碼檔案
vi /etc/passwd.txt  #編輯檔案,新增以下內容
123456 #密碼
:wq! #儲存退出
chmod 600 /etc/passwd.txt #設定檔案許可權,只設定檔案所有者具有讀取、寫入許可權即可,600許可權必須設定,否則會報錯
5、測試源伺服器192.168.199.132到兩臺目標伺服器192.168.199.131之間的資料同步
在源伺服器/data下touch 1.php,新建一個檔案
rsync -avH --port=873 --progress --delete  /data(目錄) root(使用者名稱)@192.168.199.131::test(模組名) --password-file=/etc/passwd.txt
執行完成後,在目標伺服器192.168.199.131上檢視,在/data目錄下有1.php檔案,存在說明資料同步成功。
二)、安裝Inotify-tools工具,實時觸發rsync進行同步
1、檢視伺服器核心是否支援inotify

ll /proc/sys/fs/inotify   #列出檔案目錄,出現下面的內容,說明伺服器核心支援inotify
-rw-r--r-- 1 root root 0 Mar  7 02:17 max_queued_events
-rw-r--r-- 1 root root 0 Mar  7 02:17 max_user_instances
-rw-r--r-- 1 root root 0 Mar  7 02:17 max_user_watches
備註:Linux下支援inotify的核心最小為2.6.13,可以輸入命令:uname -a檢視核心
CentOS 5.X 核心為2.6.18,預設已經支援inotify
2、安裝inotify-tools
yum install make  gcc gcc-c++  #安裝編譯工具
inotify-tools下載地址:http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
上傳inotify-tools-3.14.tar.gz到/usr/local/src目錄下
cd /usr/local/src
tar zxvf inotify-tools-3.14.tar.gz  #解壓
cd inotify-tools-3.14 #進入解壓目錄
./configure --prefix=/usr/local/inotify  #配置
make  #編譯
make install  #安裝
3、設定系統環境變數,新增軟連線
echo "PATH=/usr/local/inotify/bin:$PATH" >>/etc/profile.d/inotify.sh
source /etc/profile.d/inotify.sh  #使設定立即生效
echo "/usr/local/inotify/lib" >/etc/ld.so.conf.d/inotify.conf
ln -s /usr/local/inotify/include  /usr/include/inotify
4、修改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"
vi /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 #要同步的檔案包含多少目錄,可以用:find /data -type d | wc -l 統計,必須保證max_user_watches值大於統計結果(這裡/data為同步檔案目錄)
max_user_instances #每個使用者建立inotify例項最大值
5、建立指令碼,實時觸發rsync進行同步
vi /usr/local/inotify/rsync.sh   #編輯,新增以下程式碼
#!/bin/sh
srcdir=/data
dstdir=test
excludedir=/usr/local/inotify/exclude.list #可以註釋,但是需要的話,這個目錄一定要存在
rsyncuser=root
rsyncpassdir=/etc/passwd.txt
dstip="192.168.199.131"
for ip in $dstip
do
rsync -avH --port=873 --progress --delete  --exclude-from=$excludedir  $srcdir $rsyncuser@$ip::$dstdir --password-file=$rsyncpassdir
done
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,modify,delete,create,attrib,move $srcdir |  while read file
do
for ip in $dstip
do
rsync -avH --port=873 --progress --delete  --exclude-from=$excludedir  $srcdir $rsyncuser@$ip::$dstdir --password-file=$rsyncpassdir
echo "  ${file} was rsynced" >> /tmp/rsync.log 2>&1
done
done
指令碼引數說明:
srcdir=/data/  #源伺服器同步目錄
dstdir=test    #目標伺服器rsync同步目錄模組名稱
excludedir=/usr/local/inotify/exclude.list   
#不需要同步的目錄,如果有多個,每一行寫一個目錄,使用相對於同步模組的路徑;
#例如:不需要同步/data/目錄下的a目錄和b目錄下面的b1目錄,exclude.list檔案可以這樣寫
a/
b/b1/
rsyncuser=root  #目標伺服器rsync同步使用者名稱
rsyncpassdir=/etc/passwd.txt  #目標伺服器rsync同步使用者的密碼在源伺服器的存放路徑
dstip="192.168.199.131"  #目標伺服器ip,多個ip用空格分開
/tmp/rsync.log  #指令碼執行日誌記錄
6、設定指令碼開機自動執行
vi /etc/rc.d/rc.local  #編輯,在最後新增一行
sh /usr/local/inotify/rsync.sh & #設定開機自動在後臺執行指令碼
:wq!  #儲存退出
7、測試inotify實時觸發rsync同步指令碼是否正常執行
在源伺服器192.168.199.132上建立檔案ceshi.php
重新啟動源伺服器:192.168.199.132,重啟的目的是為了讓上一步設定的開機自啟動生效,也可以不重啟直接執行 sh /usr/local/inotify/rsync.sh & 
但這時執行後不能按ctrl+c結束它,因為結束了就又把啟動的給關閉了,這時可以使用ftp上傳檔案到/data/目錄,檢視同步效果 
等系統啟動之後,檢視目標伺服器192.168.199.131的/data/下是否有ceshi.php檔案
然後再在源伺服器192.168.199.132建立資料夾ceshi
繼續檢視目標伺服器192.168.199.131的/data/下是否有ceshi資料夾
如果以上測試都通過,說明inotify實時觸發rsync同步指令碼執行正常。
至此,Linux下Rsync+Inotify-tools實現資料實時同步完成。

參考1:http://www.osyunwei.com/archives/7435.html

參考2:http://nmshuishui.blog.51cto.com/1850554/1387048

相關文章