天天看點

實作web資料同步的四種方式

實作web資料同步的四種方式

=======================================

nfs實作web資料共享

rsync +inotify實作web資料同步

rsync+sersync更快更節約資源實作web資料同步

unison+inotify實作web資料雙向同步

一、nfs實作web資料共享

<a target="_blank" href="http://blog.51cto.com/attachment/201309/100546182.png"></a>

    nfs能實作資料同步是通過NAS(網絡附加存儲),在伺服器上共享一個檔案,且伺服器需要設定檔案系統的權限和配置檔案設定的權限,權限兩者之間取交集,然後用戶端把共享的檔案挂載到本地,用戶端對檔案有讀寫權限,則實作資料的同步。

nfs+web:伺服器端的配置:

1)、安裝相關軟體,httpd提供web服務,nfs-utils提供nfs服務

1

<code>[root@jie1 ~]</code><code># yum -y install httpd nfs-utils</code>

2)、設定web的相關配置,使得web能夠提供web服務

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<code>[root@jie1 ~]</code><code># vim /etc/httpd/conf/httpd.conf</code>

<code>########################################</code>

<code>ServerName 172.16.22.1:80</code>

<code>#DocumentRoot "/var/www/html"   #提供虛拟主機,注釋預設存放網頁檔案的路徑</code>

<code>&lt;VirtualHost *:80&gt;</code>

<code>   </code><code>ServerName www.jie.com</code>

<code>   </code><code>DocumentRoot  </code><code>/web/htdocs</code>

<code>&lt;</code><code>/VirtualHost</code><code>&gt;</code>

<code>#######################################</code>

<code>[root@jie1 ~]</code><code># mkdir -pv /web/htdocs   #建立存放網頁的目錄</code>

<code>[root@jie1 ~]</code><code># cd /web/htdocs/</code>

<code>[root@jie1 htdocs]</code><code># touch index.html test.html test.php</code>

<code>[root@jie1 htdocs]</code><code># ls</code>

<code>index.html  </code><code>test</code><code>.html  </code><code>test</code><code>.php</code>

<code>[root@jie1 htdocs]</code><code># echo "This is Jie1 Web+nfs Server" &gt;index.html</code>

<code>[root@jie1 htdocs]</code><code># httpd -t         #檢查web的配置檔案是否有文法錯誤</code>

<code>Syntax OK</code>

<code>[root@jie1 htdocs]</code><code># service httpd start  #開啟web服務</code>

<code>Starting httpd:                                            [  OK  ]</code>

3)、設定nfs的相關配置,共享網頁檔案

20

21

22

<code>[root@jie1 htdocs]</code><code># id apache #安裝httpd軟體後,系統會建立apache使用者,檢視apache的id号</code>

<code>uid=48(apache) gid=48(apache) </code><code>groups</code><code>=48(apache)</code>

<code>[root@jie1 htdocs]</code><code># vim /etc/exports</code>

<code>######################################</code>

<code>/web/htdocs</code>  <code>172.16.22.3(rw,</code><code>sync</code><code>,root_squash,anonuid=48,anongid=48)</code>

<code>#nfs是以id号來确定是否能通路共享的檔案的,因為兩個伺服器都安裝了httpd軟體,都會有apache使用者,是以apache使用者的id号能通路共享的檔案</code>

<code>#/web/htdocs 共享的目錄</code>

<code>#172.16.22.3 指定用戶端能共享此檔案,多個用戶端用逗号隔開</code>

<code>#rw,讀寫權限</code>

<code>#sync,同步方式</code>

<code>#root_squash,壓縮root使用者的權限</code>

<code>#anonuid=48,指定此使用者的id能通路共享檔案</code>

<code>#anongid=48指定此組的id能通路共享檔案</code>

<code>[root@jie1 htdocs]</code><code># service nfs start  #開啟nfs服務</code>

<code>Starting NFS services:                                     [  OK  ]</code>

<code>Starting NFS quotas:                                       [  OK  ]</code>

<code>Starting NFS mountd:                                       [  OK  ]</code>

<code>Stopping RPC idmapd:                                       [  OK  ]</code>

<code>Starting RPC idmapd:                                       [  OK  ]</code>

<code>Starting NFS daemon:                                       [  OK  ]</code>

<code>[root@jie1 htdocs]</code><code>#</code>

web:用戶端的配置

1)、安裝httpd的軟體

<code>[root@jie3 /]</code><code># yum -y install httpd</code>

<code>[root@jie3 /]</code><code># vim /etc/httpd/conf/httpd.conf</code>

<code>ServerName 172.16.22.3:80</code>

<code>#DocumentRoot "/var/www/html"</code>

<code>   </code><code>DocumentRoot  </code><code>/website</code>   <code>#存放網頁檔案的路徑</code>

<code>[root@jie3 /]</code><code># mkdir /website</code>

<code>[root@jie3 /]</code><code># httpd -t</code>

