1. 程式人生 > >rsync+inotify實現文件實時同步-步驟詳解

rsync+inotify實現文件實時同步-步驟詳解

rsync inotify

實驗拓撲(centos7下):192.168.80.181 服務器端(主機名www.aa.com)
192.168.80.182 客戶端(主機名www.ab.com)
1、使用SSH源:安裝rsync,服務端和客戶端同時安裝,只使用客戶端命令就OK了。
systemctl stop firewalld
setenforce 0
yum install -y rsync
---以上三句在服務器端和客戶端都要執行---------
rsync -avz [email protected]:/tmp/ /opt/ //在客戶端執行,把服務器端tmp目錄的內容同步到客戶端opt目錄下
技術分享圖片
rsync -rlvz /opt/ [email protected]:/tmp/ //在客戶端執行,把客戶端本機的opt目錄同步給181主機的tmp目錄
技術分享圖片
同步前181主機:
技術分享圖片
同步後181主機:
技術分享圖片
//如果避免交互的話需要配置公鑰驗證。以下兩句實現在182主機上產生公鑰與私鑰,把本機公鑰傳給181主機,這樣下次在182主機上使用同步命令時不需要輸入181主機密碼,即避免交互。
//如果要實現在181主機上使用同步命令時不需要輸入182主機密碼,只需把IP地址修改為182
[www.ab.com@ ~]# ssh-keygen -t rsa //跳出語句一直enter就行
[www.ab.com@ ~]# ssh-copy-id [email protected]
技術分享圖片
-----------------------------在客戶端驗證同步測試-------------------------
181 /var/www/html 下有A開頭文件,客戶機/tmp下有B開頭文件,執行下面命令後客戶機上B開頭文件應該被刪除:
[www.ab.com@ ~]# rsync -avz --delete [email protected]:/var/www/html/ /tmp/ //--delete的作用
技術分享圖片
技術分享圖片

2.使用RSYNC作為源:需要配置RSYNC服務端程序
-------新建並配置rsync源服務器使其可以被同步(讀取或寫入)------
vi /etc/rsyncd.conf
uid = nobody //運行用戶
gid = nobody //運行用戶組

use chroot = yes //禁錮在源目錄
address = 192.168.80.181 //監聽地址
port 873 //監聽端口
log file = /var/log/rsyncd.log //日誌文件位置
pid file = /var/run/rsyncd.pid //存放進程ID的文件位置
hosts allow = 192.168.80.0/24 //允許訪問的客戶端地址
[wwwroot] //共享模塊名稱
path = /var/www/html //源目錄實際路徑
comment = Document Root of www.benet.com //說明
read only = yes //是否為只讀
dont compress = .gz .bz2 .tgz .zip .rar .z //同步時不再壓縮的文件類型
auth users = backuper //授權賬戶
secrets file = /etc/rsyncd_users.db //存放賬戶信息的數據文件
:wq
----建立虛擬用戶配置文件並設置恰當的權限-----
[www.aa.com@ ~]# vi /etc/rsyncd_users.db
backuper:123123 //無需建立同名系統賬戶,這裏是虛擬用戶
:wq
[www.aa.com@ ~]# chmod 600 /etc/rsyncd_users.db //由於賬號明文存放,因此要調整文件權限,避免賬號信息泄露
//備份用戶backuper需要對源目錄/var/www/html/有相應讀取權限,實際上,只要other組有讀取權限,授權用戶backuper和運行用戶nobody也就有讀取權限了。
技術分享圖片
//如果目錄不存在就新建一個
----啟動、關閉rsync程序---
[www.aa.com@ ~]# rsync --daemon
[www.aa.com@ ~]# netstat -anpt | grep rsync
技術分享圖片
關閉rsync程序:
[www.aa.com@ ~]# killall -3 rsync //沒有killall命令就執行yum install psmisc -y安裝
技術分享圖片
再次啟動:
技術分享圖片
如果出現上述錯誤,只需rm -rf /var/run/rsyncd.pid,之後再去啟動就可以了。
------------在客戶端測試同步情況------
[www.ab.com@ ~]# rsync -avz [email protected]::wwwroot/ /tmp/ //把服務器上源目錄的文件下載到本地tmp目錄下
技術分享圖片
技術分享圖片
技術分享圖片

[www.ab.com@ ~]# rsync -avz /bin/b* [email protected]::wwwroot //把本地的文件上傳到服務器(註意服務器端目錄本身以及程序的權限)
技術分享圖片
出現上述錯誤,是因為服務器端rsync的配置文件中read only是只讀,沒有寫入權限,且目錄本身沒有賦予other寫入的權限
[www.aa.com@ ~]# chown nobody /var/www/html/
[www.aa.com@ ~]# vi /etc/rsyncd.conf //修改read only的值為no
技術分享圖片
此時無需重啟服務,再次執行同步命令:
技術分享圖片
技術分享圖片
----使客戶端使用rsync備份時不需要密碼交互----
[www.ab.com@ ~]# export RSYNC_PASSWORD=123123 //臨時生效,關機後失效
//以下配置永久生效
[www.ab.com@ ~]# vi /etc/profile
export RSYNC_PASSWORD=123123 添加到最後一行下
[www.ab.com@ ~]# source /etc/profile
3.配置rsync+inotify實時同步
----編譯安裝inotify(被備份主機上做)----
[www.aa.com@ ~]# tar xf inotify-tools-3.14.tar.gz -C /opt
[www.aa.com@ ~]# cd /opt/inotify-tools-3.14/
[www.aa.com@ ~]# ./configure
[www.aa.com@ ~]# make && make install
-------配合inotify觸發備份、調整內核參數(在被備份主機181上改)----
[www.aa.com@ ~]# vi /etc/sysctl.d/te.conf
fs.inotify.max_queued_events = 16384 //監控隊列大小
fs.inotify.max_user_instances = 1024 //最多監控實例數
fs.inotify.max_user_watches = 1048576 //每個實例最多監控文件數
:wq
[www.aa.com@ ~]# sysctl -p //初始化
-----測試監控效果------
[www.aa.com@ ~]# inotifywait -mrq -e modify,create,move,delete /opt/test/ //m(持續監控)r(遞規整個目錄)q(簡化輸入信息) -e指定監控的事件:向被監控的目錄寫入或者其它操作時會有輸出。
技術分享圖片
---通過腳本完成觸發備份任務,這裏只要/opt//test/目錄下有新建修改移除刪除等動作時,會完全備份到/var/www/html/目錄下-----
[www.aa.com@ ~]# vi /opt/inotify_rsync.sh
#!/bin/bash
INOTIFY_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /opt/test/"
RSYNC_CMD="rsync -azH --delete /opt/test/ [email protected]::wwwroot"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
if [ $(pgrep rsync | wc -l) -le 5 ] ; then
$RSYNC_CMD
fi
done
:wq
技術分享圖片
[www.aa.com@ ~]# sh /opt/inotify_rsync.sh &
-----測試查看------
[www.aa.com@ ~]# rm -rf /opt/test/t2
技術分享圖片

rsync+inotify實現文件實時同步-步驟詳解