[ 永遠的UNIX::UNIX技術資料的寶庫 ]   GB | BIG5

首頁 > 系統管理 > Linux > 正文
Linux下的實時數據鏡像
本文出自:http://www.linxaid.com.cn 原作:Atif Ghaffa 翻譯:sword_martin (2001-10-19 08:00:01)

摘要: 

   在本文中我們將要討論的是,如何拋開昂貴的SAN(存貯區域網絡Storage Area Network,
   如全球文件系統GFS)或網絡塊設備在Linux下實現數據復制。我們在復制系統中採用了FAM
   (文件變更監視模塊)和IMON(信息節點監視模塊),這兩個系統都是SGI當初為IRIX開發的。 
  SGI的員工真是非常的Cool,是他們將這兩個程序移植到了Linux上並且公開了源代碼。 
  當花費已不再是問題時,可以採用基GFS(全球文件系統)和SAN實現實時數據鏡像;否則,
  數據共享及其它許多的選擇就不可或缺了。 
   有幾個方法可供選擇。在本文中我們將會對這些方法進行討論,你將會看到它們各自的優缺點。 

為何要用復制替代共享? 
   難道假設文件服務器不向客戶端提供共享數據嗎?是的,假設的工作環境確實是這樣的。如果
   我們正在使用的文件服務器是通過NFS或SMB之類軟件的共享文件的,系統中就會存在一個”瓶
   頸”和”引起系統故障的關鍵點”。若是在GFS之上通過共享的存貯設備(SAN或多通道的SCSI)
   共享數據,這種配置不但代價昂貴,並且這種存貯盒還會成為”引起系統故障的關鍵點”。也
   可以用NBD(網絡塊設備)建立一個網絡鏡像,但這不是一種常用的方式,NBD本身有些缺限,
   它非常難設置管理,如果你只是要在少數幾個WEB服務器間復制數據,用NBD只會給你帶來更
   多的麻煩。 

盡量簡單 

好的,下面我們來試著復制。 

方案一: 

    兩台WEB服務器中的一台為主服務器,另外一台是備份服務器。要求備份服務器上的文件要與
    主服務器上的保持相同。 
    這很簡單吧。 
    但是如何使其自動工作呢?用戶每天得多次FTP到主服務器上復制數據。但當主服務器發生錯
    誤、由備份服務器接管系統時會發生什呢?由這種備份操作不是實時的,備份服務器中的
    數據肯定與主服務器不一致,這時管理員會非常惱怒J。你當然可以運行一個計時守護程序,
    每隔5秒運行一次”rsync av delete source destination”,但這樣做會增加機器的負
    荷,影響系統的運轉。 

方案二: 

    有一台FTP服務器用來保存更新web數據,而六個web服務器使用dns輪轉方式實現負載平衡,這
    樣可以保証每台服務器上的數據都是相同的。這樣我們就可以避免使用NFS,但是這樣的解決
    方案並不能令人滿意。 
    那最好的解決方法是什呢?應該是”只有在數據發生變化時才將文件復制到各個web服務
    器上”,如果文件沒有發生變化就什也不作。這也就是我們使用”fam”來做的工作。 

使之智能工作 

    那,我們怎知道文件發了變化呢?我想M$ 的Windows程序開發員會這說: 
    我們可以每隔幾秒就搜尋目標目錄一次,將其中的文件與緩存中保存的文件做比較,看文件
    時間戳及大小是否發生了變化。 
    對,沒錯,是這樣。 
    這是種輪詢的工作方式,它的問題在查找並比較文件的時間戳和大小,它的代價是昂貴的。
    你能想象在WEB服務器上每隔5秒就運行一次”ls lR /somedirectory”造成的果嗎? 
    最好的方法應該是:文件被改動的時候能夠有人告訴我們,這樣我們可以採取相應的動作。
    這正是”IMON”要做的工作。 

什是FAM 

資料來源:http://oss.sgi.com/projects/fam/faq.html 
   fam就是文件變更監視模塊,它向應用程序提供了一組API,當指定的文件或目錄發生變化時,
   由其向應用程序發出通知。 
   FAM由兩部分組成:台守護程序fam,它負責接收請求和發送通知;庫文件libfam,客戶端應
   用程序用它來與FAM通信。 
   若遠程主機打開了受監視的文件,本地的fam會與遠程主機的fam聯系,將請求發送給遠程fam。 
Fam也可以在某個文件開始或停止運行時通知它的客戶端。(比如:在IRIX交互桌面中,如果一個程
序正在運行那它的圖標就會不會閃爍)。 
   Fam是由Bruce Karsh在1989年為IRIX編寫的,並由Bob Miller在1995年重寫。這個公開源代碼的
   fam版本構建並運行Linux和IRIX之上,與IRIX6.5.8中的fam相同。 

什是IMON? 

資料來源:http://oss.sgi.com/projects/fam/faq.html 
   imon就是信息節點監視模塊,它是內核的一部分,當文件有變動時由它通知fam。由應用程序告
   訴fam對某個目錄或文件進行監視,fam再將這個請求傳送給imon。當被監視的這些文件有變化時,
   內核通知imon,再由imon通知fam,最由fam通知負責監視這個文件的應用程序。 
   imon是由Wiltse Carpenter在1989年為IRIX的內核編寫的,再由Roger Chickering移植到Linux下。
   Linux下的imon內核補丁與IRIX下的imon在許多方面都很類似,只是與內核文件系統的掛接代碼
   不同。 