<code>[root@jie3 /]</code><code># service httpd start</code>

<code>[root@jie3 ~]</code><code># cd /website/</code>

<code>[root@jie3 website]</code><code># ls   #現在檢視是沒有任何檔案</code>

<code>[root@jie3 website]</code><code>#</code>

實作同步:

1)伺服器端設定apache使用者對共享的檔案有讀寫權限

<code>[root@jie1 htdocs]</code><code>#setfacl -R -m u:apache:rwx /web/ #設定apache使用者對此中所有檔案有讀寫可執行權限</code>

2)用戶端挂載伺服器的共享檔案,檢視用戶端是否已經同步伺服器端的檔案

<code>[root@jie3 website]</code><code>#cd /root</code>

<code>[root@jie3 ~]</code><code># mount -t nfs 172.16.22.1:/web/htdocs /website/ #通過nfs挂載伺服器端的檔案</code>

<code>[root@jie3 /]</code><code>#echo "172.16.22.1:/web/htdocs  /website       nfs    defaults,_netdev 0 0" &gt;&gt;/etc/fstab  #實作開機挂載</code>

<code>[root@jie3 website]</code><code># ls  #檢視檔案已經同步過來</code>

3)用戶端在共享的檔案中新增檔案,檢視伺服器端是否同步檔案

<code>[root@jie3 website]</code><code># ls</code>

<code>[root@jie3 website]</code><code># touch website.html  #在用戶端建立此檔案</code>

<code>index.html  </code><code>test</code><code>.html  </code><code>test</code><code>.php  website.html</code>

<code>[root@jie1 htdocs]</code><code># ls  #伺服器端,可以檢視來着用戶端上傳的檔案</code>

     所有的資料其實都儲存到了nfs伺服器,不論使用者通路哪台Web伺服器,都要來nfs伺服器擷取資料,這樣勢必照成nfs伺服器的性能下降,而且用戶端對nfs伺服器的依賴性較大,如果nfs伺服器down掉之後,用戶端的web伺服器就無法工作了。(動态的那種資料,而且資料量很大的資料,就不要用nfs伺服器來實作資料共享了,一般适應于,靜态頁面和資料較小的檔案)

二、rsync +inotify實作web資料同步

<a target="_blank" href="http://blog.51cto.com/attachment/201309/114946392.png"></a>

rsync(remote sync)的特性:

   可以鏡像儲存整個目錄樹和檔案系統

   可以同步增量同步資料,檔案傳輸效率高,因而同步時間很短

   可以保持原有檔案的權限、時間等屬性

   加密傳輸資料,保證了資料的安全性

   支援匿名傳輸

         rsync也能實作同步,但是需要自己手動的去同步資料,當資料量非常的頻繁時,無疑是加大了運維人員的工作,inotify是一種強大的、細粒度的、異步的檔案系統事件監控機制,inotify-tools工具的出現,解決了這種工作,安裝inotify軟體的主機會監聽伺服器端的主機是否資料和本機不一樣,(因為在上傳資料時,運維人員先上傳到安裝inotify主機上),不一樣就用rsync指令直接把資料傳輸過去。用戶端安裝rsync軟體是為了調用rsync的指令,安裝inotify軟體是監聽和資料是否發生改變,伺服器端安裝rsync軟體時為了提供rsync服務。

rsync+web服務端的配置:

1)、安裝相關軟體

<code>[root@jie1 ~]</code><code># yum -y install rsync xinetd httpd</code>

<code>#rsync服務通常基于超級守護程序xinetd管理的方式來實作,是以需要事先安裝rysnc和xinetd</code>

2)、web的相關配置,使得web能夠提供服務

<code>[root@jie1 ~]</code><code># mkdir -pv /web/htdocs</code>

<code>[root@jie1 ~]</code><code># cd /web/htdocs   #伺服器端,沒有任何的網頁檔案</code>

<code>[root@jie1 ~]</code><code># ls</code>

<code>[root@jie1 ~]</code><code>#</code>

3)、rsync服務的相關配置

*****建立rsync的配置檔案和密碼檔案************

       touch /etc/rsyncd.conf(rsync的配置檔案)

       touch /etc/rsyncd.pwd(使用者的密碼檔案)  

       chmod 600 /etc/rsyncd.pwd(權限要設定為600,否則無法備份成功)

23

24

25

26

27

28

29

30

31

32

<code>[root@jie1 ~]</code><code># vim /etc/rsyncd.conf</code>

<code>############vim /etc/rsyncd.conf########################################</code>

<code>uid = nobody                    </code><code>#備份以什麼身份進行,使用者ID</code>

<code>gid = nobody                    </code><code>#備份以什麼身份進行,組ID</code>

<code>use chroot = no                 </code><code>#禁锢在源目錄</code>

<code>max connections = 3             </code><code>#最大連接配接數,0代表沒有限制</code>

<code>strict modes = </code><code>yes</code>              <code>#是否檢查密碼檔案的權限</code>

