Linux rsync 同步實踐

    公司網站 有兩臺服務器 AB,作了動靜分離,A上爲靜態服務器安裝有nginxBTomcat容器。訪問時,經過Anginx 作反向代理,靜態文件http請求,目錄statics直接訪問A服務器上的靜態文件。 java

    但咱們因爲開發的時候 項目 java代碼和靜態文件都在一塊兒,只發布到 B上,而後將靜態文件目錄statics直接同步到 A上,這樣減小了發佈的複雜度,若是服務器多的話效果更佳。 linux

    其實最初作動靜分離,用的是nginx 的緩存功能,直接將靜態文件緩存到A服務器上,但這個時候對文件更新不友好。rsync能很好的解決這個問題。 nginx

1. rsync 同步的大體思路

服務器AB上都安裝rsync,其中B服務器上是以服務器模式運行rsync,而A上則以客戶端方式運行rsync。這樣在web服務器B上運行rsync守護進程,在A上定時運行客戶程序來同步web服務器B上須要同步的內容。 web

rsync 同步有下面幾個優勢: shell

    能夠鏡像 保存整個目錄樹和文件系統。 緩存

    能夠很容易作到保持原來文件的權限、時間、軟硬連接等等。 tomcat

    無須特殊權限便可安裝。 安全

    快速:第一次同步時 rsync 會複製所有內容,但在下一次只傳輸修改過的文件。rsync 在傳輸數據的過程當中能夠實行壓縮及解壓縮 操做,所以可使用更少的帶寬。 服務器

    安全:可使用scpssh等方式來傳輸文件,固然也能夠經過直接的socket鏈接。 app

    支持匿名傳輸,以方便進行網站鏡象。

2. rsync安裝

通常的linux系統上都默認安裝得了rsync 。也能夠手動安裝,這裏採用的是rsync原生的傳輸協議,若是採用 ssh傳輸協議的話,就須要安裝ssh。

下載:http://www.samba.org/rsync/

shell> tar zxvf rsync-x.x.x.tar.gz
shell> cd rsync-x.x.x
shell> ./configure && make && make install

或者: 

sudo apt-get install rsync
yum install rsync

3. rsync的配置

rsync的主要有如下三個配置文件rsyncd.conf(主配置文件)、rsyncd.secrets(密碼文件)、rsyncd.motd(rysnc服務器信息)
  服務器配置文件(/etc/rsyncd.conf),該文件默認不存在,請建立它。
  具體步驟以下:

#touch /etc/rsyncd.conf  #建立rsyncd.conf,這是rsync服務器的配置文件。
#touch /etc/rsyncd.secrets  #建立rsyncd.secrets ,這是用戶密碼文件。
#chmod 600 /etc/rsyncd/rsyncd.secrets  #將rsyncd.secrets這個密碼文件的文件屬性設爲root擁有, 且權限要設爲600, 不然沒法備份成功!
#touch /etc/rsyncd.motd

rsyncd.conf 服務器的主要配置文件,能夠參考以下:

# This line is required by the /etc/init.d/rsyncd script
  pid file = /var/run/rsyncd.pid  
  port = 873
  address = 192.168.1.171 
  #uid = nobody
  #gid = nobody   
  uid = root  
  gid = root 
  use chroot = yes 
  read only = yes

  #limit access to private LANs
  hosts allow=192.168.1.0/255.255.255.0 10.0.1.0/255.255.255.0 
  hosts deny=*
  max connections = 5
  motd file = /etc/rsyncd.motd

  #This will give you a separate log file
  #log file = /var/log/rsync.log

  #This will log every file transferred - up to 85,000+ per user, per sync
  #transfer logging = yes
  log format = %t %a %m %f %b
  syslog facility = local3
  timeout = 300

  [home]  
  path = /usr/local/tomcat/webapp/home/statitcs
  list=yes
  ignore errors
  auth users = root
  secrets file = /etc/rsyncd.secrets 
  comment = This is RHEL 4 data 
  exclude =  dir1/  dir2/

    auth users是必須在服務器上存在的真實的系統用戶,若是你想用多個用戶以,號隔開,好比auth users = nobody,root  
  rsyncd.secrets的內容格式爲: 用戶名:密碼

chown root.root rsyncd.secrets  #修改屬主
chmod 600 rsyncd.secrets     #修改權限

注:一、將rsyncd.secrets這個密碼文件的文件屬性設爲root擁有, 且權限要設爲600, 不然沒法備份成功!  出於安全目的,文件的屬性必需是隻有屬主可讀。 
  二、這裏的密碼值得注意,爲了安全你不能把系統用戶的密碼寫在這裏。

  設定rsyncd.motd 文件;
  它是定義rysnc服務器信息的,也就是用戶登陸信息。好比讓用戶知道這個服務器是誰提供的等;
相似ftp服務器登陸時,咱們所看到的 linuxsir.org ftp ……。 固然這在全局定義變量時,並非必須的,你能夠用#號注掉,或刪除;
    rsync.conf 的詳細說明:

#在rsync 服務器中,全局定義有幾個比較關健的,根據咱們前面所給的配置文件 rsyncd.conf 文件;
  pid file = /var/run/rsyncd.pid   注:告訴進程寫到 /var/run/rsyncd.pid 文件中;
  port = 873  注:指定運行端口,默認是873,您能夠本身指定;
  address = 192.168.1.171  注:指定服務器IP地址
  uid = nobody  
  gid = nobdoy 
  注:服務器端傳輸文件時,要發哪一個用戶和用戶組來執行,默認是nobody。 若是用nobody 用戶和用戶組,可能遇到權限問題,有些文件從服務器上拉不下來。因此我就偷懶,爲了方便,用了root 。不過您能夠在定義要同步的目錄時定義的模塊中指定用戶來解決權限的問題。
  
	use chroot = yes
  注:用chroot,在傳輸文件以前,服務器守護程序在將chroot 到文件系統中的目錄中,這樣作的好處是可能保護系統被安裝漏洞侵襲的可能。缺點是須要超級用戶權限。另外對符號連接文件,將會排除在外。也就是說,你在 rsync服務器上,若是有符號連接,你在備份服務器上運行客戶端的同步數據時,只會把符號連接名同步下來,並不會同步符號連接的內容;這個須要本身來嘗試

  read only = yes
  注:read only 是隻讀選擇,也就是說,不讓客戶端上傳文件到服務器上。還有一個 write only選項,本身嘗試是作什麼用的吧;

  #limit access to private LANs
  hosts allow=192.168.1.0/255.255.255.0 10.0.1.0/255.255.255.0
  注:在您能夠指定單個IP,也能夠指定整個網段,能提升安全性。格式是ip 與ip 之間、ip和網段之間、網段和網段之間要用空格隔開;

  max connections = 5  
  注:客戶端最多鏈接數

  motd file = /etc/rsyncd/rsyncd.motd
  注:motd file 是定義服務器信息的,要本身寫 rsyncd.motd 文件內容。當用戶登陸時會看到這個信息。

  log file = /var/log/rsync.log
  注:rsync 服務器的日誌; 

  transfer logging = yes
  注:這是傳輸文件的日誌

  log format = %t %a %m %f %b
  syslog facility = local3
  timeout = 300
 
模塊定義
  模塊定義什麼呢?主要是定義服務器哪一個目錄要被同步。每一個模塊都要以[name]形式。這個名字就是在rsync 客戶端看到的名字,其實有點象Samba服務器提供的共享名。而服務器真正同步的數據是經過path 指定的。咱們能夠根據本身的須要,來指定多個模塊。每一個模塊要指定認證用戶,密碼文件、但排除並非必須的 
  下面是前面配置文件模塊的例子:

  [home]  #模塊它爲咱們提供了一個連接的名字,在本模塊中連接到了/home目錄;要用[name] 形式
  path = /usr/local/tomcat/webapp/home/statics    #指定文件目錄所在位置,這是必須指定的
  auth users = root   #認證用戶是root  ,是必須在服務器上存在的用戶
  list=yes   #list 意思是把rsync 服務器上提供同步數據的目錄在服務器上模塊是否顯示列出來。默認是yes 。若是你不想列出來,就no ;若是是no是比較安全的,至少別人不知道你的服務器上提供了哪些目錄。你本身知道就好了;
  ignore errors  #忽略IO錯誤
  secrets file = /etc/rsyncd.secrets   #密碼存在哪一個文件
  comment = linuxsir home  data  #註釋能夠本身定義
  exclude = dir1/ dir2/     
  注:exclude是排除的意思,也就是說,要把/usr/local/tomcat/webapp/home/statics目錄下的easylife和samba排除在外; dir1/和dir2/目錄之間有空格分開

4. rsync的基本操做

服務器端啓動


usr/bin/rsync --daemon --config=/etc/rsyncd/rsyncd.conf


可能須要 root  運行. 也能夠在/etc/rc.d/rc.local里加入讓系統自動啓動等.

   查看rsync服務器上提供了哪些可用的數據源 

# rsync  --list-only  root@192.168.0.102::home


客戶端同步

#rsync -avzP root@192.168.0.100::home /var/www/statics 
Password: 這裏要輸入root的密碼,是服務器端rsyncd.secrets提供的。 
注:這個命令的意思就是說,用root用戶登陸到服務器上,把/var/www/statics數據,同步到本地當前目錄/var/www/statics上。固然本地的目錄是能夠你本身定義的。 若是當你在客戶端上當前操做的目錄下沒有/var/www/statics這個目錄時,系統會自動爲你建立一個;當存在/var/www/statics這個目錄中,你要注意它的寫權限。 

#rsync -avzP  --delete root@linuxsir.org::home   /var/www/statics 
引入一個--delete 選項,表示客戶端上的數據要與服務器端徹底一致,若是 linuxsirhome目錄中有服務器上不存在的文件,則刪除。 最終目的是讓linuxsirhome目錄上的數據徹底與服務器上保持一致;用的時候要當心點,最好不要把已經有重要數所據的目錄,當作本地更新目錄, 不然會把你的數據所有刪除; 