安裝FAM和IMON 

    可從SGI的網站下載FAM和IMON,具體詳情請查看面的資源列表。IMON是一個內核補丁,內核
    通過它監視內部信息節點。安裝補丁的方法如下:在內核的源文件目錄下運行補丁程序。 
cd/usr/src/linux 
pathch pi<pathchfile。 
然運行config或menuconfig,在”文件系統選擇”這部分選擇”Inode Monitor(imon) 
support (EXPERIMENTAL)”,編譯內核重啟系統。編譯FAM本身是很簡單的,在fam的源文件目錄下
運行./configure和make all install就大功告成了。 
下面我們將要安裝SGI::FAM調用的Perl模塊,我們可以用perl來編寫事件處理程序。 

安裝 SGI::FAM Perl模塊 

你不會真的要用C/C++來編程吧?我不了解你的情況,但是我很懶惰,而且我這個人也缺乏耐心,所
以我用perl編寫復制管理程序。 
有關下載安裝SGI::FAM的問題可以找Jesse N.Glick(jglick@sig.bsh.com)聯系。安裝這些模快很簡
單,運行CPAN模塊: 
perl MCPAN e shell 
install SGI::FAM 
這樣就安裝了SGI::FAM及全部必須模塊。 

用fam_mirror實現復制 

fam_mirror是我寫的用自動復制的script程序。要了解fam_mirror的具體情況,你可以在
http://www.linuxfocus.org/common/src/article199/fam_mirror.html去查看,如果要下載fam_mirror,
請到http://www.linuxfocus.org/common/src/article199/fam_mirror。你可以重新編輯這個程序,
將$replicaHosts改為當前的主機、$rsh改為當前使用的shell,也可以將$rsync改為實現相同功能
的命令。 

下面我們來看第一個方案: 

有兩台機器做WEB服務器(web1,web2)。其中一個為主服務器(如web1),另外一個為從服務器
(web2)。第一個FTP服務器是web1,web2上根本不能運行FTP服務(否則,系統工作備份方式時
用戶還可能會向文件中寫數據)。 
在兩台服務器中,web文檔都放在/var/www目錄中,在兩台機器中設置rsh或ssh,使web1無需口令就
可以在web2上運行遠程命令。我通常是在復制主機中的authorized_keys中填加我的ssh_key來實現
這個要求的。將web1的數據遠程同步到web2上的命令是: 
rsync avz /var/www web2:/var/www/ 
編輯fam_mirror文件,將@replicaHosts改為: 
@replicaHosts=qw(web2) 
在web1上運行fam_mirror: 
fam_mirror /var/www & 
這樣,如果web1上的文件發生了變化,這種變化也會寫到web2上的文件中。 

現在我們來看看方案2:(系統中有多台WEB服務器) 

主機linuxweb1、linuxweb2、linuxweb3和linuxweb4都是web服務器。主機Linuxftp 1是ftp服務器
(主服務器)。Web主機不向用戶開放FTP服務。 
在主機linuxftp1上安裝fam和imon、SGI::FAM及fam_mirror。在每台主機上置rsh或ssh。linuxftp1
無需口令就可以在四台WEB服務器上運行遠程命令。 
編輯fam_mirror,將@replicaHosts設置為: 
@replicaHosts=qw(linuxweb1 linuxweb2 linuxweb3 linuxweb4); 
如果有需要也可以改動$rsh和$rsync,假設WEB文本放在各個機器的/var/www目錄下。 
在linuxftp 1上運行:INIT_MIRROR=1 fam_mirror /var/www & 
這樣,四台WEB服務器都能對linuxftp 1上改變的文件進行更新。 

資源列表: 

SGI’s fam site:http://oss.sgi.com/projects/fam 
SGI:FAM Perl Module:http://search.cpan.org/search?dist=SGI-FAM 
Realtime Data Mirroring (WEBD and SLIM) for IRIX: 
http://www.nas.nasa.gov/Groups/www/subpages/topology.html 
fam mirror:http://www.linuxfocus.org/common/src/article199/fam_mirror 

存在的問題 

文中提出的解決方案存在一個小問題:碰到比較大的目錄就不工作了,如含有四千到五千個子目錄的
情況。可能是內核不堪重負了。我正在找到產生這個問題的原因,一有發現我就會寫到文章中的。如
果你已經知道了解決這個問題的方法,請來信告知我。 
(http://www.fanqiang.com)
    進入【UNIX論壇

相關文章
Linux下的實時數據鏡像 (2001-10-19 08:00:01)
用rsync對網站進行鏡像備份 (2001-09-08 13:05:00)
Linux命令Man解釋:MIRROR:鏡像遠端節點上的檔案 (2001-06-11 14:08:00)
如何使用RSYNC在服務器間鏡像或者備份目錄和文件 (2001-04-21 17:57:28)
 

★  樊強制作 歡迎分享  ★