<code>pid </code><code>file</code> <code>= </code><code>/var/run/rsyncd</code><code>.pid  </code><code>#運作程序的pid檔案</code>

<code>log </code><code>file</code> <code>= </code><code>/var/log/rsyncd</code><code>.log  </code><code>#日志記錄檔案</code>

<code>[htdocs]                        </code><code>#指定認證的備份子產品名</code>

<code>path = </code><code>/web/htdocs</code>              <code>#需要備份的目錄的路徑</code>

<code>ignore errors = </code><code>yes</code>             <code>#忽略一些無關的IO錯誤</code>

<code>read</code> <code>only = no                  </code><code>#設定為no,即可以傳至伺服器的相應目錄。</code>

<code>write only = no                 </code><code>#設定為no,表示用戶端可以下載下傳檔案</code>

<code>hosts allow = 172.16.22.3       </code><code>#可以連接配接rsync伺服器的主機的IP位址</code>

<code>hosts deny = *                  </code><code>#設定禁止連接配接rsync伺服器的主機位址,*表示  拒絕所有除了hosts allow定義的</code>

<code>uid = root</code>

<code>gid = root</code>

<code>auth </code><code>users</code> <code>= backuper            </code><code>#連接配接子產品的使用者名</code>

<code>secrets </code><code>file</code> <code>= </code><code>/etc/rsyncd</code><code>.</code><code>pwd</code>   <code>#連接配接子產品使用者名的密碼檔案存放路徑</code>

<code>#####################################################################</code>

<code>[root@jie1 ~]</code><code>#vim  /etc/rsyncd.pwd  #使用者的密碼檔案</code>

<code>backuper:pwd123        </code><code>#使用者名:密碼</code>

<code>[root@jie1 ~]</code><code># chmod 600  /etc/rsyncd.pwd   #權限給600</code>

<code>[root@jie1 ~]</code><code># chkconfig rsync on</code>

<code>[root@jie1 ~]</code><code># chkconfig xinetd on</code>

<code>[root@jie1 ~]</code><code># service  xinetd start</code>

<code>Starting xinetd:                                           [  OK  ]</code>

<code>[root@jie1 ~]</code><code># netstat -pant | grep 873</code>

<code>tcp        0      0 :::873                      :::*                        LISTEN      19876</code><code>/xinetd</code>

rsync+inotify+web用戶端的配置:

1)、inotify-tools軟體的安裝及設定

<code>[root@jie3 ~]</code><code>#wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz             #下載下傳inotify-tools軟體</code>

<code>[root@jie3 ~]</code><code># ls</code>

<code>anaconda-ks.cfg            </code><code>install</code><code>.log   </code>

<code>inotify-tools-3.14.</code><code>tar</code><code>.gz  </code><code>install</code><code>.log.syslog</code>

<code>[root@jie3 ~]</code><code># tar xf inotify-tools-3.14.tar.gz          #解壓軟體</code>

<code>[root@jie3 ~]</code><code># cd inotify-tools-3.14</code>

<code>[root@jie3 inotify-tools-3.14]</code><code># ./configure --prefix=/usr/local/inotify &amp;&amp; make &amp;&amp; make install                 #編譯安裝軟體</code>

<code>[root@jie3 ~]</code><code>#cd /usr/local/inotify/</code>

<code>[root@jie3 inotify]</code><code># echo "PATH=/usr/local/inotify/bin:$PATH" &gt;&gt;/etc/profile.d/inotify.sh             #設定能與系統關聯的path路徑</code>

<code>[root@jie3 inotify]</code><code># source /etc/profile.d/inotify.sh</code>

<code>[root@jie3 inotify]</code><code># echo "/usr/local/inotify/lib" &gt;/etc/ld.so.conf.d/inotify.conf         #設定系統能識别軟體的庫檔案</code>

<code>[root@jie3 inotify]</code><code># ldconfig -v | grep inotify</code>

<code>/usr/local/inotify/lib</code><code>:</code>

<code>    </code><code>libinotifytools.so.0 -&gt; libinotifytools.so.0.4.1</code>

<code>[root@jie3 inotify]</code><code># ln -sv /usr/local/inotify/include/ /usr/include/inotify                      #連結頭檔案到系統能識别的路徑下</code>

<code>`</code><code>/usr/include/inotify</code><code>' -&gt; `/usr/local/inotify/include/'</code>

<code>[root@jie3 inotify]</code><code>#</code>

<code>   </code><code>DocumentRoot  </code><code>/website</code>

<code>[root@jie3 website]</code><code>#  ls</code>

<code>[root@jie3 ~]</code><code>#</code>

3)、配置能連接配接rsync的密碼檔案和傳輸資料的腳本

<code>[root@jie3 ~]</code><code># vim /etc/rsyncd.pwd</code>

<code>#############################################</code>

<code>pwd123  </code><code>#密碼與rsync伺服器的密碼相同</code>

<code>###############################################</code>

