郭曉金,王 超
(重慶郵電大學通信與信息工程學院,重慶 400065)
多路徑就是使用冗余的物理路徑組件(適配器、電纜和交換機)在服務(wù)器與存儲設(shè)備之間創(chuàng)建邏輯路徑。如果這些組件中的一個或多個發(fā)生故障,導(dǎo)致路徑無法使用,多路徑軟件就使用I/O的備用路徑使應(yīng)用程序仍然能夠訪問其數(shù)據(jù)。每個網(wǎng)絡(luò)接口卡(在使用iSCSI的情況下)或HBA都應(yīng)通過使用冗余的交換機基礎(chǔ)結(jié)構(gòu)連接起來,以便在存儲結(jié)構(gòu)組件發(fā)生故障時能繼續(xù)訪問存儲?,F(xiàn)在企業(yè)對數(shù)據(jù)的穩(wěn)定性、可靠性的要求越來越高,特別是在企業(yè)級的數(shù)據(jù)業(yè)務(wù)上,需要非常高的數(shù)據(jù)傳輸可靠性。業(yè)界常用的方法是為數(shù)據(jù)業(yè)務(wù)提供多路徑傳輸通道,來避免單點故障(單點故障是指網(wǎng)絡(luò)中的某處發(fā)生故障,可能導(dǎo)致整個網(wǎng)絡(luò)癱瘓)[1]。
由于多路徑軟件是需要和存儲設(shè)備在一起配合使用的,不同的廠商基于不同的操作系統(tǒng),都提供了不同的版本。本文提出一種多路徑的設(shè)計方法,它基于Linux主機的設(shè)備驅(qū)動程序,用來控制對存儲設(shè)備的訪問,實現(xiàn)主機到存儲設(shè)備之間的路徑選擇,提高主機與存儲設(shè)備之間的路徑可靠性與性能。在有多路徑軟件的情況下,多路徑就可以屏蔽冗余設(shè)備、避免造成混淆,并且創(chuàng)建一個新的設(shè)備,由新的設(shè)備去對應(yīng)多條通路。
MulPath作為內(nèi)核模塊被加載到Linux操作系統(tǒng)中。它在操作系統(tǒng)內(nèi)部被注冊成為一個虛擬設(shè)備。通過該軟件,可以使應(yīng)用服務(wù)器與存儲系統(tǒng)之間選擇合適的路徑進行通信。如圖1所示,當存儲系統(tǒng)是多路徑組網(wǎng)時,系統(tǒng)啟動時MulPath通過設(shè)備的注冊,發(fā)現(xiàn)每條路徑上的設(shè)備,并將路徑狀態(tài)信息記錄在數(shù)據(jù)結(jié)構(gòu)的相應(yīng)位置。對于每個設(shè)備(LUN),MulPath下發(fā)命令,查詢設(shè)備當前歸屬于陣列的哪個控制器,并將主機到這個陣列控制器之間的路徑作為優(yōu)先選擇路徑,即主路徑。如果主機到這個陣列控制器之間有多條路徑,MulPath就會將I/O分擔,從而在這幾條路徑上形成負載均衡[2]。
如圖1所示,當主路徑(路徑1和路徑2)由于某種原因出現(xiàn)故障后,MulPath所提供的Faiover功能能夠自動將業(yè)務(wù)切換到備用路徑上(路徑3),避免了因單點故障而造成業(yè)務(wù)中斷。當主路徑的故障得以解除或修復(fù)后即能夠重新正常傳輸I/O流時,MulPath所提供的Faiback功能會自動地將I/O傳輸路徑從備用路徑切換回主路徑上[3]。
圖1 Linux主機冗余存儲路徑組網(wǎng)圖
MulPath由安裝程序、管理工具和驅(qū)動程序組成,其中安裝程序和管理工具運行在用戶態(tài),而驅(qū)動程序運行在內(nèi)核態(tài)。驅(qū)動實現(xiàn)在內(nèi)核SCSI體系上,這樣比較容易實現(xiàn)搜集并屏蔽物理設(shè)備信息,而求方便形成虛擬設(shè)備信息。
MulPath驅(qū)動實現(xiàn)方框圖如圖2所示。
圖2 MulPath驅(qū)動實現(xiàn)方框圖
MulPath軟件編譯后成為驅(qū)動程序模塊,它主要位于HBA卡驅(qū)動之上,對應(yīng)用程序提供對陣列的訪問入口而屏蔽掉具體的HBA卡和光纖通道。各種應(yīng)用程序,如數(shù)據(jù)庫服務(wù)程序、Web服務(wù)程序等,都將具體的對陣列的I/O請求傳送給驅(qū)動程序,而驅(qū)動程序負責選擇具體傳送數(shù)據(jù)的路徑并返回I/O結(jié)果。
本驅(qū)動程序模塊需要運行在具有可識別類型的HBA卡的主機上,并且主機上安裝了相應(yīng)的HBA驅(qū)動程序,HBA卡通過光纖與主機陣列相聯(lián)。
這類實現(xiàn)方法具有很好的兼容性,能夠兼容多種HBA卡驅(qū)動。
當應(yīng)用程序下發(fā)讀LUN的命令時,例如dd if=/dev/sdb of=/dev/null,經(jīng)過系統(tǒng)多個層次的傳遞,I/O數(shù)據(jù)到達驅(qū)動這一層,使用不同的HBA卡會有不同的scsi_host_template結(jié)構(gòu)體,對不同的HBA卡,均有它自己的queuecommand函數(shù)指針,在此函數(shù)中對下發(fā)的I/O命令排隊,并在恰當?shù)臅r候?qū)⒚畎l(fā)送出去[4]。
由于在MulPath初始化階段,已經(jīng)將真實HBA卡對應(yīng)的HOST下的LUN屏蔽,所以用戶程序操作的都是虛擬HOST下的LUN,虛擬HOST(由多路徑軟件創(chuàng)建)的queuecommand(將SCSI命令包加入到等待隊列中)將收到的I/O命令加入鏈表,并設(shè)置相應(yīng)的回調(diào)函數(shù)、發(fā)送狀態(tài)(如重試、超時次數(shù)等)。
由于MulPath注冊使用虛擬的HBA卡,雖然用戶使用dd等命令操作的是虛擬HBA卡,但是虛擬的HBA卡并不具備真實物理HBA卡真正將數(shù)據(jù)發(fā)送出去的能力。所有MulPath中,需要將利用虛擬HBA卡發(fā)送信息到對應(yīng)LUN的能力轉(zhuǎn)換為利用真實HBA卡發(fā)送信息。這一點就是在選路模塊中,將虛擬LUN轉(zhuǎn)換為“物理”LUN來實現(xiàn)的。
系統(tǒng)啟動時,MulPath通過設(shè)備的注冊,發(fā)現(xiàn)每條路徑上的設(shè)備,并將路徑狀態(tài)信息記錄在數(shù)據(jù)結(jié)構(gòu)的相應(yīng)位置。對于每個設(shè)備(LUN),MulPath下發(fā)命令,查詢設(shè)備CurrentOwner,將此信息記錄在 CurrentOwningPath中,作為優(yōu)先選擇路徑的依據(jù)[5]。
每次發(fā)送命令時要檢測使用路徑的狀態(tài),MulPath對路徑狀態(tài)的判斷是通過讀取存放在RdacInfo數(shù)據(jù)結(jié)構(gòu)中的路徑狀態(tài)變量來進行判斷的,這些狀態(tài)的更新主要是由定時器定時掃描路徑后根據(jù)I/O狀態(tài)來刷新的,因而,它們不一定能實時地反映當前路徑的狀態(tài)。雖然路徑出現(xiàn)故障了,但是RdacInfo中的狀態(tài)正常,仍然發(fā)送命令,發(fā)送產(chǎn)生的I/O錯誤再交給錯誤分析函數(shù)處理。
定時器利用異步發(fā)送命令發(fā)送對標準頁的查詢命令,通過返回的狀態(tài)對路徑狀態(tài)進行檢測。對于每條路徑,只要對一個LUN發(fā)送成功,就繼續(xù)檢測下一條路徑,并修改RdacInfo結(jié)構(gòu)中的狀態(tài)信息。
MulPath總是首先選擇使用RdacInfo結(jié)構(gòu)體中定義的CurrentOwningPath所描述的控制器上的路徑作為首選路徑,當CurrentOwningPath所描述的控制器上的所有路徑都為FAILED時,才會選擇下一個控制器上的路徑。如果當前使用的控制器可用,則在此控制器上的所有路徑進行輪循操作,分擔使用每條可用路徑。
通過選路模塊,MulPath將最初的虛擬LUN通過查找RdacInfo數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換成“物理”LUN,這個“物理”LUN有真實HBA卡的發(fā)送數(shù)據(jù)的能力,隨后將數(shù)據(jù)發(fā)送出去[6]。
路徑狀態(tài)定時刷新通過定時器進行,定時器每1 s觸發(fā)一次。路徑狀態(tài)包括最優(yōu)、最優(yōu)需要檢測、最優(yōu)檢測中、失敗、失敗需要檢測、失敗檢測中、系統(tǒng)特定狀態(tài)7種。處理過程如圖3所示。
圖3 路徑狀態(tài)刷新流程圖
若檢測時路徑狀態(tài)處于最優(yōu),則使該路徑處于最優(yōu)狀態(tài)時間值加1,若此時該路徑的最優(yōu)狀態(tài)時間值大于配置文件中設(shè)置的最優(yōu)檢測時間IdlePathCheckingInterval,則設(shè)置該路徑狀態(tài)為最優(yōu)需要檢測。
若檢測時路徑狀態(tài)處于最優(yōu)需要檢測,則設(shè)置該路徑狀態(tài)為最優(yōu)檢測中,并生成一個異步路徑狀態(tài)檢測命令。若生成異步路徑狀態(tài)檢測命令失敗,則還原設(shè)置該路徑狀態(tài)為最優(yōu),并設(shè)置路徑處于最優(yōu)狀態(tài)時間為0。
若檢測時路徑狀態(tài)處于失敗,則使該路徑處于失敗狀態(tài)時間值加1,若此時該路徑的失敗狀態(tài)時間值大于配置文件中設(shè)置的失敗等待時間RecheckFailedPathWait-Time,則設(shè)置該路徑及路徑上所有設(shè)備的狀態(tài)為失敗需要檢測[7]。
若檢測時路徑狀態(tài)處于失敗需要檢測,則使該路徑處于失敗狀態(tài)時間值加1,若此時該路徑的失敗狀態(tài)時間值大于配置文件中設(shè)置的失敗檢測時間FailedPathCheckingInterval,則設(shè)置該路徑及路徑上所有設(shè)備的狀態(tài)為失敗檢測中,并生成一個異步路徑狀態(tài)檢測命令,若生成異步路徑狀態(tài)檢測命令失敗,則還原設(shè)置該路徑及路徑上所有設(shè)備狀態(tài)為失敗,并設(shè)置路徑處于失敗狀態(tài)時間為0[8]。
若路徑狀態(tài)為最優(yōu)檢測中、失敗檢測中、系統(tǒng)特定這3種狀態(tài),則不做任何處理。
針對多路徑軟件主要解決路徑切換和負載均衡兩個問題,設(shè)計了兩種組網(wǎng)來分別測試并選擇各大存儲設(shè)備廠商廣泛使用的Iometer作為I/O測試的工具。
測試硬件由dell2950主機(裝有SUSE10和MulPath,并配有雙口4GFC_HBA扣卡),IBM的DS4700存儲陣列(陣列上創(chuàng)建RAID5)以及若干光纖線。
如圖4所示,主機到存儲陣列有兩條路徑,分別是從主機HBA扣卡的1口和2口接到存儲陣列的控制器A和控制器B上。存儲陣列上創(chuàng)建有一個用于測試的歸屬于控制器A的LUN。根據(jù)MulPath的路徑選擇策略,路徑1為優(yōu)先選擇路徑。
圖4 路徑切換測試組網(wǎng)圖
每隔10 s拔插一次路徑1(拔一次后間隔10 s再插一次),觀察I/O狀況。測試結(jié)果如表1所示。
表1 測試1的結(jié)果
初始狀態(tài)的時候,路徑1是優(yōu)先選擇的路徑,所以I/O跑在路徑1上;當拔掉路徑1的光纖后,MulPath的路徑狀態(tài)定時刷新發(fā)現(xiàn)路徑1故障,I/O就返回到路徑2上;當路徑1回復(fù)后,MulPath的路徑狀態(tài)定時刷新發(fā)現(xiàn)路徑1恢復(fù),I/O就返回路徑1上。
如圖5所示,主機到存儲陣列有兩條路徑,分別是從主機HBA扣卡的1口和2口全部接到存儲陣列的控制器A。存儲陣列上創(chuàng)建有一個用于測試的歸屬于控制器A的LUN。根據(jù)MulPath的路徑選擇策略,路徑1和路徑2都為優(yōu)先選擇路徑。
圖5 負載均衡測試組網(wǎng)圖
每隔10 s拔插一次路徑1(拔一次后間隔10 s再插一次),觀察I/O狀況。測試結(jié)果如表2所示。
表2 測試2的結(jié)果
本次測試中,設(shè)置I/O測試工具iometer的壓力大概在1000 IOPS,由表2可知,MulPath能較好地實現(xiàn)負載均衡,提高了I/O的性能。
本文中提出的MulPath實現(xiàn)基于HBA卡的驅(qū)動,能在內(nèi)核SCSI體系上很好地實現(xiàn)主機到存儲設(shè)備之間的路徑選擇,提高主機與存儲設(shè)備之間的路徑可靠性與性能,并且有很好的兼容性,能夠兼容多種HBA卡驅(qū)動。能夠自動選擇優(yōu)選的路徑,當前路徑不能使用時,可使用其他冗余路徑,這樣就避免了系統(tǒng)因單點故障造成的業(yè)務(wù)中斷。當有多條優(yōu)選路徑時,在多條路徑上能夠?qū)崿F(xiàn)靜態(tài)及動態(tài)負載均衡,極大地提高了I/O的性能。
[1]姜寧康,時成閣.網(wǎng)絡(luò)存儲導(dǎo)論[M].北京:清華大學出版社,2007.
[2]闞闖,戚瑋瑋.一種新結(jié)構(gòu)的DM_MulPath與動態(tài)負載平衡[J].計算機應(yīng)用,2008,28(2):289-291.
[3]金惠芳,陶利民,張基溫.Linux下多線程技術(shù)分析及應(yīng)用[J].計算機系統(tǒng)應(yīng)用,2003(9):30-32.
[4]董峰,王樹武,譚毓安.冗余存儲路徑在Linux的設(shè)計和實現(xiàn)[J].現(xiàn)代圖書情報技術(shù),2004(5):17-20.
[5]曹強,黃建忠.海量網(wǎng)絡(luò)存儲系統(tǒng)原理與設(shè)計[M].武漢:華中科技大學出版社,2010.
[6]蔡斌,謝長生,忍勁.SCSI子系統(tǒng)中間層多啟動互聯(lián)多路徑I/O的存儲方式的研究[J].小型微型計算機系統(tǒng),2005,26(8):1420-1426.
[7]崔超.淺析存儲虛擬化和數(shù)據(jù)遷移技術(shù)[J].信息與電腦:理論版.2010(6):87-88.
[8]LOBUE M T,MASON H.Surveying today’s most popular storage interfaces[J].IEEE Computer,2002,35(12):48-50.