rsync
remote sync 遠程同步,同步是把數據從緩衝區同步到磁盤上去的、數據在內存緩存區完成之後還沒有寫入到磁盤中去、所以有時候要同步到磁盤中去的,而rsync說白了跟複製差不多、能將一個文件從一個地方複製到另外一個地方的、但是他也可以實現跨主機複製,兼具了cp和scp的功能,但是在跨主機時不具備scp的加密功能。
rsync有個特點,就是當你用rsync複製或跨主機複製時如果另一端也有一個同名的文件,他會先比較這兩個文件的特徵碼是不是一致,如果不一致就會複製,並覆蓋,如果一致他將不會複製,所以說這是一個快速複製工具,尤其是同步目錄時,特別好用。
rsync命令的工作模式有四種:
1、shell模式,也稱爲本地模式,速度要比cp快
2、遠程shell模式,其可以藉助於ssh協議承載其數據傳輸過程
3、列表模式,其工作方式與ls相似,僅列出源的內容:-nv
4、服務器模式,此時,rsync可以工作爲守護進程,能夠接收客戶端的數據傳輸請求,在使用時可以在客戶端使用rsync命令發送給守護進程,也可以向服務器主獲取文件。
rsync命令的選項:
-n:如果擔心命令執行不正確,一同步複製,可能這個複製的後果是致命的,那後果可就嚴重了,這裏我們可以加-n先測試一下
-v: --verbose,詳細輸出模式、顯示詳細過程的
-q: --quiet,靜默模式,儘可能輸出少的信息
-c: --checksum,可以對傳輸的文件進行較驗的,強制對文件傳輸進行校驗
-r: --recursive,遞歸複製
-a: --archives,歸檔,複製時可以保存原有的屬主屬主等屬性信息,甚至包括一點額外的屬性、如訪問控制列表
-p: --perms,保存文件的權限
-t: --times,保留文件的時間戳
-l: --links,保留文件的符號鏈接
-g: --group,保留文件的屬組
-o: --owner,保留文件的屬主
-D: --devices,保留設備文件
-e SSH:遠程複製時,表示使用ssh協議作承載
-z:基於網絡時使用,對文件壓縮後傳輸
--progress:顯示壓縮進度條的
--stats:顯示如何執行壓縮和傳輸的,也就是顯示傳輸狀態的
注意:rsync命令使用中,如果源參數的末尾有斜線,就會複製指定目錄內容,而不復制目錄本身;沒有斜線,則會複製目錄本身,因此有如下命令:
# rsync -r /mydata/data /backups/:會把目錄data直接同步至/backups目錄中去
# rsync -r /mydata/data/ /backups/:會把目錄中的data/中的內容同步至/backups目錄中
rsync本地用法:
# cd /etc /tmp/
# rsync /tmp/etc/passwd /tmp/test/passwd -nv
推送到遠程主機上去,把本地的etc文件推送到172.16.251.244主機上去:
# rsync -r -e ssh /tmp/etc [email protected]:/tmp/
拉取遠程服務器上的文件:
# rsync -e ssh -r -a [email protected]:/etc/pam.d ./ --stats
把文件推送到服務器端上去:
# rsync -auzv messages [email protected]::my_data_rsync
如果我們從服務器上拉取文件時必須要指定文件路徑
# rsync [email protected]::my_data_rsync/messages /tmp/
Inotify
Inotify 是一個 Linux特性,是一種強大的、細粒度的、異步的文件系統事件監控機制,linux內核從2.6.13起,加入了Inotify支持,通過Inotify可以監控文件系統中添加、刪除,修改、移動等各種細微事件,利用這個內核接口,第三方軟件就可以監控文件系統下文件的各種變化情況,而inotify-tools就是這樣的一個第三方軟件。Inotify 反應靈敏,用法非常簡單,並且比 cron 任務的繁忙輪詢高效得多。
=====================rsync+inotify實現實時同步過程============================================
這裏我們以兩臺服務器來做這個實驗:
以下步驟在從服務上操作:
配置rsync以daemon的方式運行:也就是在服務器端以守護進程的方式運行
1、設定rsync服務器端
1)安裝相關的程序包,他是基於xinetd工作的,超級守護進程
# yum -y install xinetd
安裝好之後在/etc/xinetd.d/這個目錄下有一個rsync的文件
2)爲rsync服務提供配置文件,而他的配置文件在/etc/rsyncd.conf,這個配置文件大概由兩部分組成,一部分定義全局的,另一部分可以定義多個rsync共享目錄:
# Global Settings 全局設定 uid = nobody :以哪個用戶的身份運行或獲取數據的 gid = nobody :用戶都以來賓帳號的方式運行 use chroot = no :在服務運行時要不要把他鎖定在家目錄 max connections = 10 :做爲服務器端最大併發連接數 strict modes = yes :表示是否工作在嚴格模式下,嚴格檢查文件權限等相關信息 pid file = /var/run/rsyncd.pid : 定義pid文件路徑 log file = /var/log/rsyncd.log : 定義日誌文件存放路徑的 # Directory to be synced 定義共享目錄的模塊 [my_data_rsync] 要同步的目錄名稱,多個目錄名稱是不能重名的 path = /myrsync/data : 定義目錄的路徑 ignore errors = yes : 表示如果中間複製過程有一個文件出錯了是要繼續複製還是中止複製,yes表示繼續複製,no表示中止複製 read only = no :如果打算讓別人僅僅是來拉取數據的,yes就可以了,如果打算讓別人推送過來做備份的那就爲no,表示客戶端是否可以推送的 write noly = no :只允別人在裏面寫數據,但不可以拉取數據 hosts allow = 172.16.251.244:做白名單的,是否允許哪些主機可以訪問的 hosts deny = * :黑名單的 說明: 1、二者都不出現時,默認爲允許訪問 2、只出現hosts allow,定義白名單,但沒有被匹配到的主機由默認規則處理,即爲允許 3、只出現hosts deny,定義黑名單,出現在名單中的都被拒絕 4、二者同時出現,先檢查hosts allow,如果匹配就allow,否則檢查hosts deny,如果匹配則拒絕,如是二者都不匹配,則由默認規則處理,即爲允許 list = false :是否允許用戶列出文件列表的 uid = root :以哪個用戶身份去獲取文件的 gid = root auth users = myuser:做用戶驗證的,只允許哪個用戶來複制 secrets file = /etc/.rsync.passwd :存放驗證用戶的密碼的 #配置密碼文件/etc/rsyncd.passwd,文件格式是明文的,所以文件權限設爲600: # vim /etc/rsyncd.passwd myuser:mypasswd # chmod 600 /etc/rsyncd.passwd #配置服務能夠啓動,監聽在873/tcp端口上 # chkconfig rsync on # service xinetd start # ss -tnl
接下來在內容發佈的服務器上操作:
由於inotify特性需要Linux內核的支持,在安裝inotify-tools前要先確認Linux系統內核是否達到了2.6.13以上,如果Linux內核低於2.6.13版本,就需要重新編譯內核加入inotify的支持,也可以用如下方法判斷,內核是否支持inotify:
# uname -r
2.6.32-431.el6.x86_64
查看內核是否支持inotify API,如果有以下三項,表示系統已經默認支持inotify,接着就可以開始安裝inotify-tools了,我這裏使用的是inotify-tools-3.14.tar.gz。
# ll /proc/sys/fs/inotify
-rw-r--r-- 1 root root 0 04-13 19:56 max_queued_events
-rw-r--r-- 1 root root 0 04-13 19:56 max_user_instances
-rw-r--r-- 1 root root 0 04-13 19:56 max_user_watches
簡單介紹一下這三個文件是做什麼用的:
max_queued_evnets:表示調用inotify_init時分配給inotify instance中可排隊的event的數目的最大值,超出這個值的事件被丟棄,但會觸發IN_Q_OVERFLOW事件。
max_user_instances:表示每一個real user ID可創建的inotify instatnces的數量上限。
max_user_watches:表示每個inotify instatnces可監控的最大目錄數量。如果監控的文件數目巨大,需要根據情況,適當增加此值的大小,例如:echo "9000000" > /proc/sys/fs/inotify/max_user_watches
查看完相關的安裝環境後那接下來我們就可以安裝inotify-tools這個程序包了,安裝步驟很簡單,程序包獲取方法這裏不再提供:
# tar xf inotify-tools-3.14.tar.gz # cd inotify-tools-3.14 # ./configure # make && make install 安裝好之後可以查看/usr/local/bin下生成兩個二進制文件: # ll /usr/local/bin 創建一個目錄存放要同步的數據: # mkdir /myrsync_data/mydata # cd /myrsync_data/mydata # vim inotifyrsync.sh #!/bin/bash host=172.16.27.1 #從服務器的主機地址 data_dir=/myrsync_data/data #內容發佈服務器上創建的同步數的路徑 dst=my_data_rsync #從服務器上導出的共享目錄 username=myuser #從服務器上/etc/rsyncd.passwd這個文件中定義的用戶名 #決對路徑執行inotifywait這個程序, #-m, 即--monitor,表示始終保持事件監聽狀態。 #-r, 即--recursive,表示遞歸查詢目錄。 #-q, 即--quiet,表示打印出監控事件。 #-e, 即--event,通過此參數可以指定要監控的事件,常見的事件有modify、delete、create、attrib等。 #--timefmt:指定時間的輸出格式。 #--format:指定變化文件的詳細信息。 /usr/local/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $data_dir | while read files do /usr/bin/rsync -vzrtopg --delete --progress --password-file=/etc/rsyncd.passwd $data_dir $username@$host::$dst echo "${files} was rsynced" >> /tmp/rsync.log 2>&1 #寫入日誌 done #保存退出 # chmod 755 /web/wwwroot/inotifyrsync.sh # bash /myrsync_data/mydata/inotifyrsync.sh &
測試一下同步的效果:
結束:
rsync+inotify實驗完成,測試完全沒問題,成功完成了數據實時同步功能,這裏要說的是如果多臺從服務器的話重複從服務器的配置步驟即可,再配置內容發佈服務上的多個從服務器的相關聯的信息即可以完成一主多從數據實時同步的功能,相信這個也不是什麼難事,對吧,好了,就說到這裏吧,有什麼做得不到位的歡迎大神留言交流。