<code>[root@jie3 ~]</code><code># chmod 600 /etc/rsyncd.pwd</code>

<code>[root@jie3 ~]</code><code># vim  rsync.sh</code>

<code>#!/bin/bash</code>

<code>host=172.16.22.1</code>

<code>src=</code><code>/website</code>

<code>des=htdocs</code>

<code>inotifywait -mrq --timefmt </code><code>'%d/%m/%y %H:%M'</code> <code>--</code><code>format</code> <code>'%T %w%f%e'</code> <code>-e modify,delete,create,attrib $src \</code>

<code>| </code><code>while</code> <code>read</code> <code>files</code>

<code>  </code><code>do</code>

<code>/usr/bin/rsync</code> <code>-vzrtopg  --progress --password-</code><code>file</code><code>=</code><code>/etc/rsyncd</code><code>.secrets $src backuper@$host::$des</code>

<code>echo</code> <code>"${files} was rsynced"</code> <code>&gt;&gt;</code><code>/tmp/rsync</code><code>.log 2&gt;&amp;1</code>

<code>done</code>

<code>####################################################################</code>

驗證實作同步:

<code>##1、先開啟監控的腳本(inotify主機上)</code>

<code>[root@jie3 ~]</code><code># bash -x rsync.sh &amp;</code>

<code>#不放在背景可以檢視同步的詳細過程,生成環境中,建議把此腳本放到背景執行,此腳本會監控用戶端資料是否方式變化,如果變化腳本就運作,資料不變化,腳本就會等待着使用者的輸入</code>

<code>##2、在開一個終端,在此目錄建立檔案(inotify主機上)</code>

<code>[root@jie3 website]</code><code># touch index.html test.php testdb.php  inotify.php</code>

<code>index.html  testdb.php  </code><code>test</code><code>.php inotify.php</code>

<code>##3、看伺服器端,資料是否已經同步過去</code>

<code>index.html  testdb.php  </code><code>test</code><code>.php inotify.php  </code><code>#資料已經被同步過來</code>

    rsync +inotify這種能實作資料的同步,但是當網絡很繁忙,且檔案變化比較頻繁時,而且需要同步的rsync伺服器端比較多時,rsync+inotify肯定是滿足不了需求的,于是rsync+sersync這種更快更節約資源實作web資料同步可以彌補rsync+inotify帶來的不足,rsync+inotify還有一個重大的缺點就是資料傳輸隻是單向的,當運維人員由于“粗心”把資料直接傳輸rsync伺服器端時,inotify主機是得不到rsync伺服器端的資料,于是unison+inotify實作web資料雙向同步,解決了rsync+inotify的這一缺點。

三、rsync+sersync更快更節約資源實作web資料同步

<a target="_blank" href="http://blog.51cto.com/attachment/201309/184041577.png"></a>

 sersync與inotify相比有以下優點:

sersync是使用c++編寫,而且對linux系統檔案系統産生的臨時檔案和重複的檔案操作進行過濾,是以在結合rsync同步的時候,節省了運作時耗和網絡資源。是以更快。

   sersync配置起來很簡單,其中bin目錄下已經有基本上靜态編譯的2進制檔案,配合bin目錄下的xml配置檔案直接使用即可。

   sersync使用多線程進行同步,尤其在同步較大檔案時,能夠保證多個伺服器實時保持同步狀态。

   sersync有出錯處理機制,通過失敗隊列對出錯的檔案重新同步,如果仍舊失敗,則按設定時長對同步失敗的檔案重新同步。

    sersync自帶crontab功能,隻需在xml配置檔案中開啟,即可按您的要求,隔一段時間整體同步一次。無需再額外配置crontab功能。

rsync+web伺服器端的配置:

<code>ServerName www.jie.com</code>

<code>DocumentRoot  </code><code>/web/htdocs</code>

<code>###====此配置檔案的解釋,在rsync+inotify中已經解釋了=====####</code>

<code>############vim /etc/rsyncd.conf###############</code>

<code>uid = nobody</code>

<code>gid = nobody</code>

<code>use chroot = no</code>

<code>max connections = 3</code>

<code>strict modes = </code><code>yes</code>

<code>pid </code><code>file</code><code>= </code><code>/var/run/rsyncd</code><code>.pid</code>

<code>log </code><code>file</code><code>= </code><code>/var/log/rsyncd</code><code>.log</code>

<code>[htdocs]</code>

<code>path = </code><code>/web/htdocs</code>

<code>ignore errors = </code><code>yes</code>

<code>readonly</code> <code>= no</code>

<code>write only = no</code>

<code>hosts allow = 172.16.22.3</code>

<code>hosts deny = *</code>

<code>list = </code><code>false</code>

<code>auth </code><code>users</code><code>= backuper</code>

<code>secrets </code><code>file</code><code>= </code><code>/etc/rsyncd</code><code>.</code><code>pwd</code>

<code>##############################################</code>