客戶端配置

  設定密碼文件 
  #rsync -avzP  --delete  --password-file=rsyncd.secrets   root@192.168.0.100::home /var/www/statics 
  加了一個選項 --password-file=rsyncd.secrets,這是當咱們以root用戶登陸rsync服務器同步數據時,密碼將讀取rsyncd.secrets這個文件。 
這個文件內容只是root用戶的密碼。咱們要以下作; 

# touch rsyncd.secrets 
  # chmod 600 rsyncd.secrets 
  # echo "123456"> rsyncd.secrets 

  # rsync -avzP  --delete  --password-file=rsyncd.secrets   root@192.168.0.100::home /var/www/statics
  注:這裏須要注意的是這份密碼文件權限屬性要設得只有屬主可讀。  這樣就不須要密碼了,客戶端經過 cron計劃來同步比較好。  
   rsync中的參數
   -r 是遞歸  
   -l 是連接文件,意思是拷貝連接文件; -p 表示保持文件原有權限; -t 保持文件原有時間; -g 保持文件原有用戶組; -o 保持文件原有屬主; -D 至關於塊設備文件;
   -z 傳輸時壓縮;
   -P 傳輸進度;
   -v 傳輸時的進度等信息,和 -P有點關係,本身試試。能夠看文檔;
   -e ssh的參數創建起加密的鏈接。
   -u只進行更新,防止本地新文件被重寫,注意二者機器的時鐘的同時
   --progress是指顯示出詳細的進度狀況
   --delete是指若是服務器端刪除了這一文件,那麼客戶端也相應把文件刪除,保持真正的一致
   --password-file=/password/path/file來指定密碼文件,這樣就能夠在腳本中使用而無需交互式地輸入驗證密碼了,這裏須要注意的是這份密碼文件權限屬性要設得只有屬主可讀。

rsync客戶端自動與服務器同步數據

  1.建立同步腳本和密碼文件   

#mkdir   /etc/cron.daily.rsync
  #cd  /etc/cron.daily.rsync 
  #touch /var/www/statics.sh  
  #chmod 755 /etc/cron.daily.rsync/*.sh  
  #mkdir /etc/rsyncd/
  #touch /etc/rsyncd/homeroot.secrets
   # echo "123456"> /etc/rsyncd/homeroot.secrets
  #chmod 600  /etc/rsyncd/rsync.*

  注: 咱們在 /etc/cron.daily/中建立了文件 /var/www/statics.sh,而且是權限是 755的。建立了密碼文件 root用戶用的是 homeroot.secrets,權限是 600

  咱們編輯 /var/www/statics.sh,內容是以下的:
 
#!/bin/sh
 /usr/bin/rsync -avzP --password-file=/etc/rsyncd/homeroot.secrets root@192.168.0.100::home /var/www/statics/  


2.修改crond服務器的配置文件 加入到計劃任務
  #crontab  -e
  加入下面的內容: 
  */10 * * * * /etc/cron.daily.rsync/statics.sh   1> /dev/null

配置好後,要重啓crond 服務器;
  # killall crond    注:殺死crond 服務器的進程;
  # ps aux |grep crond  注:查看一下是否被殺死;
  # /usr/sbin/crond    注:啓動 crond 服務器;
  # ps aux  |grep crond  注:查看一下是否啓動了

注1.   若是 rsync ssh協議上傳輸,能夠不輸入密碼登陸。

1. 經過ssh-keygenserver A上創建SSH keys,不要指定密碼,你會在~/.ssh下看到identityidentity.pub文件 
  2. server B上的home目錄創建子目錄.ssh
  3. Aidentity.pub拷貝到server B
  4. identity.pub加到~[user b]/.ssh/authorized_keys
  5. 因而server A上的A用戶,可經過下面命令以用戶B sshserver B上了。e.g. ssh -l userB serverB
這樣就使server A上的用戶A就能夠ssh以用戶B的身份無需密碼登錄到server B上了。

Rsync + ssh 的命令格式爲:

#rsync -avz --delete root@192.168.0.100:/usr/local/tomcat/webapp/home/statics /var/home/statics

2. 實時同步

這裏同步的思路是服務器A 主動的同步BB做爲rsync服務端,A做爲客戶端定時去同步B,拉取同步數據。

若是要作到實時同步就能夠採用sersync工具或者rsync+inotify組合,這裏就須要反過來,將B做爲rsync客戶端,A做爲服務器。B主動推送同步文件,這裏就要作到實時監控文件系統,當B上指定目錄有更新時,主動同步到A。就須要inotify 監控 B上的文件系統。

注3. rsync經過linux防火牆

在服務器端要讓你所定義的rsync 服務器端口經過,客戶端上也應該讓經過。

iptables -A INPUT -p tcp -m state --state NEW  -m tcp --dport 873 -j ACCEPT

查看一下防火牆是否是打開了 873端口;

iptables -L
相關文章
相關標籤/搜索