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 -e "ssh -p22" -avz --delete ./ [email protected]:/tmp
使用rsync將當前目錄下的內容同步到遠程服務器11.22.33.44的tmp目錄下,並且刪除遠程服務器上在本地沒有的文件,-a 歸檔模式,主要保留文件屬性,等同於-rlptgoD;-v 能顯示詳細步驟;-z 表示在傳輸過程中壓縮;-e 表示指定要使用的遠程shell。rsync -avz --delete ./ [email protected]:/tmp
上面命令的精簡
Rsync 虛擬賬戶登錄同步文件
該模式需要在服務端安裝rsync
1. 服務端Rsync
yum -y install rsync
在服務端安裝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
yum -y install rsync
安裝rsync- 命令行執行
echo "123456789" > /etc/rsyncd.secrets #客戶端只需要把密碼寫入文件 chmod 600 /etc/rsyncd.secrets
3. 執行同步操作
rsync -avz --progress --password-file=/etc/rsyncd.secrets [email protected]::common /tmp
上面命令的含義爲使用 /etc/rsyncd.secrets 裏面設定的密碼配置,使用tom虛擬賬號(tom賬號可以爲linux系統中沒有到賬戶),使用公共模塊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 文件系統被卸載 inotifywait -mrq --timefmt '%d%m%y %H:%M' --format '%T %w%f' -e create /backup
監控/backup目錄下文件的創建,新開一個窗口創建一個文件,返回原來窗口,查看反饋,如下
inotifywait -mrq --timefmt '%d%m%y %H:%M' --format '%T %w%f' -e delete,close_write,modify /backup/
同時測試create、modify、delete,效果如下
inotifywait -mrq --format '%w%f' -e create /backup
簡化事件輸出
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 rsync_backup@$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