<code>[root@jie1 ~]</code><code>#vim /etc/rsyncd.pwd</code>

<code>backuper:pwd123</code>

<code>[root@jie1 ~]</code><code># chmod 600 /etc/rsyncd.pwd</code>

sersync+web用戶端的配置:

1)、先下載下傳安裝sersync軟體,做初始設定

<code>[root@jie3 ~]</code><code>#wget --no-check-certificate https://sersync.googlecode.com/files/sersync2.5_64bit_binary_stable_final.tar.gz</code>

<code>anaconda-ks.cfg  </code><code>install</code><code>.log.syslog</code>

<code>install</code><code>.log      sersync2.5_64bit_binary_stable_final.</code><code>tar</code><code>.gz</code>

<code> </code><code>mkdir</code> <code>/usr/local/sersync</code>

<code>[root@jie3 ~]</code><code>#mkdir -pv /usr/local/sersync/{conf,bin,log}</code>

<code>mkdir</code><code>: created directory `</code><code>/usr/local/sersync</code><code>'</code>

<code>mkdir</code><code>: created directory `</code><code>/usr/local/sersync/conf</code><code>'</code>

<code>mkdir</code><code>: created directory `</code><code>/usr/local/sersync/bin</code><code>'</code>

<code>mkdir</code><code>: created directory `</code><code>/usr/local/sersync/log</code><code>'</code>

<code>[root@jie3 ~]</code><code># tar xf sersync2.5_64bit_binary_stable_final.tar.gz</code>

<code>[root@jie3 ~]</code><code># cd GNU-Linux-x86/</code>

<code>[root@jie3 GNU-Linux-x86]</code><code># ls</code>

<code>confxml.xml  sersync2</code>

<code>[root@jie3 GNU-Linux-x86]</code><code># mv confxml.xml /usr/local/sersync/conf/</code>

<code>[root@jie3 GNU-Linux-x86]</code><code># mv sersync2  /usr/local/sersync/bin/</code>

<code>[root@jie3 GNU-Linux-x86]</code><code># cd /usr/local/sersync/</code>

<code>[root@jie3 sersync]</code><code># echo "PATH=/usr/local/sersync/bin:$PATH" &gt;&gt;/etc/profile.d/sersync.sh</code>

<code>[root@jie3 sersync]</code><code># source /etc/profile.d/sersync.sh</code>

<code>[root@jie3 sersync]</code><code># echo "pwd123" &gt;/usr/local/sersync/sersync.pwd</code>

<code>[root@jie3 sersync]</code><code># chmod 600 /usr/local/sersync/sersync.pwd</code>

2)、修改sersync的配置檔案

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

<code>[root@jie3 sersync]</code><code># vim /usr/local/sersync/conf/confxml.xml</code>

<code>#########################################################################&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</code>

<code>&lt;</code><code>head</code> <code>version=</code><code>"2.5"</code><code>&gt;</code>

<code>  </code><code>#設定本地的ip位址和監聽的端口</code>

<code>    </code><code>&lt;host hostip=</code><code>"172.16.22.3"</code> <code>port=</code><code>"8008"</code><code>&gt;&lt;</code><code>/host</code><code>&gt;</code>

<code>  </code><code>#debug模式是否開啟</code>

<code>    </code><code>&lt;debug start=</code><code>"false"</code><code>/&gt;</code>

<code>  </code><code>#xfs檔案系統是否開啟</code>

<code>    </code><code>&lt;fileSystem xfs=</code><code>"false"</code><code>/&gt;</code>

<code>  </code><code>#同步時,是否支援正規表達式,預設關閉</code>

<code>    </code><code>&lt;filter start=</code><code>"false"</code><code>&gt;</code>

<code>    </code><code>&lt;exclude expression=</code><code>"(.*)\.svn"</code><code>&gt;&lt;</code><code>/exclude</code><code>&gt;</code>

<code>    </code><code>&lt;exclude expression=</code><code>"(.*)\.gz"</code><code>&gt;&lt;</code><code>/exclude</code><code>&gt;</code>

<code>    </code><code>&lt;exclude expression=</code><code>"^info/*"</code><code>&gt;&lt;</code><code>/exclude</code><code>&gt;</code>

<code>    </code><code>&lt;exclude expression=</code><code>"^static/*"</code><code>&gt;&lt;</code><code>/exclude</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>/filter</code><code>&gt;</code>

<code>  </code><code># 設定要監控的事件</code>

<code>    </code><code>&lt;inotify&gt;</code>

<code>    </code><code>&lt;delete start=</code><code>"true"</code><code>/&gt;</code>

<code>    </code><code>&lt;createFolder start=</code><code>"true"</code><code>/&gt;</code>

<code>    </code><code>&lt;createFile start=</code><code>"false"</code><code>/&gt;</code>

<code>    </code><code>&lt;closeWrite start=</code><code>"true"</code><code>/&gt;</code>

