配置rsync遠程數據同步服務詳解

rsync是一個開源的快速備份工具,可以在不同主機之間鏡像同步整個目錄樹,支持增量備份,保持鏈接和權限,且採用優化的同步算法,傳輸前執行壓縮,因此非常適合於異地備份,鏡像服務器等應用。

rsync的官方爲http://rsync.samba.org,可以去官網下載最新版本的rsync。系統默認就已經安裝好了rsync軟件了,如果沒裝的可以使用yum或rpm安裝即可。

[root@localhost /]#rpm -q rsync
rsync-3.0.6-5e16_0.i686

在遠程同步任務中,負責發起rsync同步操作的客戶機稱爲客戶端,而負責響應來自客戶端的rsync同步操作的服務器稱爲備份源。在下行同步(下載)中,備份源負責提供文檔的原始位置,發起端應對該位置有讀取權限;在上行同步中(上傳)中,備份源負責提供文檔的目標位置,發起端應對該位置具有寫入權限。如下圖所示:

084608455.jpg

使用rsync同步工具時,備份源既可以是SSH服務器,也可以是以服務模式運行的rsync程序。下面分別講解配置SSH備份源和rsync備份源的方法。


一、配置SSH備份源

1、創建備份用戶rget,rput分別用來下載,上傳。

[root@localhost /]#useradd rget
[root@localhost /]#passwd rget
[root@localhost /]#useradd rput
[root@localhost /]#passwd rput

2、確認sshd服務正常運行,允許用戶rget,rput訪問。

[root@localhost /]#vim /etc/ssh/sshd_config
...//省略部分內容
UseDNS no
AllowUsers rget rput   //啓用此行,值允許用戶rget和rput使用sshd服務。
[root@localhost /]#service sshd start

3、調整同步目錄的權限,使rget有讀取權限、rput有寫入權限。

這裏作者以網站根目錄爲例,講解如何設置rsync備份源的權限設置。

在linux文件系統中,正常創建的目錄權限爲755,文件權限爲644,因此對於rget用戶來說,默認權限已經滿足下行備份的要求了。但是對於rput用戶來說,要能夠寫入纔有權限做上行備份。建議將目錄的屬主修改爲備份用戶;另外,爲了不影響網站服務器對相關目錄的訪問,需要爲WEB服務的運行用戶指定額外的權限。這時就需要使用“setfacl”了,有關於“setfacl”的詳細文檔請自行查閱相關文檔,作者這裏只做簡單的介紹。

[root@localhost /]#chown -R rput:rput /var/www/html
[root@localhost /]#setfacl -R -m user:daemon:rwx /var/www/html //設置ACL

“setfacl”命令常用的參數解釋如下:

-R:表示遞歸操作

-m:指定用戶以及設置的權限

-x:刪除某一項ACL屬性

-b:刪除所有的ACL屬性

如果希望建立的文件,子目錄也具有相同的ACL屬性,則應爲指定目錄設置默認ACL屬性,即在“setfacl”權限模式中添加“default”參數。查看已設置好的ACL可以使用“getfacl”命令。

[root@localhost /]#setfacl -m default:user:daemon:rwx /var/www/html //設置默認ACl
[root@localhost /]#getfacl /var/www/html //查看設置好的ACL


二、配置rsync備份源

rsync不僅僅用作遠程同步發起端(客戶端),也可以作爲守護進程運行,爲其他客戶機提供備份源。配置rsync備份源需要建立配置文件rsync.conf,創建備份賬號。然後將rsync程序以“--daemon”選項運行。

1、創建rsync.conf配置文件

[root@localhost /]#vim /etc/rsyncd.conf
uid = nobody
gid = nobody
use chroot = yes                                   //禁錮在源目錄
address = 192.168.1.10                             //指定監聽地址
port = 873                                         //指定監聽的端口
log file = /var/log/rsyncd.kog                     //存放日誌的位置
pid file = /var/run/rsyncd.pid                     //存放PID文件的位置
host allow = 192.168.1.0                           //允許訪問的客戶機地址
[wwwroot]                                          //共享模塊名稱
path = /var/www/html                               //源目錄的實際路徑
comment = Document Root of file.benet.com
read only = yes                                    //是否爲只讀
dont compress = *.gz *.bz2 *.tgz *.zip *.rar *.z   //同步不壓縮的類型
auth users = backup                                //授權用戶
secrets file = /etc/rsyncd_users.db                //存放用戶的數據文件

