Rsync檔案同步與inotify實作檔案同步功能
Rsync
- rsync是linux系統下的資料鏡像備份工具。使用快速增量備份工具Remote Sync可以遠端同步,支援本地複制,或者與其他SSH、rsync主機同步。
-
# 使用的參數說明: v: 顯示詳細資訊 z: 傳輸過程中對資料進行壓縮 r: 遞歸 t: 保留修改時間屬性 o: 保留檔案所有者屬性 p: 保留檔案權限屬性 g: 保留檔案所屬組屬性 a: 歸檔模式,主要保留檔案屬性,等同于-rlptgoD --progress: 顯示資料傳輸的進度資訊 --password-file=FILE: 指定密碼檔案,将密碼寫入檔案,實作非互動式資料同步,這個檔案名也需要修改權限為600 --delete: 删除那些僅在目标路徑中存在的檔案(源路徑中不存在),在腳本中的資料同步經常加上此參數 --list-only: 僅列出伺服器子產品清單,需要rsync伺服器設定list=true
-
使用rsync将目前目錄下的内容同步到遠端伺服器11.22.33.44的tmp目錄下,并且删除遠端伺服器上在本地沒有的檔案,-a 歸檔模式,主要保留檔案屬性,等同于-rlptgoD;-v 能顯示詳細步驟;-z 表示在傳輸過程中壓縮;-e 表示指定要使用的遠端shell。rsync -e "ssh -p22" -avz --delete ./ [email protected]:/tmp
-
上面指令的精簡rsync -avz --delete ./ [email protected]:/tmp
Rsync 虛拟賬戶登入同步檔案
該模式需要在服務端安裝rsync
1. 服務端Rsync
-
在服務端安裝rsyncyum -y install rsync
- 編輯
/etc/rsyncd.conf
# 設定伺服器資訊提示檔案,在該檔案中編寫提示資訊 motd file = /etc/rsync/rsyncd.motd # 開啟rsync資料傳輸日志功能 transfer logging = yes # 設定日志檔案名,可通過log format參數設定日志格式 log file = /var/log/rsyncd.log # 設定rsync程序号儲存檔案名稱 pid file = /var/run/rsyncd.log # 設定鎖檔案名稱 lock file = /var/run/rsync.lock # 設定伺服器監聽的端口号,預設是873 port = 873 # 設定本伺服器所監聽網卡接口的ip位址 address = 0.0.0.0 # 設定進行資料傳輸時所使用的帳戶名或ID号,預設使用nobody uid = root # 設定進行資料傳輸時所使用的組名或GID号,預設使用nobody gid = root # 若為yes, rsync會首先進行chroot設定,将根映射在下面的path參數路徑下,對用戶端而言,系統的根就是path參數指定的路徑。但這樣做需要root權限,并且在同步符号連接配接資料時隻會同步名稱,不會同步内容。 use chroot = no # 是否允許用戶端上傳資料,yes表示不允許 read only = no # 設定并發連接配接數,0表示無限制 max connections = 50 [common] # 自定義子產品名,rsync通過子產品定義同步的目錄,可定義多個 # 定義注釋說明字串 comment = web content # 同步目錄的真是路徑通過path指定 path = /home/www/composer # 忽略一些IO錯誤 ignore errors # exclude指定common目錄下某個目錄可以不同步資料 # exclude = test/ # 設定允許連接配接伺服器的賬戶,此賬戶可以是系統中不存在的使用者 auth users = rsync # 密碼驗證檔案名,該檔案權限要求為隻讀,建議為600,僅在設定auth users後有效 secrets file = /etc/rsync/rsyncd.secrets # 設定哪些主機可以同步資料,多ip和網段之間使用空格分隔 # hosts allow = 11.22.33.44 # 除了hosts allow定義的主機外,拒絕其他所有 # hosts deny=* # 用戶端請求顯示子產品清單時,本子產品名稱是否顯示,預設為true list = false
- 在指令行執行
echo "tom:123" > /etc/rsync/rsyncd.secrets chmod 600 /etc/rsync/rsyncd.secrets echo "welcome to access" > /etc/rsync/rsyncd.motd #此項用戶端不需要做 rsync --daemon # --daemon表示背景執行,用戶端開啟rsync不需要--daemon選項 echo "/usr/bin/rsync --daemon" >> /etc/rc.local #開機啟動rsync服務
- 這項待定
# groupadd --system --gid 102 rsync # useradd --system -g rsync --no-create-home --home /nonexistent --comment "rsync user" --shell /sbin/nologin --uid 102 rsync
- 開放873預設端口
2. 用戶端Rsync
-
安裝rsyncyum -y install rsync
- 指令行執行
echo "123456789" > /etc/rsyncd.secrets #用戶端隻需要把密碼寫入檔案 chmod 600 /etc/rsyncd.secrets
3. 執行同步操作
-
上面指令的含義為使用 /etc/rsyncd.secrets 裡面設定的密碼配置,使用tom虛拟賬号(tom賬号可以為linux系統中沒有到賬戶),使用公共子產品common,同步用戶端 /tmp 下檔案到服務端,具體到服務端什麼地方,可以檢視服務端配置。rsync -avz --progress --password-file=/etc/rsyncd.secrets [email protected]::common /tmp
inotify
- Inotify是一種強大的、細粒度的、異步的檔案系統事件監控機制,linux核心從2.6.13起,加入了inotify支援,通過Inotify可以監控檔案系統添加、删除、移動、修改等各種事件,利用這個核心接口,第三方軟體就可以監控檔案系統下檔案的各種變化情況
- 安裝 inotify-tools 該軟體包共安裝了兩個工具(指令),即inotifywait和inotifywatch
- inotifywait:在被監控的檔案或目錄上等待特定檔案系統事件(open、close、delete等)發生,執行後處于阻塞狀态,适合在腳本中使用
- inotifywatch:收集被監視的檔案系統使用度統計資料,指檔案系統事件發生的次數統計
- inotifywait指令常用參數詳解
參數 說明 含義 -r –recursive 遞歸查詢目錄 -q –quiet 列印很少的資訊,僅僅列印監控事件的資訊 -m –monitor 始終保持事件監聽狀态 –format – 列印使用指定的輸出類似格式字元串 –timefmt – 指定事件輸出的格式 -e –event 通過此參數可以指定要監控的事件 – access 檔案或目錄被讀取 – modify 檔案或目錄的内容被修改 – attrib 檔案或目錄的屬性被改變 – close 檔案或目錄被封閉,無論讀/寫模式 – open 檔案或目錄被打開 – move_to 檔案或目錄被移動至另外一個目錄 – move 檔案或目錄被移動至另外一個目錄或從另一個目錄移動至目前目錄 – create 檔案或目錄被建立在目前目錄 – delete 檔案或目錄被删除 – umount 檔案系統被解除安裝 Rsync檔案同步與inotify實作檔案同步功能Rsync檔案同步與inotify實作檔案同步功能 -
監控/backup目錄下檔案的建立,新開一個視窗建立一個檔案,傳回原來視窗,檢視回報,如下inotifywait -mrq --timefmt '%d%m%y %H:%M' --format '%T %w%f' -e create /backup
Rsync檔案同步與inotify實作檔案同步功能Rsync檔案同步與inotify實作檔案同步功能 -
同時測試create、modify、delete,效果如下inotifywait -mrq --timefmt '%d%m%y %H:%M' --format '%T %w%f' -e delete,close_write,modify /backup/
Rsync檔案同步與inotify實作檔案同步功能Rsync檔案同步與inotify實作檔案同步功能 -
簡化事件輸出inotifywait -mrq --format '%w%f' -e create /backup
Rsync檔案同步與inotify實作檔案同步功能Rsync檔案同步與inotify實作檔案同步功能
rsync + inotify實時監控腳本,建構伺服器檔案同步工具
- 通過rsync檔案同步工具和inotify檔案監控工具,可以建構出一個實時監控檔案改動的同步工具。
- 自動化腳本
#!/bin/sh FILE=/data IP=11.22.33.44 /usr/bin/inotifywait -mrq --format '%w%f' -e close_write,delete $ FILE \ | while read file do cd $FILE &&\ rsync -az “$file” --delete [email protected]$IP::nfsbackup \ --password-file=/etc/rsync.password & done
- docker運作腳本
#!/bin/bash if [ $# -eq 1 ] then # 第一個參數為本地同步路徑 LocalPath=${1} else echo "\033[5;34m Usage: \033[0m sh ${0} LocalPath" | grep "LocalPath" --color exit 0 fi # rsync密碼存放路徑 RsyncPass=/home/www/rsync (docker run -it --rm -v $LocalPath:/mnt decezz/inotify inotifywait -mrq --format '%w%f' -e create,modify,delete,attrib,move /mnt) | while read act_log do docker run -i --rm -v $RsyncPass:/tmp -v $LocalPath:/mnt decezz/app rsync -avz --progress --password-file=/tmp/rsyncd.secrets --delete /mnt/ [email protected]::common done