<code>    </code><code>&lt;moveFrom start=</code><code>"true"</code><code>/&gt;</code>

<code>    </code><code>&lt;moveTo start=</code><code>"true"</code><code>/&gt;</code>

<code>    </code><code>&lt;attrib start=</code><code>"false"</code><code>/&gt;</code>

<code>    </code><code>&lt;modify start=</code><code>"false"</code><code>/&gt;</code>

<code>    </code><code>&lt;</code><code>/inotify</code><code>&gt;</code>

<code>  </code><code>#同步的設定</code>

<code>    </code><code>&lt;sersync&gt;</code>

<code>  </code><code>#同步的路徑,本地的目錄</code>

<code>    </code><code>&lt;localpath </code><code>watch</code><code>=</code><code>"/website"</code><code>&gt;</code>

<code>  </code><code>#rsync伺服器的ip位址和rsync配置檔案裡面定義的子產品</code>

<code>        </code><code>&lt;remote ip=</code><code>"172.16.22.1"</code> <code>name=</code><code>"htdocs"</code><code>/&gt;</code>

<code>  </code><code>#&lt;!-- --&gt;括起來表示注釋</code>

<code>        </code><code>&lt;!--&lt;remote ip=</code><code>"192.168.8.39"</code> <code>name=</code><code>"tongbu"</code><code>/&gt;--&gt;</code>

<code>        </code><code>&lt;!--&lt;remote ip=</code><code>"192.168.8.40"</code> <code>name=</code><code>"tongbu"</code><code>/&gt;--&gt;</code>

<code>    </code><code>&lt;</code><code>/localpath</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>rsync</code><code>&gt;</code>

<code>  </code><code>#rsync指令參數</code>

<code>        </code><code>&lt;commonParams params=</code><code>"-artuz"</code><code>/&gt;</code>

<code>  </code><code>#rsync同步認證設定的内容,user指定使用者名,password指定存放密碼的檔案路徑</code>

<code>        </code><code>&lt;auth start=</code><code>"true"</code> <code>users</code><code>=</code><code>"backuper"</code> <code>passwordfile=</code><code>"/usr/local/sersync/sersync.pwd"</code><code>/&gt;</code>

<code>  </code><code>#設定rsync遠端服務端口</code>

<code>        </code><code>&lt;userDefinedPort start=</code><code>"false"</code> <code>port=</code><code>"874"</code><code>/&gt;&lt;!-- port=874 --&gt;</code>

<code>  </code><code>#設定逾時時間</code>

<code>       </code><code>&lt;timeout start=</code><code>"true"</code> <code>time</code><code>=</code><code>"100"</code><code>/&gt;&lt;!-- timeout=100 --&gt;</code>

<code>  </code><code>#設定ssh加密傳輸模式,預設關閉</code>

<code>        </code><code>&lt;</code><code>ssh</code> <code>start=</code><code>"false"</code><code>/&gt;</code>

<code>    </code><code>&lt;</code><code>/rsync</code><code>&gt;</code>

<code>  </code><code>#設定sersync傳輸失敗日志腳本路徑</code>

<code>    </code><code>&lt;failLog path=</code><code>"/tmp/rsync_fail_log.sh"</code> <code>timeToExecute=</code><code>"60"</code><code>/&gt;&lt;!--default every 60mins execute once--&gt;</code>

<code>  </code><code>#設定rsync+crontab定時傳輸,預設關閉</code>

<code>    </code><code>&lt;</code><code>crontab</code> <code>start=</code><code>"false"</code> <code>schedule=</code><code>"600"</code><code>&gt;&lt;!--600mins--&gt;</code>

<code>        </code><code>&lt;crontabfilter start=</code><code>"false"</code><code>&gt;</code>

<code>        </code><code>&lt;exclude expression=</code><code>"*.php"</code><code>&gt;&lt;</code><code>/exclude</code><code>&gt;</code>

<code>        </code><code>&lt;exclude expression=</code><code>"info/*"</code><code>&gt;&lt;</code><code>/exclude</code><code>&gt;</code>

<code>        </code><code>&lt;</code><code>/crontabfilter</code><code>&gt;</code>

<code>    </code><code>&lt;</code><code>/crontab</code><code>&gt;</code>

<code>  </code><code>#設定sersync傳輸後調用name指定的插件腳本,預設關閉</code>

<code>    </code><code>&lt;plugin start=</code><code>"false"</code> <code>name=</code><code>"command"</code><code>/&gt;</code>

<code>    </code><code>&lt;</code><code>/sersync</code><code>&gt;</code>

<code>  </code><code>#插件腳本範例</code>

<code>    </code><code>&lt;plugin name=</code><code>"command"</code><code>&gt;</code>

<code>    </code><code>&lt;param prefix=</code><code>"/bin/sh"</code> <code>suffix=</code><code>""</code> <code>ignoreError=</code><code>"true"</code><code>/&gt;    &lt;!--prefix </code><code>/opt/tongbu/mmm</code><code>.sh suffix--&gt;</code>