基於安全性考慮,對於rsync的備份源最好僅允許只讀方式做下行同步,若確實需要做上行同步時,建議改用SSH備份源。另外,下行備份可以採用匿名的方式,只要將其中的“autusers”和“secretsfile”配置記錄去掉就可以了。

2、創建備份用戶的數據文件

根據上一步的設置,創建賬號的數據文件,添加一行用戶記錄,以冒號分。列如:用戶名爲“backup”,密碼爲“pwd@back”。由於賬號信息採用明文存放,因此應調整文件權限,避免賬號信息泄露。

[root@localhost /]#vim /etc/rsync_users.db
backup:pwd@back
[root@localhost /]#chmod 600 /etc/rsync_users.db

與配置SSH備份源類似,備份用戶backup也需要對源目錄/var/www/html/有相應的讀取權限。實際上只要other組有讀取權限就可以了。

3、啓動rsync服務程序

執行“rsync--daemon”命令就可以啓動rsync服務,以獨立監聽服務的方式運行。若要關閉rsync服務,可以採取kill進程的方式。

[root@localhost /]#rsync --daemon
[root@localhost /]#netstat -anpt | grep rsync
tcp    0    0 192.168.1.10:873    0.0.0.0:*    LISTEN    21182/rsync
[root@localhost /]#kill $(cat /var/run/rsync.pid)

4、將rsync進程交給超級服務xinetd管理

考慮到異地備份的特殊性,通常並不需要全天不間斷運行,最好是在有客戶練接的時候才啓用。因此可將rsync交給超級服務xinetd管理,只要修改相應配置並啓動xinetd服務,就可以提供rsync服務了。

[root@localhost /]#yum -y install xinetd     //安裝xinetd軟件包
[root@localhost /]#service xinetd start      //啓動xinetd服務
[root@localhost /]#vim /etc/xinetd.d/rsync
service rsync
{
disable = no                            //將原有的yes改爲no
...//省略部分內容
server            = /usr/bin/rsync
server_args       = --daemon            //確認有--daemon服務選項
log_no_failure    += USERID
}


三、客戶端使用rsync備份工具

有了備份源服務器以後,就可以使用rsync工具來執行遠程同步了。現在我們就在客戶端執行備份命令。

1、rsync命令的基本用法

[root@localhost/]#rsync[選項][備份源地址][目標地址]

命令格式及備份選項解釋如下:

-r:遞歸模式,包含目錄及子目錄中的所有文件。

-l:對於符號鏈接文件仍然複製爲符號鏈接文件。

-v:顯示同步過程的詳細信息。

-a:歸檔模式,保留文件的權限,屬性等信息,等同於組合選項“-rlptgoD”

-z:在傳文件時進行壓縮。

-p:保留文件的權限標記。

-t:保留文件的時間標記。

-g:保留文件的屬組標記(僅root使用)。

-o:保留文件的屬主標記(僅root使用)。

-H:保留硬鏈接文件。

-A:保留ACL屬性信息。

-D:保留設備文件及其它特殊文件。

--delete:刪除目標位置有而原始位置沒有的文件。

--checksum:根據校驗和(而不是文件大小,修改時間)來決定是否跳過文件。

2、配置源的表示方法

在執行遠程同步任務時,rsync命令需指定源服務器中的資源位置,對於下行備份操作,備份源對應“原始位置”,對於上行備份操作,備份源對應“目標位置”,根據備份源的類型不同,其資源表示方法也不同。

SSH備份源:表示爲“用戶名@主機地址:目錄路徑”的形式,用一個冒號分隔,驗證字串與SSH登錄類似。

例如:ssh的下行備份語法如下:

[root@localhost /]#rsync -avz [email protected]:/var/www/html /opt

例如:ssh的上行備份語法如下:

[root@localhost /]#rsync -avz /var/www/html [email protected]:/var/www/html

rsyn備份源:表示爲“用戶名@主機地址::共享模塊名”或者“rsync://用戶名@主機地址/共享模塊名的形式,前者爲兩個冒號分隔,後者爲URL路徑。

例如:rsync的下行備份語法如下:

[root@localhost /]#rsync -avz [email protected]::wwwroot /opt

或者

[root@localhost /]#rsync -avz rsync://[email protected]/wwwroot /opt


