標籤:rsync+inotify 資料即時同步
1、rsync
man一下sync,就會發現:sync-flush file system buffers,它是一個把緩衝區中的資料同步到檔案系統中的一個命令;而rsync其實就是remote rsync,它是一個遠程同步工具,兼具cp和scp的功能,rsync命令的使用幾乎和scp是一樣一樣的。rsync是通過超級守護進程xinetd進行觸發同步的。
1)優點:與cp和scp相比來說,rsync更快,更安全,支援增量備份。rsync在資料同步的過程中,不像cp一樣全部都拷貝,而是先去比對特徵碼,只有不一樣的才會去拷貝,如果一樣了,就不需再做多餘操作。通過使用rsync+crontab可以解決對即時性要求不是太高的情境。
2)缺點:在這個大資料年代,如果資料量非常大,你每做一次任務計劃,rsync都會先去遍曆目標目錄,把所有資料做一次特徵碼比對,然後進行差量傳輸,這個過程會是很漫長的,對於那些要求即時性更新比較高的企業來說,無疑是一場噩夢。rsync+inotify組合能夠即時的去監控我們的檔案系統,只有在資料改變時才會觸發它去同步!
rsync有4種模式
1.本地模式。
2.遠程shell模式
3.查詢模式
4.C/S模式
2、inotify
Inotify 是一種強大的、細粒度的、非同步檔案系統事件監控機制,linux核心從2.6.13起,加入了Inotify支援,通過Inotify可以監控檔案系統中添加、刪除,修改、移動等各種細微事件,利用這個核心介面,第三方軟體就可以監控檔案系統下檔案的各種變化情況,而inotify-tools就是這樣的一個第三方軟體。
3、rsync+inotify 好處
1)伺服器效能:rsync+crontab會定時去檢查是否有檔案更新,這勢必會造成伺服器效能下降;而rsync+inotify組合是觸發式更新,只有在資料檔案有變化時,才會去更新,因此相對前者而言,是提高了伺服器效能。
2)資料即時性:rsync+crontab是週期性任務計劃,不能保證資料的即時性;rsync+inotify組合是觸發式更新,只要有資料變化,就立刻同步更新。
rsync命令是快速、多用、遠程和本地檔案複製工具;
命令文法格式:
Local: rsync [OPTION...] SRC... [DEST]
Access via remote shell:
Pull: rsync [OPTION...] [[email protected]]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [[email protected]]HOST:DEST
Access via rsync daemon:
Pull: rsync [OPTION...] [[email protected]]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[[email protected]]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [[email protected]]HOST::DEST
rsync [OPTION...] SRC... rsync://[[email protected]]HOST[:PORT]/DEST
選項:
-v, --verbose:冗長資訊;
-r, --recursive:對目錄遞迴;
1.本地模式
rsync -rv /etc/passwd ./
拷貝passwd 到目前的目錄
2.遠程shell模式
rsync -rv /etc/passwd 172.18.11.12:/tmp
把passwd拷貝到遠程主機上,類似於scp命令需要使用者密碼;
3.列表模式
rsync -r 172.18.11.12:/tmp
查看遠程目錄下的檔案
重點是第四種模式,實現資料同步:
4.C/S模式,資料同步:
實驗環境:
master:172.18.11.11
slave:172.18.11.113
實驗目標:
實現master主機的/var/ftp/目錄下只要有檔案變化(可定義),會即時同步到slave主機上的/home/ftp目錄下。
在slave端:
]# vim /etc/rsyncd.conf
650) this.width=650;" src="http://s5.51cto.com/wyfs02/M00/80/51/wKiom1c9qEzByHpkAABcd49QHok057.png" title="映像 2.png" alt="wKiom1c9qEzByHpkAABcd49QHok057.png" />
建立密碼檔案 /etc/rsyncd.pass 如下格式,並確保許可權為600或400
]# vim /etc/rsyncd.pass
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/80/4E/wKioL1c9qZyg9OZjAAAMZbeM8co553.png" title="映像 3.png" alt="wKioL1c9qZyg9OZjAAAMZbeM8co553.png" />
]# chmod 600 /etc/rsyncd.pass
啟動守護進程
]# rsync --daemon
]# netstat -tnlp|grep rsync
查看873連接埠監聽;
在master端:
]# vim /etc/rsyncd.pass
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/80/51/wKiom1c9qSrxOfJ5AAAKn5vwmq8889.png" title="映像 4.png" alt="wKiom1c9qSrxOfJ5AAAKn5vwmq8889.png" />
注意:此密碼檔案只輸入在slave端設定的密碼即可;
手動測試,master端passwd檔案是否能同步到slave端設定的目錄中;
]# rsync -avz /var/ftp/pub/passwd [email protected]::ftp --password-file=/etc/rsyncd.pass
解釋:
root為slave端指定的使用者;
172.18.11.113為slave端地址;
/etc/rsyncd.pass為存放slave端設定的指定使用者的密碼;
可在slave端的同步目錄查看是否收到passwd檔案;
安裝inotify-tools
]# yum -y install inotify-tools
編寫監控指令碼並載入到後台執行:
]# vim /root/rsync.sh
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/80/51/wKiom1c9rBHCR25JAABuhoilF7o364.png" title="映像 5.png" alt="wKiom1c9rBHCR25JAABuhoilF7o364.png" />
將指令碼加入後台執行
]# sh inotify.sh &
即時同步測試:
在master端:
]# for a in `seq 200`;do touch $a;done
建立200個檔案;
]# ll --time-style=full-iso
650) this.width=650;" src="http://s1.51cto.com/wyfs02/M01/80/51/wKiom1c9rzzg3yuJAACvkozzoYE307.png" title="映像 6.png" alt="wKiom1c9rzzg3yuJAACvkozzoYE307.png" />
再到slave端查看:
]# ll --time-style=full-iso /home/ftp
650) this.width=650;" src="http://s2.51cto.com/wyfs02/M01/80/4F/wKioL1c9sKCDKy63AADiw2jNsIM594.png" title="映像 8.png" alt="wKioL1c9sKCDKy63AADiw2jNsIM594.png" />
實現了資料即時同步。
rsync+inotify實現同步資料