<code>        </code><code>&lt;include expression=</code><code>"(.*)\.php"</code><code>/&gt;</code>

<code>        </code><code>&lt;include expression=</code><code>"(.*)\.sh"</code><code>/&gt;</code>

<code>    </code><code>&lt;</code><code>/plugin</code><code>&gt;</code>

<code>&lt;</code><code>/head</code><code>&gt;</code>

<code>#######################################################################</code>

<code>###sersync用戶端的,開啟同步機制,進行監控,然後建立檔案</code>

<code>[root@jie3 website]</code><code># sersync2 -r -d &amp;</code>

<code>[root@jie3 website]</code><code># touch index.html  testdb.php  test.html  test.php</code>

<code>###rsync伺服器端,檢視可以來着sersync用戶端的同步檔案</code>

<code>index.html  testdb.php  </code><code>test</code><code>.html  </code><code>test</code><code>.php</code>

四、unison+inotify實作web資料雙向同步

Unison是一款跨平台的檔案同步對象,不僅支撐本地對本地同步,也支撐經由過程SSH、RSH和Socket等收集和談進行同步。

 Unison支撐雙向同步操縱,你既可以從A同步到B,也可以從B同步到A,這些都不須要額外的設定。

1)、兩個伺服器都編譯安裝這三個源碼包:(在此我隻寫一台伺服器的編譯安裝過程)

<code>[root@jie1 ~]</code><code>#wget ftp://distro.ibiblio.org/slitaz/sources/packages-2.0/o/ocaml-3.10.2.tar.gz</code>

<code>[root@jie1~]</code><code>#wget  http://freebsd.ntu.edu.tw/FreeBSD/ports/distfiles/unison-2.32.52/unison-2.32.52.tar.gz</code>

<code>[root@jie1~]</code><code>#wget http://cloud.github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz</code>

<code>anaconda-ks.cfg            </code><code>install</code><code>.log         ocaml-3.10.2.</code><code>tar</code><code>.gz</code>

<code>inotify-tools-3.14.</code><code>tar</code><code>.gz  </code><code>install</code><code>.log.syslog  unison-2.32.52.</code><code>tar</code><code>.gz</code>

<code>[root@jie1 ~]</code><code># tar xf inotify-tools-3.14.tar.gz</code>

<code>[root@jie1 ~]</code><code># tar xf ocaml-3.10.2.tar.gz</code>

<code>[root@jie1 ~]</code><code># tar xf unison-2.32.52.tar.gz</code>

<code>##編譯安裝inotify</code>

<code>[root@jie1 ~]</code><code># cd inotify-tools-3.14</code>

<code>[root@jie1 inotify-tools-3.14]</code><code># ./configure --prefix=/usr/local/inotify &amp;&amp; make &amp;&amp; make install</code>

<code>[root@jie1 inotify-tools-3.14]</code><code># cd /usr/local/inotify/</code>

<code>##修改PATH環境變量</code>

<code>[root@jie1 inotify]</code><code># echo "PATH=/usr/local/inotify/bin:$PATH" &gt;/etc/profile.d/inotify.sh</code>

<code>[root@jie1 inotify]</code><code># source /etc/profile.d/inotify.sh</code>

<code>##添加庫檔案到系統識别的路徑</code>

<code>[root@jie1 inotify]</code><code># echo "/usr/local/inotify/lib" &gt;/etc/ld.so.conf.d/inotify.conf</code>

<code>[root@jie1 inotify]</code><code># ldconfig -v | grep inotify</code>

<code>##連結庫檔案到系統識别的路徑</code>

<code>[root@jie1 inotify]</code><code># ln -sv /usr/local/inotify/include/ /usr/include/inotify</code>

<code>##編譯安裝ocaml,unison依賴于ocaml</code>

<code>[root@jie1 inotify]</code><code>#cd /root/ocaml-3.10.2</code>

<code>[root@jie1 ocaml-3.10.2]</code><code>#./configure</code>

<code>[root@jie1 ocaml-3.10.2]</code><code>#make world opt</code>

<code>[root@jie1 ocaml-3.10.2]</code><code>#make install</code>

<code>##編譯安裝unison</code>

<code>[root@jie1 ocaml-3.10.2]</code><code># cd /root/unison-2.32.52</code>

<code>##安裝依賴性包</code>

<code>[root@jie1 unison-2.32.52]</code><code>#yum -y install ctags-etags</code>

<code>[root@jie1 unison-2.32.52]</code><code># make UISTYLE=text</code>

<code>##make install會提示錯誤,此錯誤就是要你cp unison /usr/local/bin,複制即可</code>

<code>[root@jie1 unison-2.32.52]</code><code># make install</code>

<code>[root@jie1 unison-2.32.52]</code><code># cp unison /usr/local/bin</code>

2)、伺服器A生成的公鑰傳到伺服器B上:

<code>##把伺服器A生成的公鑰傳到伺服器B上####</code>

