當大家使用阿里云的SLB的時候就會遇到文件同步的問題,一般我們會選擇Rsync進行定期同步,單這樣的同步頻率和效率對業(yè)務影響往往較大,因此這里簡單介紹下Linux下觸發(fā)同步的實現(xiàn)方式以及其他在該特性基礎上實現(xiàn)文件防篡改的方式。
一、什么是rsync
Rsync(remotesynchronize)是一個遠程數(shù)據(jù)同步工具,可通過 LAN/WAN 快速同步多臺主機間的文件。Rsync 使用所謂的“Rsync 算法”來使本地和遠程兩個主機之間的文件達到同步,這個算法只傳送個文件的不同部分,而不是每次都整份傳送,因此速度相當快。rsync 同時也在拷貝文件時,加--partial可支持斷點續(xù)傳,比cp要好多了,同時也rsync也可以拷貝鏈接文件,這一點是cp做不到的。
二、什么是inotify
inotify 是文件系統(tǒng)事件監(jiān)控機制,作為 dnotify 的有效替代。dnotify 是較早內核支持的文件監(jiān)控機制。Inotify 是一種強大的、細粒度的、異步的機制,它滿足各種各樣的文件監(jiān)控需要,不僅限于安全和性能。
三、配置rsync + inotify觸發(fā)式同步
前提條件,linux內核版本高于2.6.13才能支持inotify特性
由于執(zhí)行腳本需要輸入目標服務器口令,因此我們需要先配置無密碼登錄
執(zhí)行ssh-keygen -t rsa,一路回車生成公鑰與密鑰
執(zhí)行ssh-copy-id -i~/.ssh/id_rsa.pub root@被控端IP 拷貝公鑰到被控端
需要輸入被控端密碼
下載所需的程序:
Inotify-toolshttps://github.com/rvoicilas/inotify-tools/wiki
Rsynchttp://rsync.samba.org/ftp/rsync
安裝所需程序:
tarzxvf rsync-3.1.1.tar.gz
cdrsync-3.1.1
./configure–prefix=/usr/local/rsync
make&& make install
tarzxvf inotify-tools-3.14.tar.gz
cdinotify-tools-3.14
./configure
make&& make install
配置同步腳本(以下內容保存為sh文件,例如rsync.sh):
#!/bin/sh
#源目錄
src=/home/wwwroot/
#目標目錄
des=/home/wwwroot
#目標IP
ip=192.168.1.2
ip2=192.168.1.3
#設置inotifywait可以監(jiān)視的文件數(shù)量
echo 50000000 >/proc/sys/fs/inotify/max_user_watches
#設置inotify實例事件(event)隊列可容納的事件數(shù)量
echo 327679 >/proc/sys/fs/inotify/max_queued_events
/usr/local/bin/inotifywait -mrq--timefmt '%d/%m/%y %H:%M' --format '%T%w%f' -e modify,delete,create,attrib ${src} | while read file
do
rsync -avz --delete --progress${src} root@${ip}:${des} &&
echo "${src} wasrsynced"
echo"-----------------------------------------------------"
rsync -avz --delete --progress${src} root@${ip2}:${des} &&
echo "${src} wasrsynced"
echo"-----------------------------------------------------"
done
將腳本添加到隨機啟動文件/etc/rc.local中,執(zhí)行nohup sh rsync.sh &即后臺執(zhí)行
腳本相關注釋:
-m 是保持一直監(jiān)聽
-r 是遞歸查看目錄
-q 是打印出事件~
rsync -aHqzt $SRC $DST
-a 存檔模式
-H 保存硬連接
-q 制止非錯誤信息
-z 壓縮文件數(shù)據(jù)在傳輸
-t 維護修改時間
-delete 刪除于多余文件
當要排出同步某個目錄時,為rsync添加--exclude=PATTERN參數(shù),注意,路徑是相對路徑。詳細查看man rsync
當要排除都某個目錄的事件監(jiān)控的處理時,為inotifywait添加--exclude或--excludei參數(shù)。詳細查看man inotifywait
注意:inotifywait可以監(jiān)視文件的動作有:
access 文件或目錄的內容被讀
modify 文件或目錄的內容被寫
attrib 文件或目錄的屬性被修改
close_write 文件或目錄以可寫模式關閉
close_nowrite 文件或目錄以只讀模式關閉
close 文件或目錄關閉,不管是什么模式
open 文件或目錄被打開
moved_to 文件或目錄移入監(jiān)控目錄
moved_from 文件或目錄移出監(jiān)控目錄
move 文件或目錄移動
create 文件或目錄創(chuàng)建
delete 文件或目錄在監(jiān)控目錄中刪除
delete_self 文件或目錄刪除
unmount 未掛載的文件或目錄
四、其他
1、高效觸發(fā)式同步軟件sersync2
下載地址:https://code.google.com/p/sersync/downloads/list
程序包含2個文件:confxml.xml配置文件和sersync2執(zhí)行程序
配置文件說明:
修改sshstart="true'以SSH方式傳輸文件
<rsync>
<sshstart="true"/>
</rsync>
開啟文件過濾
<filter start="true">
<excludeexpression="^info/*"></exclude>
<excludeexpression="(.*).gz"></exclude>
</filter>
同步源目錄和目標目錄設置
<localpath watch="/home/wwwroot">
<remote ip="192.168.1.2"name="/home/wwwroot"/>
</localpath>
執(zhí)行程序:
執(zhí)行前如果是SSH傳輸先配置好SSH免密碼登陸
./sersync2–d 后臺執(zhí)行
./sersync2–r 先執(zhí)行一次完整同步
./sersync2–o confxml.xml 指定配置文件
./sersync2–n num 指定線程數(shù),默認10個線程
監(jiān)控程序:
checksersync.sh
執(zhí)行后會判斷進程中是否有sersync2存在,沒有就自動執(zhí)行
如果有修改過配置文件名稱,那么相應監(jiān)控腳本內也需要修改對應
2、防篡改的實現(xiàn)
通過Inotiry和Rsync我們可以實現(xiàn)文件同步,根據(jù)Inotiry的特性我們也可以實現(xiàn)文件的放篡改,方法是將腳本中SCP反向傳輸即可,例如:
rsync -avz --delete --progressroot@${ip}:${des} ${src} &&
實現(xiàn)圖例:
WEB服務器檢測到行為1執(zhí)行行為2
防篡改源服務器檢測到行為3執(zhí)行行為2