四:配置rsync+inotify實時同步

 Linux內核從2.6.13版本開始提供了inotify通知接口,用來監控文件系統的各種變化情況,如文件存取,刪除,移動,修改等。利用這一機制,可以非常方便的實現文件異動告警,增量備份,並針對目錄或文件的變化及時作出響應。

 使用rsync工具與inotify機制想結合,可以實現觸發式備份及實時同步,只要原始位置的文檔發生變化,則立即啓動增量備份操作,否則處於靜態等待狀態。這樣一來,就避免了按固定週期備份時存在延遲性,週期過密等問題。

1、配置無密碼自動登陸的SSH備份用戶

真因爲inotify通知機制有Linux內核提供,因此主要做本機監控,在觸發式備份中應用時更適合上行同步。因此使用SSH備份源比較合適,由於編寫觸發式腳本在後臺運行,無法根據提示來輸入密碼。因此需要做無密碼自動登錄的SSH用戶。對於SSH服務器來說,採用祕鑰驗證是避免交互式登錄的最佳方法。例如:只要在客戶機中創建無私鑰短語的祕鑰對,然後將公鑰文件發送給服務器中的備份用戶,就可以實現無密碼自動登錄了。

[root@localhost /]#ssh-keygen -t rsa            //創建祕鑰對
[root@localhost /]#ssh-copy-id [email protected] //將公鑰發送給服務器
[root@localhost /]#ssh [email protected]         //無密碼自動登錄
[rput@localhost /]#

2、調整inotify內核參數

[root@localhost /]#vim /etc/sysctl.conf
......//省略部分內容
fs.inotify.max_queued_events = 16384       //監控事件隊列
fs.inotify.max_user_instances = 1024       //最多監控實例數
fs.inotify.max_user_watches = 1048576      //每個實例最多監控文件數
[root@localhost /]#sysctl -p

3、安裝inotify-tools工具

使用inotify機制還需要安裝inotify-tools,以便提供inotifywait,inotifywatch輔助工具程序,用來監控,彙總改動情況。inotify-tools可從http://inotify-tools.sourceforge.net下載。

[root@localhost media]#tar zxf inotify-tools-3.14.tar.gz -C /usr/src/
[root@localhost media]#cd /usr/src/inotify-tools-3.14
[root@localhost inotify-tools-3.14]#./configure
[root@localhost inotify-tools-3.14]#make && make install

下面以監控網站目錄“/var/www/html”目錄爲例,執行inotify命令,然後再另一個終端向“/var/www/html”目錄下添加文件,移動文件,跟蹤屏幕輸出結果。

[root@localhost /]#inotify -mrq -e modify,create,move,delete /var/www/html
Setting up watches.Beware:since -r was given,this may take a while!
Watches established.
/var/www/html/ CREATE index.php           //創建index.php文件
/var/www/html/ MODIFY index.php           //修改index.php文件
/var/www/html/ MOVED_FROM index.php       //重命名index.php文件
/var/www/html/ MOVED_TO test.php          //改名爲test.php文件
......//省略部分內容

上述命令中“-m”表示持續監控,“-r”表示遞歸整個目錄,“-q”表示簡化輸出信息,“-e”表示指定監控事件(如:“modify”修改,“create”創建,“move”移動,“delete”刪除,“attrib”屬性更改)等各種事件,一有變動立即輸出結果。

4、編寫觸發式同步腳本

使用inotifywait輸出的監控結果中,每行記錄中依次包括目錄,事件,文件,據此可以識別變動情況。爲了簡單起見,只要檢測到變動時執行rsync上行同步操作即可。需要注意的是,當更新較頻繁時,應避免併發執行rsync備份——若rsync進程已經存在則忽略本次同步,或者根據rsync進程數量(取決於實際任務)來決定是否同步。

[root@localhost /]#vim rsync.sh
#!/bin/bash
INOTIFT_CMD="inotifywait -mrq -e modify,create,attrib,move,delete /var/www/html/"
RSYNC_CMD="rsync -azH --delete /var/www/html [email protected]:/var/www/html"
$INOTIFY_CMD | while read DIRECTORY EVENT FILE
do
    if [ $(pgrep rsync | wc -l) -le 0 ];then
        $RSYNC_CMD
    if
done
[root@localhost /]#chmod +x rsync.sh






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章