<code>[root@jie1 ~]</code><code># ssh-keygen -t rsa   #生成ssh的密鑰對</code>

<code>[root@jie1 ~]</code><code># scp ~/.ssh/id_rsa.pub  172.16.22.3:/root  #生成的密鑰在家目錄的ssh檔案中,ssh檔案為隐藏檔案,通過scp複制到伺服器B上</code>

<code>[root@jie3 ~]</code><code># mv id_rsa.pub .ssh/authorized_keys  #在伺服器B上把伺服器A傳來的公鑰檔案改名并存放到ssh目錄下</code>

<code>[root@jie3 ~]</code><code># chmod 600 .ssh/authorized_keys  #給公鑰檔案改權限為600</code>

<code>[root@jie1 ~]</code><code># service sshd restart  #重新開機sshd服務</code>

<code>Stopping sshd:                                             [  OK  ]</code>

<code>Starting sshd:                                             [  OK  ]</code>

3)、伺服器B生成的公鑰傳到伺服器A上:

<code>##把伺服器B生成的公鑰傳到伺服器A上####</code>

<code>[root@jie3 ~]</code><code># ssh-keygen -t rsa   #生成ssh的密鑰對</code>

<code>[root@jie3 ~]</code><code># scp ~/.ssh/id_rsa.pub  172.16.22.1:/root  #生成的密鑰在家目錄的ssh檔案中,ssh檔案為隐藏檔案,通過scp複制到伺服器B上</code>

<code>[root@jie1 ~]</code><code># mv id_rsa.pub .ssh/authorized_keys  #在伺服器A上把伺服器B傳來的公鑰檔案改名并存放到ssh目錄下</code>

<code>[root@jie1 ~]</code><code># chmod 600 .ssh/authorized_keys  #給公鑰檔案改權限為600</code>

<code>[root@jie3 ~]</code><code># service sshd restart  #重新開機sshd服務</code>

4)、分别搭建web服務,伺服器A的網頁檔案存放路徑為/web/htdocs,伺服器B的網頁存放路徑為/website

<code>##伺服器A搭建web的配置</code>

<code>[root@jie1 /]</code><code># vim /etc/httpd/conf/httpd.conf</code>

<code>##伺服器B搭建web的配置</code>

5)、編unison同步的腳本進行測試

<code>##伺服器A的腳本</code>

<code>[root@jie1 ~]</code><code># vim serA.sh</code>

<code>######################################################################</code>

<code>#/bin/bash</code>

<code>ipB=</code><code>"172.16.22.3"</code>

<code>srcA=</code><code>"/web/htdocs"</code>

<code>dstB=</code><code>"/website"</code>

<code>/usr/local/inotify/bin/inotifywait</code> <code>-mrq -e create,delete,modify,move $srcA | </code><code>while</code> <code>read</code> <code>line; </code><code>do</code>

<code>/usr/local/bin/unison</code> <code>-batch $srcA </code><code>ssh</code><code>:</code><code>//</code><code>$ipB/$dstB</code>

<code>echo</code> <code>-n </code><code>"$line "</code> <code>&gt;&gt; </code><code>/var/log/inotify</code><code>.log</code>

<code>echo</code> <code>`</code><code>date</code> <code>| </code><code>cut</code> <code>-d </code><code>" "</code> <code>-f1-4` &gt;&gt; </code><code>/var/log/inotify</code><code>.log</code>

<code>##伺服器B的腳本</code>

<code>[root@jie3 ~]</code><code># vim serB.sh</code>

<code>ipA=</code><code>"172.16.22.1"</code>

<code>srcB=</code><code>"/website"</code>

<code>dstA=</code><code>"/web/htdocs"</code>

<code>/usr/local/inotify/bin/inotifywait</code> <code>-mrq -e create,delete,modify,move $srcB | </code><code>while</code> <code>read</code> <code>line; </code><code>do</code>

<code>/usr/local/bin/unison</code> <code>-batch $srcB </code><code>ssh</code><code>:</code><code>//</code><code>$ipA/$dstA</code>

<code>##伺服器A的測試</code>

<code>[root@jie1 ~]</code><code># sh -x serA.sh  #先運作unison同步腳本,檢視過程</code>

<code>[root@jie1 htdocs]</code><code># touch serA.txt SerA.html SerA.php  #然後建立檔案</code>

<code>SerA.html  SerA.php  serA.txt  SerB.html  SerB.php  SerB.txt</code>

<code>##伺服器B的測試</code>

<code>[root@jie3 ~]</code><code># sh -x serB.sh</code>

<code>[root@jie3 website]</code><code># touch SerB.txt SerB.html SerB.php</code>

<code>###=====可以把腳本設定開機自啟,放到rc.local檔案中,且放在背景運作</code>

本文轉自 jie783213507 51CTO部落格,原文連結:http://blog.51cto.com/litaotao/1286871,如需轉載請自行聯系原作者