專(zhuān)利名稱(chēng):一種iSCSI存儲(chǔ)系統(tǒng)的實(shí)現(xiàn)方法
技術(shù)領(lǐng)域:
iSCSI存儲(chǔ)系統(tǒng)的實(shí)現(xiàn)方法屬于存儲(chǔ)區(qū)域網(wǎng)絡(luò)領(lǐng)域,尤其涉及其中的iSCSI存儲(chǔ)技術(shù)領(lǐng)域。
背景技術(shù):
iSCSI(Internet Small Computer Systems Interface)協(xié)議是利用IP網(wǎng)絡(luò)進(jìn)行I/O塊數(shù)據(jù)級(jí)存儲(chǔ)的端到端的傳輸協(xié)議,實(shí)現(xiàn)了在標(biāo)準(zhǔn)的以太網(wǎng)設(shè)備上在應(yīng)用服務(wù)器(啟動(dòng)器)和存儲(chǔ)設(shè)備(iSCSI控制器)之間的數(shù)據(jù)傳輸。iSCSI協(xié)議由互聯(lián)網(wǎng)工程業(yè)務(wù)組(IETF)進(jìn)行編制,對(duì)于光纖通道存儲(chǔ)網(wǎng)絡(luò)(SAN),iSCSI是一種補(bǔ)充,或替代標(biāo)準(zhǔn)。iSCSI的優(yōu)點(diǎn)之一是,使IT用戶(hù)可以利用現(xiàn)有構(gòu)架(TCP/IP網(wǎng)絡(luò))的優(yōu)勢(shì)和專(zhuān)業(yè)技術(shù)。除了提供一種廉價(jià)的替代光纖信道的方案外,iSCSI還在應(yīng)用方面帶來(lái)許多優(yōu)點(diǎn),如存儲(chǔ)合并、業(yè)務(wù)的持續(xù)性、遠(yuǎn)程備份和恢復(fù),以及遠(yuǎn)程數(shù)據(jù)訪(fǎng)問(wèn)。
然而由于以太網(wǎng)絡(luò)帶寬的限制,相比起光纖通道存儲(chǔ),iSCSI存儲(chǔ)系統(tǒng)存在著吞吐量不夠高的缺點(diǎn)。而由于iSCSI存儲(chǔ)系統(tǒng)是廉價(jià)代替品的自身特點(diǎn),iSCSI系統(tǒng)面臨著存儲(chǔ)設(shè)備效率較低以及故障率較高的挑戰(zhàn)。并且存儲(chǔ)和網(wǎng)絡(luò)結(jié)合產(chǎn)生了如設(shè)備動(dòng)態(tài)增減、存儲(chǔ)設(shè)備映射、可選路徑的新的管理任務(wù)。
本發(fā)明實(shí)現(xiàn)了一種新型的高性能和高可用性的iSCSI存儲(chǔ)系統(tǒng),有效的解決了以上所述的問(wèn)題。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種具有高性能和高可用性的iSCSI存儲(chǔ)系統(tǒng)的實(shí)現(xiàn)方法。iSCSI存儲(chǔ)系統(tǒng)的硬件結(jié)構(gòu)包括應(yīng)用服務(wù)器,存儲(chǔ)網(wǎng)絡(luò),iSCSI控制器和存儲(chǔ)設(shè)備以及管理控制臺(tái)。本發(fā)明的重點(diǎn)在于iSCSI存儲(chǔ)系統(tǒng)的iSCSI控制器。iSCSI控制器對(duì)存儲(chǔ)資源進(jìn)行管理,并且對(duì)應(yīng)用服務(wù)器提供存儲(chǔ)服務(wù),是iSCSI存儲(chǔ)系統(tǒng)的關(guān)鍵。在iSCSI控制器上,我們采取了一系列具有創(chuàng)新水平的方法,提高了iSCSI存儲(chǔ)系統(tǒng)的IO吞吐率,提高了其失效容錯(cuò)性(FaultTolerance),改善了其可用性(Availability)。這一系列方法的完整的構(gòu)成了一個(gè)具有高性能、高可用性的iSCSI存儲(chǔ)系統(tǒng)的實(shí)現(xiàn)方法。
本發(fā)明的思路是(1)分別通過(guò)對(duì)iSCSI存儲(chǔ)系統(tǒng)應(yīng)用服務(wù)器和iSCSI控制器上多個(gè)網(wǎng)卡進(jìn)行綁定,實(shí)現(xiàn)網(wǎng)絡(luò)鏈路級(jí)的負(fù)載均衡和失效冗余。
(2)存儲(chǔ)設(shè)備管理模塊中的虛擬設(shè)備標(biāo)識(shí)符算法確保了同一存儲(chǔ)設(shè)備具有固定的設(shè)備標(biāo)識(shí)符,有助于存儲(chǔ)服務(wù)的持續(xù)。比較原有的隨機(jī)設(shè)備標(biāo)識(shí)符算法,本方法具有明顯的優(yōu)勢(shì)。存儲(chǔ)設(shè)備動(dòng)態(tài)增減算法允許在iSCSI存儲(chǔ)服務(wù)不停止的前提下增加新的存儲(chǔ)設(shè)備,或者減少存儲(chǔ)設(shè)備,有效的提高了iSCSI存儲(chǔ)系統(tǒng)的可用性。
(3)存儲(chǔ)設(shè)備映射模塊對(duì)不同來(lái)源、目的的訪(fǎng)問(wèn)請(qǐng)求進(jìn)行控制,確保網(wǎng)絡(luò)存儲(chǔ)中數(shù)據(jù)訪(fǎng)問(wèn)的安全性?;贗P地址的存儲(chǔ)設(shè)備映射(Storage Device Mapping)方法允許對(duì)啟動(dòng)器地址和iSCSI控制器上不同網(wǎng)卡的IP地址進(jìn)行兩層映射,支持掩碼方式,并且提供基于映射規(guī)則的配置接口。相比起傳統(tǒng)的映射方式,本方法比較靈活,配置也較為簡(jiǎn)單。
(4)自適應(yīng)IO負(fù)載控制能夠根據(jù)存儲(chǔ)設(shè)備的能力,自動(dòng)對(duì)IO負(fù)載進(jìn)行控制,有效地保證在存儲(chǔ)設(shè)備性能較低、而IO負(fù)載很高時(shí),iSCSI存儲(chǔ)系統(tǒng)依然能夠平穩(wěn)運(yùn)行。
(5)多IO路徑算法的引入一方面提高了iSCSI存儲(chǔ)系統(tǒng)iSCSI控制器的并發(fā)IO能力,另一方面實(shí)現(xiàn)了通道失效容錯(cuò)。
(6)iSCSI存儲(chǔ)系統(tǒng)的iSCSI控制器以軟件方式實(shí)現(xiàn)了RAID5和RAID6算法,保證磁盤(pán)失敗時(shí)數(shù)據(jù)的完整性,本方法作為硬件RAID卡的取代實(shí)現(xiàn),具有廉價(jià)和可配置性更好等特點(diǎn)。
(7)塊設(shè)備支持模塊在一般塊設(shè)備上實(shí)現(xiàn)了SCSI接口,使得不同的非SCSI接口設(shè)備甚至是Linux卷管理軟件(LVM)和多磁盤(pán)管理模塊(MD)一類(lèi)的虛擬塊設(shè)備都能夠適用到該系統(tǒng)中,擴(kuò)展了iSCSI存儲(chǔ)系統(tǒng)所支持的存儲(chǔ)設(shè)備范圍和iSCSI存儲(chǔ)系統(tǒng)控制器的功能。
本發(fā)明的特征在于,它依次包含以下步驟1.第1步在以下兩個(gè)網(wǎng)絡(luò)小型計(jì)算機(jī)系統(tǒng)接口,也稱(chēng)iSCSI的存儲(chǔ)系統(tǒng)中的任何一個(gè)的iSCSI控制器上,啟動(dòng)存儲(chǔ)服務(wù),把iSCSI協(xié)議即該控制器軟件作為該系統(tǒng)的內(nèi)核模塊加載到它的操作系統(tǒng)中第一種iSCSI存儲(chǔ)系統(tǒng)包括多個(gè)網(wǎng)絡(luò)應(yīng)用服務(wù)器,也稱(chēng)啟動(dòng)器;一個(gè)管理控制臺(tái);通過(guò)TCP/IP網(wǎng)絡(luò)協(xié)議分別和上述各啟動(dòng)器和一個(gè)管理控制臺(tái)通訊的一臺(tái)千兆網(wǎng)交換機(jī);根據(jù)iSCSI協(xié)議和上述千兆網(wǎng)交換通訊的iSCSI控制器;在Linux操作系統(tǒng)下并根據(jù)iSCSI協(xié)議與上述iSCSI控制器通訊的多臺(tái)存儲(chǔ)設(shè)備;第二種iSCSI存儲(chǔ)系統(tǒng)包括多個(gè)網(wǎng)絡(luò)應(yīng)用服務(wù)器,也稱(chēng)啟動(dòng)器;一個(gè)管理控制臺(tái);一臺(tái)千兆網(wǎng)交換機(jī);一臺(tái)iSCSI控制器;多臺(tái)存儲(chǔ)設(shè)備;各啟動(dòng)器和iSCSI控制器之間直線(xiàn)連接,千兆網(wǎng)交換機(jī)和各啟動(dòng)器、管理控制臺(tái)、iSCSI控制器之間經(jīng)TCP/IP網(wǎng)絡(luò)協(xié)議通訊,iSCSI控制臺(tái)和各存儲(chǔ)設(shè)備之間按照iSCSI協(xié)議在Linux操作系統(tǒng)下運(yùn)行;上述iSCSI協(xié)議包含上層由網(wǎng)關(guān)綁定模塊及前端目標(biāo)驅(qū)動(dòng)即FETD模塊有一次連接而成;中間層由與上述前端目標(biāo)器驅(qū)動(dòng)模塊依次相連的IO負(fù)載控制模塊和多IO路徑模塊組成;下層,即物理層有一個(gè)和多IO路徑模塊相連的設(shè)備管理模塊;
所述網(wǎng)卡綁定模塊,它是一種鏈路聚合式模塊,即它使多塊網(wǎng)卡虛擬為一塊網(wǎng)卡,都具有相同的IP地址;該模塊在Linux操作系統(tǒng)下,針對(duì)不同需要,配備了符合IEEE 802.3ad標(biāo)準(zhǔn)的多網(wǎng)卡輪轉(zhuǎn)和熱備份兩種模式;所述前端目標(biāo)器驅(qū)動(dòng)模塊,它是公知的;所述存儲(chǔ)設(shè)備管理模塊,在啟動(dòng)器啟動(dòng)iSCSI控制器存儲(chǔ)服務(wù)時(shí),它掃描連接在iSCSI控制器上的各儲(chǔ)備設(shè)備,提供固定的虛擬設(shè)備標(biāo)識(shí)符;在熱插拔存儲(chǔ)設(shè)備時(shí),啟動(dòng)對(duì)存儲(chǔ)設(shè)備進(jìn)行增減的操作;它在iSCSI控制器上設(shè)定一個(gè)線(xiàn)性組合形式且用以標(biāo)識(shí)存儲(chǔ)設(shè)備編號(hào)的虛擬目標(biāo)標(biāo)識(shí)符數(shù)組,依次內(nèi)含該設(shè)備的主機(jī)適配器號(hào),即host;通道號(hào),即channel;目標(biāo)號(hào),即target邏輯單元號(hào),即lun;該模塊用上述四個(gè)變量確定一個(gè)存儲(chǔ)設(shè)備的位置;同時(shí),iSCSI存儲(chǔ)系統(tǒng)的iSCSI控制器上維護(hù)著一個(gè)存儲(chǔ)設(shè)備列表以及表示存儲(chǔ)設(shè)備被掃描次數(shù)的數(shù)組;它為iSCSI控制臺(tái)提供了一個(gè)寫(xiě)入命令以使該模塊重新對(duì)該存儲(chǔ)設(shè)備進(jìn)行掃描的PROC接口;它還為iSCSI控制器提供了動(dòng)態(tài)增減存儲(chǔ)設(shè)備的另一個(gè)PROC接口;在下述情況下iSCSI控制器啟動(dòng)掃描存儲(chǔ)設(shè)備的操作iSCSI存儲(chǔ)系統(tǒng)的iSCSI控制器端加載控制軟件時(shí);iSCSI系統(tǒng)在減少或增加了存儲(chǔ)設(shè)備后,存儲(chǔ)管理員向iSCSI控制器發(fā)出重掃描的命令;所述存儲(chǔ)設(shè)備模塊依次按以下步驟實(shí)施存儲(chǔ)設(shè)備掃描流程初始化模塊;有更多的host號(hào)否,若沒(méi)有,便返回;否則,執(zhí)行下一步驟;Host中還有更多的設(shè)備否,若沒(méi)有,便返回初始化模塊下面的一步;否則,執(zhí)行下一步驟;設(shè)備的類(lèi)型是否為存儲(chǔ)磁盤(pán),若不是,便返回初始化模塊下面的一步;否則,執(zhí)行下一步驟;獲取設(shè)備的信息;構(gòu)造設(shè)備信息,插入設(shè)備到表中;可用設(shè)備增1,返回初始化模塊下面的一步;所述存儲(chǔ)設(shè)備管理模塊依次按以下步驟實(shí)施存儲(chǔ)設(shè)備刪除流程管理員指定要?jiǎng)h除設(shè)備的標(biāo)識(shí)符;從設(shè)備列表中得到該設(shè)備的信息;設(shè)置該設(shè)備的刪除標(biāo)志;釋放該設(shè)備所有的未執(zhí)行命令;設(shè)置該設(shè)備的引用計(jì)數(shù)為0,引用次數(shù)是指存儲(chǔ)管理設(shè)定的該設(shè)備的被掃描次數(shù);返回;
所述存儲(chǔ)管理模塊按以下步驟實(shí)施存儲(chǔ)設(shè)備增加流程管理員指定要增加的設(shè)備的標(biāo)識(shí)符;設(shè)置該設(shè)備的增加標(biāo)志;把該設(shè)備的標(biāo)識(shí)符加入到存儲(chǔ)設(shè)備列表中;設(shè)置該設(shè)備的引用計(jì)數(shù)為0;自適應(yīng)負(fù)載控制算法程序,它自動(dòng)適應(yīng)存儲(chǔ)設(shè)備的能力,控制低端存儲(chǔ)設(shè)備上的IO負(fù)載;它在上述表示一個(gè)存儲(chǔ)設(shè)備位置的數(shù)據(jù)組中,分別設(shè)置表示該設(shè)備同時(shí)所能處理的SCSI命令隊(duì)列的長(zhǎng)度的域,同時(shí)設(shè)置表示目前正處于SCSI的執(zhí)行隊(duì)列中的SCSI命令的個(gè)數(shù)的域,且在任何時(shí)候后者都要小于前者;同時(shí),在中間層中,設(shè)置一個(gè)ST_HOLD_ON狀態(tài),它表示所有到達(dá)中間層且準(zhǔn)備完畢以便立即執(zhí)行但因目前正處于SCSI的執(zhí)行隊(duì)列中的SCSI命令的個(gè)數(shù)已到達(dá)該設(shè)備同時(shí)所能處理的SCSI命令隊(duì)列長(zhǎng)度的闕值而未能得到執(zhí)行的命令的狀態(tài);所述實(shí)施負(fù)載自適應(yīng)算法的程序依次含有以下程序模塊從命令隊(duì)列中得到一個(gè)需處理的SCSI命令;判別該命令是否處于ST_HOLD_ON狀態(tài),若否,則執(zhí)行下一步驟;判斷該命令是否是寫(xiě)命令,若為寫(xiě)命令且尚未接收到存儲(chǔ)數(shù)據(jù),若是,則把該命令設(shè)置成目前正處于SCSI執(zhí)行隊(duì)列中的一個(gè)正待執(zhí)行的命令的狀態(tài),執(zhí)行完畢,則返回,若否,則設(shè)置成ST_HOLD_ON狀態(tài),然后判斷目標(biāo)存儲(chǔ)設(shè)備的同時(shí)所能處理的SCSI命令隊(duì)列長(zhǎng)度是否大于目前正處于SCSI的執(zhí)行隊(duì)列中的SCSI命令的個(gè)數(shù),若否,則返回;若是,則執(zhí)行SCSI命令并把存儲(chǔ)設(shè)備的目前正處于SCSI執(zhí)行隊(duì)列中的SCSI命令的個(gè)數(shù)增1,要處理的SCSI命令的個(gè)數(shù)減1,返回;若從命令隊(duì)列中得到的要處理的SCSI命令處于ST_HOLD_ON狀態(tài),則維持原狀態(tài)等待下一輪處理,執(zhí)行下一步驟;該模塊再?gòu)拿铌?duì)列中得到下一步要處理的SCSI命令按以上步驟處理;若命令沒(méi)有超時(shí),則循環(huán)反復(fù),直到處理完命令隊(duì)列中的有要處理的SCSI命令為止;所述的多IO路徑模塊,它對(duì)不同的存儲(chǔ)隊(duì)列通道進(jìn)行IO請(qǐng)求控制,實(shí)現(xiàn)輪轉(zhuǎn)或熱備份配置,即充分利用具有雙控功能磁盤(pán)陣列的雙通道功能,實(shí)現(xiàn)多個(gè)通道之間的冗余和提高;SCSI存儲(chǔ)系統(tǒng)異步IO能力;設(shè)定各主機(jī)適配器的最大通道數(shù),記錄多IO路徑模塊中的SCSI適配器所對(duì)應(yīng)的主機(jī)適配器號(hào);對(duì)于雙控功能磁盤(pán)陣列而言,一個(gè)主機(jī)適配號(hào)所表示的SCSI適配器上的存儲(chǔ)設(shè)備的相關(guān)信息記錄在存儲(chǔ)設(shè)備列表中,另一個(gè)則保存在多IO路徑模塊定義的結(jié)構(gòu)中,同時(shí)記錄兩個(gè)通道的狀態(tài)域;該模塊提供相應(yīng)的PROC命令接口;在中間層用狀態(tài)ST_PATH_FAIL表達(dá)一個(gè)SCSI命令在現(xiàn)在的激活通道上執(zhí)行失敗,一旦該模塊探測(cè)到該狀態(tài),就把這個(gè)命令的狀態(tài)設(shè)置成ST_PATH_FAIL,并再次放入隊(duì)列中,同時(shí)選擇另外一個(gè)通道執(zhí)行;多IO路徑模塊對(duì)SCSI命令的處理流程如下先判斷收到的SCSI命令是否為寫(xiě)命令;若不是,則直接把該命令放入分發(fā)命令隊(duì)列中;否則,為寫(xiě)命令分配數(shù)據(jù)緩沖區(qū)并把該命令放入等待隊(duì)列,等著數(shù)據(jù)到達(dá);若數(shù)據(jù)到達(dá),則從等待隊(duì)列中取出該寫(xiě)命令,放入分發(fā)命令隊(duì)列;在確定的配置模式下,對(duì)于分發(fā)命令隊(duì)列中的命令進(jìn)行判斷是否有可選擇的IO路徑,若沒(méi)有,則推出;若有,則根據(jù)設(shè)定策略選出一條可用的IO路徑,并把命令發(fā)送到該路徑再等待執(zhí)行結(jié)果,若執(zhí)行正確則返回,否則,把該命令放入重試隊(duì)列中,進(jìn)行下一輪的路徑選擇。
2.在物理層,還有一個(gè)軟件RAID模塊與所述的多IO路徑模塊相連所述軟件RAID模塊,它把針對(duì)RAID存儲(chǔ)隊(duì)列的虛擬SCSI命令根據(jù)不同的RAID算法轉(zhuǎn)化為物理SCSI命令,并且把物理SCSI命令在各個(gè)單獨(dú)物理磁盤(pán)上的執(zhí)行結(jié)果合并或?qū)μ摂MSCSI命令的響應(yīng)結(jié)果;使RAID模塊的全局變量維護(hù)下述兩個(gè)命令隊(duì)列虛擬SCSI命令隊(duì)列,它必須至少包含虛擬SCSI命令的狀態(tài)和虛擬SCSI命令的標(biāo)識(shí);物理SCSI命令隊(duì)列,它至少必須包括如下字段物理SCSI命令的狀態(tài),物理SCSI命令所對(duì)應(yīng)的虛擬命令,以及該物理SCSI命令的序號(hào);所述RAID模塊依次含有以下步驟根據(jù)虛擬SCSI命令的邏輯地址信息和其他參數(shù),把一條虛擬SCSI命令分解成物理SCSI命令并把物理SCSI命令組成隊(duì)列,同時(shí)維護(hù)虛擬SCSI和物理SCSI命令之間的關(guān)系和狀態(tài);由SCSI層對(duì)每個(gè)物理SCSI命令進(jìn)行操作;每次有一個(gè)物理SCSI命令返回后,通過(guò)該命令檢測(cè)原始命令隊(duì)列,若發(fā)現(xiàn)對(duì)應(yīng)的所有物理SCSI命令已經(jīng)處理完畢,通過(guò)分析各個(gè)物理SCSI命令的響應(yīng)結(jié)果形成一個(gè)對(duì)虛擬SCSI命令的響應(yīng)結(jié)果。
3.在物理層,還有一個(gè)塊設(shè)備支持模塊與上述多IO路徑模塊相連所述塊設(shè)備支持模塊,它使iSCSI存儲(chǔ)系統(tǒng)的啟動(dòng)器能連接多種非SCSI設(shè)備,包括虛擬塊設(shè)備,它是通過(guò)把SCSI命令轉(zhuǎn)化到塊IO請(qǐng)求來(lái)實(shí)現(xiàn)的;所述塊設(shè)備模塊依次含有以下執(zhí)行步驟在從中間層接收一個(gè)SCSI命令后,判別該命令的目標(biāo)是否為SCSI設(shè)備,若是,則把該命令發(fā)送給SCSI設(shè)備,返回;若否,則執(zhí)行下一個(gè)步驟;
判別該命令是否為查詢(xún)類(lèi)命令,若是,則根據(jù)配置信息返回響應(yīng),再返回;若否,便執(zhí)行下一步驟;判斷該命令是否為讀命令,若是,則分析出LBA和數(shù)據(jù)長(zhǎng)度,再根據(jù)LBA地址算出虛擬設(shè)備中對(duì)應(yīng)的偏移地址;再把偏移地址、數(shù)據(jù)長(zhǎng)度和數(shù)據(jù)緩沖區(qū)地址傳送給塊設(shè)備讀取數(shù)據(jù);等待塊設(shè)備把數(shù)據(jù)寫(xiě)入到數(shù)據(jù)緩沖區(qū)后,塊設(shè)備支持模塊設(shè)置SCSI請(qǐng)求的狀態(tài)域,返回SCSI中間層;若是寫(xiě)命令,則分析出LBA和數(shù)據(jù)長(zhǎng)度后,再把啟動(dòng)器端發(fā)送過(guò)來(lái)的數(shù)據(jù)存放到數(shù)據(jù)緩沖區(qū)中;再根據(jù)LBA地址算出虛擬設(shè)備中對(duì)應(yīng)的偏移地址;把偏移地址、數(shù)據(jù)長(zhǎng)度和數(shù)據(jù)緩沖區(qū)地址傳送給塊設(shè)備對(duì)塊設(shè)備寫(xiě)入SCSI請(qǐng)求的數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù);等待塊設(shè)備層操作成功,塊設(shè)備支持模塊設(shè)置SCSI請(qǐng)求的狀態(tài)域并把它返回SCSI中間層。
4.在中間層中,所述前端目標(biāo)驅(qū)動(dòng)器模塊和IO負(fù)載控制模塊間有一個(gè)存儲(chǔ)設(shè)備映射模塊它提供存儲(chǔ)設(shè)備位置、iSCSI控制器IP地址和啟動(dòng)器IP地址三者的映射關(guān)系,控制啟動(dòng)器對(duì)存儲(chǔ)系統(tǒng)中存儲(chǔ)設(shè)備訪(fǎng)問(wèn)的權(quán)限,據(jù)此,訪(fǎng)問(wèn)權(quán)限分為三種級(jí)別完全訪(fǎng)問(wèn)、只讀訪(fǎng)問(wèn)和禁止訪(fǎng)問(wèn);它對(duì)存儲(chǔ)管理員改變?cè)O(shè)定如下格式的權(quán)限規(guī)劃[源IP地址][源地址掩碼][目的IP地址][Target ID][訪(fǎng)問(wèn)權(quán)限];存儲(chǔ)設(shè)備映射模塊向存儲(chǔ)管理員以PROC形式提供寫(xiě)入或查看規(guī)劃、啟動(dòng)或停止存儲(chǔ)設(shè)備映射模塊的接口;存儲(chǔ)設(shè)備映射模塊把向PROC接口寫(xiě)入的規(guī)劃解析成以上述鏈表形式組織的規(guī)劃,該模塊通過(guò)查詢(xún)這個(gè)鏈表決定一個(gè)啟動(dòng)器對(duì)某個(gè)存儲(chǔ)設(shè)備訪(fǎng)問(wèn)的權(quán)限;所述存儲(chǔ)設(shè)備有映射模塊依次按以下三個(gè)階段實(shí)現(xiàn)映射流程設(shè)備發(fā)現(xiàn)階段,它依次含有以下步驟接收啟動(dòng)器的命令,判斷是否為設(shè)備發(fā)現(xiàn)命令,若否,則返回;若是,則執(zhí)行下一步驟;判斷是否還有存儲(chǔ)設(shè)備,若否,則返回;若有,則執(zhí)行下一步驟;根據(jù)以上規(guī)則判斷啟動(dòng)器對(duì)存儲(chǔ)設(shè)備所標(biāo)識(shí)的權(quán)限;根據(jù)權(quán)限判斷存儲(chǔ)設(shè)備對(duì)啟動(dòng)器是否可見(jiàn),若可見(jiàn),則把設(shè)備標(biāo)識(shí)符填入后向啟動(dòng)器返回存儲(chǔ)設(shè)備列表;否則,返回“是否還有存儲(chǔ)設(shè)備”步驟;參數(shù)協(xié)商階段,它依次含有以下步驟存儲(chǔ)設(shè)備映射模塊從啟動(dòng)器取得連接的客戶(hù)端和服務(wù)器的地址;存儲(chǔ)設(shè)備映射模塊判斷該存儲(chǔ)設(shè)備是否為一個(gè)對(duì)啟動(dòng)器禁止的存儲(chǔ)設(shè)備,若為禁止的存儲(chǔ)設(shè)備,則主動(dòng)中斷該啟動(dòng)器到iSCSI控制器的網(wǎng)絡(luò)連接;否則,進(jìn)行下一階段IO操作;IO請(qǐng)求階段,它依次含有以下步驟
判斷SCSI命令是否為寫(xiě)命令。若否轉(zhuǎn)到“對(duì)于讀命令”;對(duì)于寫(xiě)命令,先分配緩沖區(qū),并且根據(jù)規(guī)則設(shè)置這個(gè)命令的權(quán)限,最后把命令放入等待隊(duì)列;接收到數(shù)據(jù)后,把相應(yīng)的SCSI命令從等待隊(duì)列中取出;檢測(cè)命令的權(quán)限,判別該命令可否被執(zhí)行。若是,則把該命令放入分發(fā)隊(duì)列;若否,丟棄該命令并構(gòu)造SCSI響應(yīng)向啟動(dòng)器報(bào)告錯(cuò)誤;對(duì)于讀命令,直接根據(jù)規(guī)則設(shè)置這個(gè)命令的權(quán)限;檢測(cè)命令的權(quán)限,判別該命令可否被執(zhí)行。若是,則把該命令放入分發(fā)隊(duì)列;若否,丟棄該命令并構(gòu)造SCSI響應(yīng)向啟動(dòng)器報(bào)告錯(cuò)誤。
本發(fā)明在清華大學(xué)計(jì)算機(jī)系高性能計(jì)算技術(shù)研究所進(jìn)行過(guò)測(cè)試并在實(shí)際生產(chǎn)環(huán)境中加以應(yīng)用。結(jié)果表明,新型高性能高可用性iSCSI存儲(chǔ)系統(tǒng)有效的提高了iSCSI系統(tǒng)的IO吞吐率,并在系統(tǒng)的可用性、失效容錯(cuò)性上具備較大的優(yōu)勢(shì)。
圖1iSCSI示意圖。
圖2iSCSI存儲(chǔ)系統(tǒng)的硬件結(jié)構(gòu)圖,2a.交換機(jī)連接方式,2b.直連線(xiàn)連接方式。
圖3iSCSI存儲(chǔ)系統(tǒng)的軟件結(jié)構(gòu)和子模塊關(guān)系圖。
圖4多網(wǎng)卡綁定示意圖,4a.交換機(jī)連接方式,利用冗余網(wǎng)絡(luò)鏈路實(shí)現(xiàn)高可用,4b.直接線(xiàn)方式,兩條通路提供>1.5倍帶寬,4c.直接線(xiàn)方式,利用冗余網(wǎng)絡(luò)鏈路實(shí)現(xiàn)高可用。
圖5存儲(chǔ)設(shè)備映射示意圖。
圖6多IO路徑模塊示意圖。
圖7設(shè)備管理模塊流程圖,7a.設(shè)備掃描流程,7b.刪除設(shè)備流程。
圖8設(shè)備映射模塊流程圖,8a.在設(shè)備發(fā)現(xiàn)階段,8b.在參數(shù)協(xié)商階段,8c.在IO請(qǐng)求階段。
圖9IO負(fù)載均衡算法流程圖。
圖10多IO路徑模塊流程圖。
圖11塊設(shè)備支持模塊流程圖。
具體實(shí)施例方式iSCSI協(xié)議是在標(biāo)準(zhǔn)的以太網(wǎng)設(shè)備上進(jìn)行I/O塊數(shù)據(jù)級(jí)存儲(chǔ)的端到端的傳輸協(xié)議,如圖1所示。
本發(fā)明即對(duì)iSCSI網(wǎng)絡(luò)存儲(chǔ)系統(tǒng)的實(shí)現(xiàn)方法。在這個(gè)iSCSI網(wǎng)絡(luò)存儲(chǔ)系統(tǒng)中,前端應(yīng)用服務(wù)器通過(guò)千兆網(wǎng)交換機(jī)或者通過(guò)千兆直連線(xiàn)連接到iSCSI存儲(chǔ)系統(tǒng)iSCSI控制器上,它們之間通過(guò)TCP/IP協(xié)議進(jìn)行數(shù)據(jù)傳輸,構(gòu)成iSCSI存儲(chǔ)網(wǎng)絡(luò)。其硬件體系結(jié)構(gòu)如圖2所示。
其中,iSCSI存儲(chǔ)系統(tǒng)的iSCSI控制器安裝有6塊千兆網(wǎng)網(wǎng)卡,向外提供8個(gè)千兆以太網(wǎng)口的并行數(shù)據(jù)流,總帶寬達(dá)到6×1Gb。另外iSCSI控制器上可以連接多個(gè)存儲(chǔ)磁盤(pán)陣列,通過(guò)IP網(wǎng)絡(luò)向以應(yīng)用服務(wù)器提供存儲(chǔ)資源服務(wù)。
在iSCSI存儲(chǔ)系統(tǒng)的iSCSI控制器上,iSCSI控制器軟件作為操作系統(tǒng)內(nèi)核模塊在啟動(dòng)存儲(chǔ)服務(wù)時(shí)被加載到操作系統(tǒng)內(nèi)核中。iSCSI控制器模塊負(fù)責(zé)iSCSI協(xié)議和SCSI協(xié)議之間的協(xié)議轉(zhuǎn)換工作,并實(shí)現(xiàn)了對(duì)存儲(chǔ)設(shè)備的控制管理和對(duì)應(yīng)用服務(wù)器的請(qǐng)求進(jìn)行管理等任務(wù)。其中,iSCSI控制器軟件從軟件體系結(jié)構(gòu)上可以分為兩部分前端驅(qū)動(dòng)(FETD)和SCSI中間層(STML),大體上說(shuō)前者實(shí)現(xiàn)了iSCSI協(xié)議并負(fù)責(zé)iSCSI協(xié)議和SCSI協(xié)議之間的轉(zhuǎn)換,后者實(shí)現(xiàn)了一個(gè)模擬SCSI目標(biāo)器,負(fù)責(zé)對(duì)SCSI命令進(jìn)行響應(yīng)。本發(fā)明所提出的一系列方法均基于iSCSI控制器軟件。
本發(fā)明所提出的一系列方法在實(shí)現(xiàn)中可以劃分成單獨(dú)的子功能模塊,各個(gè)功能模塊之間的關(guān)系見(jiàn)圖3。各子功能模塊的類(lèi)別及簡(jiǎn)要功能見(jiàn)下表表1模塊列表
下面對(duì)各個(gè)模塊作詳細(xì)描述。
存儲(chǔ)設(shè)備管理模塊在iSCSI存儲(chǔ)系統(tǒng)中,啟動(dòng)器通過(guò)指定設(shè)備標(biāo)識(shí)符連接到iSCS控制器上某個(gè)特定的存儲(chǔ)設(shè)備。設(shè)備標(biāo)識(shí)符即一個(gè)存儲(chǔ)控制器上某個(gè)存儲(chǔ)設(shè)備的標(biāo)識(shí),每個(gè)存儲(chǔ)設(shè)備都對(duì)應(yīng)著一個(gè)設(shè)備標(biāo)識(shí)符。在常見(jiàn)的控制器模塊中,設(shè)備標(biāo)識(shí)符是按照設(shè)備的發(fā)現(xiàn)順序賦值的,如第一個(gè)存儲(chǔ)設(shè)備的標(biāo)識(shí)符是0,以此類(lèi)推。這樣做的缺點(diǎn)是,每次iSCSI控制器啟動(dòng)時(shí)設(shè)備的發(fā)現(xiàn)順序可能是不一樣的,而且當(dāng)一個(gè)新的存儲(chǔ)設(shè)備添加到iSCSI控制器后,原來(lái)的設(shè)備標(biāo)識(shí)符將被打亂,因此在不同的時(shí)間同一個(gè)設(shè)備標(biāo)識(shí)符可能對(duì)應(yīng)著不同的存儲(chǔ)設(shè)備。
在Linux中,SCSI層驅(qū)動(dòng)用host(主機(jī)適配器號(hào))、channel(通道號(hào))、target(目標(biāo)號(hào))和lun(邏輯單元號(hào))四個(gè)變量來(lái)確定一個(gè)SCSI設(shè)備的位置,該位置是由硬件連接方式?jīng)Q定的。
我們?cè)趇SCSI存儲(chǔ)系統(tǒng)的控制器上實(shí)現(xiàn)了虛擬的目標(biāo)標(biāo)識(shí)符虛擬目標(biāo)標(biāo)識(shí)符由一個(gè)13位的整數(shù)表示。其中,bit 12~bit 10表示設(shè)備的host,bit 9~bit 8表示設(shè)備的channel,bit 7~bit 4表示設(shè)備的target,最后4個(gè)bit表示設(shè)備的lun。
host、channel、target和lun通過(guò)線(xiàn)形組合形成了虛擬的設(shè)備標(biāo)識(shí)符并且保證了設(shè)備的(host,channel,target,lun)到設(shè)備標(biāo)識(shí)符的一一對(duì)應(yīng)關(guān)系。這樣做的好處在于維護(hù)了存儲(chǔ)服務(wù)的持續(xù)性,當(dāng)一臺(tái)iSCSI控制器節(jié)點(diǎn)重新啟動(dòng)后,該算法能夠保證這個(gè)磁盤(pán)的虛擬設(shè)備標(biāo)識(shí)符的一致性,應(yīng)用服務(wù)器無(wú)需再重新配置就能夠立即投入使用。
iSCSI存儲(chǔ)系統(tǒng)的控制器節(jié)點(diǎn)上維護(hù)著一個(gè)存儲(chǔ)設(shè)備的列表ext_scsi_device以及表示存儲(chǔ)設(shè)備被掃描次數(shù)的數(shù)組ext_target_valid_flag。如stml_device*ext_scsi_device[MAX_HOSTS][MAX_CHANNELS][MAX_TARGETS][MAX_LUNS];intext_target_valid_flag[MAX_HOSTS][MAX_CHANNELS][MAX_TARGETS][MAX_LUNS];int ext_scan_count;其中,Max_HOSTS,MAX_CHANNELS,MAX_TARGETS,MAX_LUNS分別表示host,channel,target,lun的最大值,它們分別是8,4,16,16。stml_device是iSCSI存儲(chǔ)系統(tǒng)中定義的表明一個(gè)存儲(chǔ)設(shè)備的結(jié)構(gòu),ext_scsi_device是stml_device指針的數(shù)組。則ext_scsi_device[i][j][k][l]表示的是位于(i,j,k,l)處的存儲(chǔ)設(shè)備,而ext_target_valid_flag[i][j][k][l]則相應(yīng)的指出該設(shè)備被掃描的次數(shù),ext_scan_count是iSCSI控制器掃描存儲(chǔ)設(shè)備的次數(shù)。
當(dāng)iSCSI存儲(chǔ)系統(tǒng)初始化時(shí),ext_scsi_device各項(xiàng)為空且ext_target_valid_flag各項(xiàng)和ext_scan_count均為0。iSCSI存儲(chǔ)系統(tǒng)的設(shè)備管理模塊通過(guò)掃描SCSI的scsi_hostlist列表獲取存儲(chǔ)設(shè)備的信息。每次掃描存儲(chǔ)設(shè)備列表時(shí),ext_scan_count自增1,且每掃描到一個(gè)有效的存儲(chǔ)設(shè)備時(shí)就構(gòu)造一個(gè)stml_device并把ext_scsi_device相應(yīng)的項(xiàng)指向它,最后把ext_target_valid_flag相應(yīng)的項(xiàng)賦值成ext_scan_count。這樣,通過(guò)比較ext_target_valid_flag相應(yīng)的項(xiàng)和ext_scan_count就可以判斷一個(gè)存儲(chǔ)設(shè)備是否有效。如果ext_target_valid_flag不等于ext_scan_count,則說(shuō)明在最后一次掃描中并未發(fā)現(xiàn)該設(shè)備,即該設(shè)備是無(wú)效的。
iSCSI控制器模塊提供了PROC接口,通過(guò)向PROC接口寫(xiě)入命令可以讓設(shè)備管理模塊重新對(duì)存儲(chǔ)設(shè)備進(jìn)行掃描。利用上述的方法,iSCSI控制器模塊對(duì)設(shè)備重新進(jìn)行掃描時(shí)并不影響現(xiàn)有有效設(shè)備的正常工作,這意味著iSCSI控制器可以在提供存儲(chǔ)服務(wù)的同時(shí)對(duì)設(shè)備進(jìn)行掃描。
iSCSI存儲(chǔ)系統(tǒng)掃描存儲(chǔ)設(shè)備的時(shí)機(jī)是iSCSI存儲(chǔ)系統(tǒng)的iSCSI控制器被加載時(shí);iSCSI存儲(chǔ)系統(tǒng)增加了存儲(chǔ)設(shè)備,存儲(chǔ)管理員向iSCSI控制器發(fā)出重新掃描的命令;iSCSI存儲(chǔ)系統(tǒng)減少了存儲(chǔ)設(shè)備,存儲(chǔ)管理員向iSCSI控制器發(fā)出重新掃描的命令。
而Linux的SCSI系統(tǒng)提供了動(dòng)態(tài)增減SCSI設(shè)備的PROC接口,刪除一個(gè)SCSI設(shè)備echo″scsi remove-single-device a b c d″>/proc/scsi/scsi類(lèi)似,增加一個(gè)SCSI設(shè)備echo″scsi add-single-device a b c d″>/proc/scsi/scsi其中a是主機(jī)適配器號(hào)(從0開(kāi)始)b是通道號(hào)(從0開(kāi)始)c是目標(biāo)號(hào)(從0開(kāi)始)d是邏輯單元號(hào)(從0開(kāi)始)通過(guò)這個(gè)PROC接口,存儲(chǔ)管理員可以動(dòng)態(tài)更新Linux SCSI層的設(shè)備列表。iSCSI存儲(chǔ)系統(tǒng)的設(shè)備管理模塊和Linux的動(dòng)態(tài)更新機(jī)制配合使用就可以實(shí)現(xiàn)iSCSI存儲(chǔ)系統(tǒng)的存儲(chǔ)設(shè)備動(dòng)態(tài)增減的功能。
當(dāng)存儲(chǔ)管理員向iSCSI存儲(chǔ)系統(tǒng)控制器添加新的存儲(chǔ)磁盤(pán)后,存儲(chǔ)管理員首先用add-single-device向SCSI增加設(shè)備并向控制器發(fā)起重新掃描存儲(chǔ)設(shè)備的命令,iSCSI控制器將對(duì)連接在上面的存儲(chǔ)設(shè)備進(jìn)行掃描并發(fā)現(xiàn)新磁盤(pán),添加到存儲(chǔ)設(shè)備列表中。反之,當(dāng)存儲(chǔ)管理員需要?jiǎng)h減一個(gè)存儲(chǔ)設(shè)備時(shí),先用remove-single-deivce從SCSI系統(tǒng)中刪除設(shè)備,然后讓iSCSI控制器重新掃描存儲(chǔ)設(shè)備,在iSCSI存儲(chǔ)系統(tǒng)控制器的設(shè)備列表中,被刪除的存儲(chǔ)設(shè)備將不再有效。
顯然,正在使用的存儲(chǔ)設(shè)備從邏輯上是不可以被刪除的。在Linux系統(tǒng)中,Scsi_Device用于描述一個(gè)SCSI設(shè)備,Scsi_Device有一個(gè)表示存儲(chǔ)設(shè)備引用計(jì)數(shù)的access_count域。這樣,當(dāng)一個(gè)磁盤(pán)被前端使用時(shí),我們把該磁盤(pán)的access_count增1,反之a(chǎn)ccess_count減1。在remove-single-device的時(shí)候SCSI系統(tǒng)會(huì)首先判斷一個(gè)存儲(chǔ)設(shè)備的access_count是否為0,對(duì)于access_count非0的存儲(chǔ)設(shè)備,SCSI系統(tǒng)不會(huì)把它們刪除掉。引用計(jì)數(shù)保證了正在使用的存儲(chǔ)設(shè)備不會(huì)因?yàn)檎`刪而導(dǎo)致存儲(chǔ)服務(wù)的異常。
由此,實(shí)際上實(shí)現(xiàn)了在不停止服務(wù)前提下的存儲(chǔ)設(shè)備動(dòng)態(tài)發(fā)現(xiàn),存儲(chǔ)設(shè)備動(dòng)態(tài)增減,是整個(gè)iSCSI存儲(chǔ)系統(tǒng)滿(mǎn)足7×24小時(shí)高速的在線(xiàn)訪(fǎng)問(wèn)需求與業(yè)務(wù)的可持續(xù)性的重要保障。
存儲(chǔ)設(shè)備管理模塊的存儲(chǔ)設(shè)備掃描和刪除一個(gè)存儲(chǔ)設(shè)備的流程如圖7所示。
網(wǎng)卡綁定模塊將多塊網(wǎng)卡虛擬成為一塊網(wǎng)卡,使其具有相同的IP地址,來(lái)實(shí)現(xiàn)提升主機(jī)的網(wǎng)絡(luò)吞吐量或者是提高可用性,這種技術(shù)被稱(chēng)作鏈路聚合(Channel bonding)。我們?cè)贚inux下自主實(shí)現(xiàn)了符合IEEE 802.3ad標(biāo)準(zhǔn)的多網(wǎng)卡輪轉(zhuǎn)(Round-Robin)和熱備份(Active-Standby)兩種發(fā)送模式,提高了應(yīng)用服務(wù)器和iSCSI控制器的可用性并提供網(wǎng)卡的負(fù)載均衡從而提高了效率。如圖4所示。
iSCSI存儲(chǔ)系統(tǒng)綁定模塊在IEEE 802.3ad標(biāo)準(zhǔn)框架下支持以下兩種傳輸模式1.輪轉(zhuǎn)模式(自主實(shí)現(xiàn))基于網(wǎng)卡的順序,依次輪轉(zhuǎn)通過(guò)不同網(wǎng)卡發(fā)送數(shù)據(jù);從而實(shí)現(xiàn)大于一個(gè)單一鏈路的發(fā)送性能。
2.熱備份模式確保在同一時(shí)刻僅僅通過(guò)一個(gè)網(wǎng)卡發(fā)送數(shù)據(jù),另外一個(gè)作為該激活卡的熱備份,在激活卡出現(xiàn)故障時(shí)數(shù)據(jù)流馬上切換到熱備份卡。
針對(duì)不同的應(yīng)用需求,我們?cè)谳^大規(guī)模的存儲(chǔ)網(wǎng)絡(luò)中使用以太網(wǎng)交換機(jī),以達(dá)到較高可用性和較好的可擴(kuò)展性,而由于以太網(wǎng)交換機(jī)的功能限制(多數(shù)主流交換機(jī)對(duì)IEEE 802.3ad協(xié)議支持的不完備),只能實(shí)現(xiàn)發(fā)送的負(fù)載均衡(Transmit Load Balancing),無(wú)法實(shí)現(xiàn)接收負(fù)載均衡(Receive Load Balancing)。而在需要較高性能的小規(guī)模應(yīng)用中,我們采用了千兆交叉線(xiàn)直連的結(jié)構(gòu),利用輪轉(zhuǎn)模式的綁定模塊實(shí)現(xiàn)了接收和發(fā)送的負(fù)載均衡,從而達(dá)到了很高的網(wǎng)絡(luò)性能測(cè)試中,在兩條千兆連接的直連拓?fù)湎拢琓CP數(shù)據(jù)報(bào)發(fā)送和接受達(dá)到172Mbyte/s,UDP數(shù)據(jù)報(bào)協(xié)議更達(dá)到192Mbyte/s。
存儲(chǔ)設(shè)備映射模塊在實(shí)際應(yīng)用中,網(wǎng)絡(luò)存儲(chǔ)系統(tǒng)被關(guān)心的一個(gè)問(wèn)題就是對(duì)于數(shù)據(jù)訪(fǎng)問(wèn)安全性的考慮?;贗P地址的存儲(chǔ)設(shè)備映射實(shí)現(xiàn)了啟動(dòng)器對(duì)虛擬設(shè)備標(biāo)識(shí)符訪(fǎng)問(wèn)權(quán)限的控制。如附圖5所示,存儲(chǔ)設(shè)備映射模塊允許iSCSI控制器網(wǎng)卡IP地址和啟動(dòng)器IP地址的雙層過(guò)濾。簡(jiǎn)而言之,存儲(chǔ)設(shè)備映射模塊對(duì)一個(gè)IO請(qǐng)求的源IP地址、目的IP地址和目的磁盤(pán)的設(shè)備標(biāo)識(shí)符進(jìn)行權(quán)限判定,判定的依據(jù)是存儲(chǔ)管理員所寫(xiě)入的權(quán)限規(guī)則。訪(fǎng)問(wèn)權(quán)限分為三個(gè)級(jí)別完全訪(fǎng)問(wèn)、只讀訪(fǎng)問(wèn)和禁止訪(fǎng)問(wèn)。
設(shè)備映射模塊是作為一個(gè)單獨(dú)的操作系統(tǒng)內(nèi)核模塊(Kernel Module)方式存在的,存儲(chǔ)管理員可以根據(jù)需要決定是否加載。
由于采取了iSCSI控制器上的IP和啟動(dòng)器IP的兩層匹配,而對(duì)設(shè)備的權(quán)限級(jí)別較傳統(tǒng)的映射方法多了只讀訪(fǎng)問(wèn),存儲(chǔ)管理員對(duì)存儲(chǔ)設(shè)備的分配更加靈活。而權(quán)限規(guī)則的引入則簡(jiǎn)化了存儲(chǔ)管理員的操作。
對(duì)于存儲(chǔ)管理員而言,一個(gè)規(guī)則的格式如[源IP地址][源地址掩碼][目的IP地址][TargetID][訪(fǎng)問(wèn)權(quán)限]而在存儲(chǔ)設(shè)備映射模塊中,規(guī)則的結(jié)構(gòu)定義如下struct target_mapping_rule{struct list_head list;struct list_head hash_list;_u32 target_id;_u32 src_addr;_u32 net_mask;_u32 dest_addr;_u8 permission;};其中,target_mapping_rule是描述映射規(guī)則的結(jié)構(gòu),list_head結(jié)構(gòu)用于把所有規(guī)則連接成為鏈表,list是一般的雙向鏈表,而hash_list是散列鏈表,用于高速查詢(xún)規(guī)則。target_id指明此所匹配的設(shè)備標(biāo)識(shí)符,如果該字段的值是0xffffffff則匹配所有的存儲(chǔ)設(shè)備。src_addr和dest_addr分別制定啟動(dòng)器的IP地址和iSCSI控制器的IP地址,同樣,如果這兩個(gè)字段的值是0xffffffff則匹配所有的IP地址,net_mask字段是src_addr的子網(wǎng)掩碼。字段permission指明權(quán)限,包括完全訪(fǎng)問(wèn),只讀訪(fǎng)問(wèn)和禁止訪(fǎng)問(wèn)。
存儲(chǔ)設(shè)備映射模塊以PROC的形式向存儲(chǔ)管理員提供寫(xiě)入規(guī)則或查看規(guī)則的接口,另外通過(guò)該接口,存儲(chǔ)管理員可以啟用存儲(chǔ)設(shè)備映射模塊或者停止存儲(chǔ)設(shè)備映射模塊。映射模塊把寫(xiě)入的規(guī)則解析成target_mapping_rule結(jié)構(gòu)并插入模塊的規(guī)則列表。
存儲(chǔ)設(shè)備映射模塊把向PROC接口寫(xiě)入的規(guī)則解析成target_mapping_rule結(jié)構(gòu),并以鏈表的形式組織。存儲(chǔ)設(shè)備映射通過(guò)查詢(xún)這個(gè)鏈表決定一個(gè)應(yīng)用服務(wù)器對(duì)某個(gè)存儲(chǔ)設(shè)備的訪(fǎng)問(wèn)權(quán)限。
存儲(chǔ)設(shè)備映射在三個(gè)環(huán)節(jié)上對(duì)啟動(dòng)器的訪(fǎng)問(wèn)進(jìn)行控制存儲(chǔ)設(shè)備發(fā)現(xiàn),存儲(chǔ)設(shè)備連接和IO讀寫(xiě)操作。應(yīng)用服務(wù)器(啟動(dòng)器)從iSCSI控制器取得存儲(chǔ)設(shè)備列表的過(guò)程即存儲(chǔ)設(shè)備發(fā)現(xiàn)過(guò)程。應(yīng)用服務(wù)器通過(guò)發(fā)送命令從iSCSI控制器請(qǐng)求返回存儲(chǔ)設(shè)備列表,存儲(chǔ)設(shè)備映射模塊截獲這個(gè)命令并對(duì)iSCSI控制器的存儲(chǔ)列表進(jìn)行過(guò)濾,最終只把該應(yīng)用服務(wù)器可見(jiàn)的存儲(chǔ)設(shè)備列表返回;應(yīng)用服務(wù)器在取得存儲(chǔ)設(shè)備的列表后,應(yīng)用服務(wù)器可以把某個(gè)指定的存儲(chǔ)設(shè)備連接到本地,這個(gè)過(guò)程即存儲(chǔ)設(shè)備連接過(guò)程。當(dāng)應(yīng)用服務(wù)器試圖對(duì)一個(gè)對(duì)之禁止的存儲(chǔ)設(shè)備進(jìn)行連接時(shí),存儲(chǔ)設(shè)備映射模塊立即中斷該應(yīng)用服務(wù)器到iSCSI控制器的網(wǎng)絡(luò)連接;應(yīng)用服務(wù)器在成功連接存儲(chǔ)設(shè)備后,就可以對(duì)存儲(chǔ)設(shè)備進(jìn)行讀寫(xiě)操作。存儲(chǔ)設(shè)備映射模塊對(duì)所有IO流進(jìn)行監(jiān)測(cè),一旦發(fā)現(xiàn)某個(gè)IO請(qǐng)求是不被允許的(如對(duì)只讀的存儲(chǔ)設(shè)備進(jìn)行寫(xiě)操作),存儲(chǔ)設(shè)備映射模塊丟棄該IO請(qǐng)求,并向應(yīng)用服務(wù)器返回出錯(cuò)信息。
在實(shí)現(xiàn)上,存儲(chǔ)設(shè)備映射模塊在FETD(前端驅(qū)動(dòng))中的對(duì)設(shè)備發(fā)現(xiàn)的響應(yīng)函數(shù)中增加了權(quán)限檢查的過(guò)程。首先,對(duì)所有可能的虛擬存儲(chǔ)設(shè)備標(biāo)識(shí)符進(jìn)行遍歷,如果該虛擬存儲(chǔ)設(shè)備標(biāo)識(shí)符有效并且根據(jù)規(guī)則列表判定該存儲(chǔ)設(shè)備標(biāo)識(shí)符對(duì)應(yīng)用服務(wù)器的IP地址和iSCSI控制器的IP地址是可見(jiàn)的(可完全訪(fǎng)問(wèn)或只讀訪(fǎng)問(wèn)),則把該存儲(chǔ)設(shè)備標(biāo)識(shí)符放入準(zhǔn)備返回的存儲(chǔ)設(shè)備標(biāo)識(shí)符列表中。
在處理應(yīng)用服務(wù)器連接存儲(chǔ)設(shè)備的請(qǐng)求時(shí)判斷該存儲(chǔ)設(shè)備對(duì)應(yīng)用服務(wù)器是否可見(jiàn)。存儲(chǔ)設(shè)備連接的過(guò)程中,應(yīng)用服務(wù)器和iSCSI控制器的iSCSI參數(shù)需要進(jìn)行協(xié)商,以確定應(yīng)用服務(wù)器和iSCSI控制器的傳輸參數(shù)。我們把應(yīng)用服務(wù)器所試圖連接的存儲(chǔ)設(shè)備標(biāo)識(shí)符也作為一個(gè)雙方協(xié)商的參數(shù)。在協(xié)商時(shí),存儲(chǔ)設(shè)備映射模塊判斷該存儲(chǔ)設(shè)備標(biāo)識(shí)符對(duì)于應(yīng)用服務(wù)器是否可見(jiàn),如果不可見(jiàn)則中斷協(xié)商過(guò)程,返回協(xié)商失敗的消息,最終讓iSCSI控制器斷開(kāi)到應(yīng)用服務(wù)器的網(wǎng)絡(luò)連接。
存儲(chǔ)設(shè)備映射模塊在SCSI中間層(STML)中增加對(duì)IO操作進(jìn)行過(guò)濾處理。為了表明對(duì)存儲(chǔ)設(shè)備的訪(fǎng)問(wèn)權(quán)限,在表示命令的結(jié)構(gòu)中增加一個(gè)表示權(quán)限的域authority。設(shè)置SCSI命令權(quán)限的步驟如下,首先取得發(fā)出這個(gè)命令的啟動(dòng)器的IP地址、iSCSI控制器的IP地址和該命令的目的設(shè)備標(biāo)識(shí)符,然后在規(guī)則列表中查詢(xún)對(duì)應(yīng)的權(quán)限賦予該命令的authority域。
在IO操作階段,存儲(chǔ)設(shè)備映射模塊首先判斷SCSI命令的命令類(lèi)型。對(duì)于寫(xiě)命令,需要分配緩沖區(qū),并且根據(jù)規(guī)則設(shè)置這個(gè)命令的權(quán)限,最后把命令放入等待隊(duì)列,等待所需寫(xiě)入數(shù)據(jù)的到來(lái)。接收到數(shù)據(jù)后,把相應(yīng)的SCSI命令從等待隊(duì)列中取出,并檢測(cè)命令的權(quán)限,判別該命令可否被執(zhí)行。如果允許執(zhí)行,則把該命令放入分發(fā)隊(duì)列,否則丟棄該命令并構(gòu)造SCSI響應(yīng)向啟動(dòng)器報(bào)告錯(cuò)誤。對(duì)于讀命令,直接根據(jù)規(guī)則設(shè)置這個(gè)命令的權(quán)限,再檢測(cè)命令的權(quán)限,判別該命令可否被執(zhí)行。如果允許執(zhí)行,則把該命令放入分發(fā)隊(duì)列,否則丟棄該命令并構(gòu)造SCSI響應(yīng)向啟動(dòng)器報(bào)告錯(cuò)誤。
該模塊的程序流程圖如圖8所示。
自適應(yīng)IO負(fù)載控制算法對(duì)于一些性能較低的存儲(chǔ)設(shè)備,過(guò)高的IO請(qǐng)求會(huì)導(dǎo)致設(shè)備驅(qū)動(dòng)的異常,從而導(dǎo)致整個(gè)系統(tǒng)的崩潰,因此有必要在iSCSI控制器上引入對(duì)IO負(fù)載的控制。而一般的iSCSI存儲(chǔ)系統(tǒng)普遍缺乏對(duì)IO負(fù)載的監(jiān)控機(jī)制,本發(fā)明實(shí)現(xiàn)了基于SCSI命令的IO負(fù)載控制功能。
在表示一個(gè)存儲(chǔ)設(shè)備的stml_device結(jié)構(gòu)中,can_queue和cmd_pending兩個(gè)域分別表示這個(gè)設(shè)備同時(shí)所能處理的SCSI命令隊(duì)列長(zhǎng)度和目前正處于SCSI的執(zhí)行隊(duì)列中的SCSI命令的個(gè)數(shù),在任何時(shí)刻都應(yīng)當(dāng)保證cmd_pending小于can_queue。
在SCSI中間層(STML)中,我們用不同的狀態(tài)來(lái)標(biāo)識(shí)一個(gè)SCSI命令的所處的流程,其中一個(gè)狀態(tài)是ST_HOLD_ON。ST_HOLD_ON狀態(tài)是實(shí)現(xiàn)負(fù)載控制的關(guān)鍵,所有到達(dá)SCSI中間層(STML)且準(zhǔn)備完畢可以立即執(zhí)行的命令因?yàn)閏md_pending到達(dá)can_queue的閾值而未能得到執(zhí)行的命令的狀態(tài)均被設(shè)置成ST_HOLD_ON狀態(tài)。ST_PENDING狀態(tài)則表明命令正處于等待狀態(tài)。
當(dāng)SCSI中間層(STML)處理一個(gè)SCSI命令時(shí),如果命令是寫(xiě)命令且尚未接收到存儲(chǔ)數(shù)據(jù)時(shí),把命令的狀態(tài)置成ST_PENDING狀態(tài)并返回,否則把命令的狀態(tài)置成ST_HOLD_ON狀態(tài),然后判斷目標(biāo)存儲(chǔ)設(shè)備的cmd_pending是否小于can_queue,如果是則調(diào)用scsi_do_req執(zhí)行SCSI命令并且把存儲(chǔ)設(shè)備的cmd_pending增1,scsi_do_req執(zhí)行完畢后將回調(diào)函數(shù)te_cmnd_processed。其中,scsi_do_req是Linux系統(tǒng)SCSI層提供的接口函數(shù),用于執(zhí)行SCSI命令,而te_cmnd_processed是中間層中定義的函數(shù),它的地址被傳入SCSI層并總是在SCSI命令執(zhí)行完畢時(shí)被回調(diào)執(zhí)行。在te_cmnd_processed中cmd_pending減1,這樣,cmd_pending的值就是正處于SCSI的執(zhí)行隊(duì)列中的SCSI命令的個(gè)數(shù)。如果cmd_pending已經(jīng)到達(dá)域值can_queue,則SCSI命令維持在ST_HOLD_ON的狀態(tài),等待下一輪處理。同樣在handle_cmd函數(shù)中,如果發(fā)現(xiàn)一個(gè)命令的狀態(tài)是ST_HOLD_ON,判斷目標(biāo)存儲(chǔ)設(shè)備的cmd_pending是否小于can_queue,如果是則調(diào)用scsi_do_req執(zhí)行該SCSI命令。這樣就可以把cmd_pending數(shù)目保持在can_queue以下,保證了存儲(chǔ)設(shè)備正常平穩(wěn)的工作。該模塊的程序流程圖如圖9所示。
多IO路徑模塊多IO路徑模塊充分利用具有雙控功能磁盤(pán)陣列的雙通道功能,實(shí)現(xiàn)了多個(gè)SCSI通道之間的冗余和提高iSCSI存儲(chǔ)系統(tǒng)并發(fā)IO能力。如圖6所示。
在多IO路徑模塊中,用下面數(shù)據(jù)結(jié)構(gòu)來(lái)記錄多IO路徑算法的相關(guān)信息#define MAX_PATH 4;int multipath_host0[MAX_PATH],multipath_host1[MAX_PATH];struct multipath_private_data{stml_device*scsi_device;int host;unsigned int ext_device_state;unsigned int multi_device_state;}multipath_conf[MAX_HOSTS][MAX_CHANNELS][MAX_TARGETS][MAX_LUNS];其中,MAX_PATH的值表示最大通道數(shù),multipath_host0、multipath_host1記錄多IO路徑模塊中的SCSI適配器所對(duì)應(yīng)的主機(jī)適配器號(hào)。多IO路徑模塊用分別用兩個(gè)數(shù)組來(lái)存放multipath_host0和multipath_host1的相關(guān)信息,這兩個(gè)數(shù)組分別是ext_scsi_device和multipath_conf。連接在multipath_host0所表示的SCSI適配器上的存儲(chǔ)設(shè)備的相關(guān)信息記錄在ext_scsi_device數(shù)組中,連接在multipath_host1所表示的SCSI適配器的存儲(chǔ)設(shè)備的相關(guān)信息記錄在multipath_conf數(shù)組中。例如,多IO路徑中的主機(jī)適配器號(hào)分別為host1與host2,則multipath_host0
=1,multipath_host1
=2,連接在host1的存儲(chǔ)設(shè)備的相關(guān)信息保存在ext_scsi_device[1][][][]中,而連接在host2的存儲(chǔ)設(shè)備的相關(guān)信息保存在multipath_conf[2][][][]中,ext_device_state與multi_device_state分別記錄兩個(gè)通道的狀態(tài)。
多IO路徑模塊實(shí)現(xiàn)了以下兩種主要方式(1)熱備份(Active-Standby)方式IO請(qǐng)求始終向兩個(gè)通道其中的一個(gè)發(fā)送,這個(gè)通道即激活(Active)通道,另外一個(gè)作為備用冗余。當(dāng)多IO路徑模塊發(fā)現(xiàn)IO請(qǐng)求在激活通道執(zhí)行失敗后,立即激活備用通道并轉(zhuǎn)到向備用通道發(fā)送IO請(qǐng)求。
(2)輪轉(zhuǎn)(Round-Robin)方式IO請(qǐng)求以輪轉(zhuǎn)算法輪流向兩個(gè)通道發(fā)送。
為了實(shí)現(xiàn)命令失敗后的重發(fā),在SCSI中間層(STML)中用狀態(tài)ST_PATH_FAIL表示一個(gè)SCSI命令在現(xiàn)在的激活通道上執(zhí)行失敗,當(dāng)多IO路徑模塊探測(cè)到一個(gè)SCSI命令執(zhí)行失敗后,就把這個(gè)命令的狀態(tài)設(shè)置成ST_PATH_FAIL并再次放入隊(duì)列中。如果一個(gè)命令的狀態(tài)是ST_PATH_FAIL,則需要選擇另外一個(gè)通道執(zhí)行。
多IO路徑模塊對(duì)SCSI命令處理流程如下(1)多IO路徑模塊接收到一個(gè)SCSI命令后,先判斷這個(gè)命令是否是寫(xiě)命令。
(2)如果不是寫(xiě)命令,則直接把該命令放入分發(fā)命令隊(duì)列中。否則,為寫(xiě)命令分配數(shù)據(jù)緩沖區(qū)并把該命令放入等待隊(duì)列,等待數(shù)據(jù)到達(dá)。如果數(shù)據(jù)到達(dá),則從等待隊(duì)列中取出該命令放入分發(fā)命令隊(duì)列。
(3)對(duì)于分發(fā)命令隊(duì)列中的命令進(jìn)行判斷是否有可選擇的IO路徑,如果沒(méi)有則退出,如果有,則根據(jù)策略選出一條可用的IO路徑,并把命令發(fā)送到該路徑并等待執(zhí)行結(jié)果,如果執(zhí)行正確則返回,否則把該命令放入重試隊(duì)列中,進(jìn)行下一輪的路徑選擇。
多IO路徑模塊的程序流程如圖10所示。
存儲(chǔ)管理員通過(guò)多IO路徑模塊提供的PROC接口設(shè)置多IO路徑模塊的方式,實(shí)現(xiàn)在iSCSI控制器上IO路徑的多通道冗余或提高iSCSI控制器的IO并發(fā)能力。
軟件RAID模塊在傳統(tǒng)的應(yīng)用中,存儲(chǔ)的RAID的功能一般由硬件RAID卡完成,而iSCSI存儲(chǔ)系統(tǒng)的軟件RAID模塊可以把多個(gè)具有SCSI接口的磁盤(pán)以軟件方式組織成為RAID5或RAID6冗余存儲(chǔ)陣列。iSCSI控制器把單獨(dú)的磁盤(pán)組織成存儲(chǔ)陣列提供給應(yīng)用服務(wù)器,應(yīng)用服務(wù)器對(duì)這些存儲(chǔ)陣列發(fā)出的SCSI命令成為虛擬SCSI命令,虛擬SCSI命令到達(dá)iSCSI控制器后,必須被分解成針對(duì)單個(gè)物理磁盤(pán)的SCSI物理SCSI命令。另一方面,物理SCSI命令執(zhí)行的結(jié)果也需要在iSCSI控制器上組合成為對(duì)應(yīng)用服務(wù)器的SCSI響應(yīng)。軟件RAID模塊所做的就是把針對(duì)RAID存儲(chǔ)陣列的虛擬SCSI命令根據(jù)不同的RAID算法轉(zhuǎn)化為物理SCSI命令,并且把物理SCSI命令在各個(gè)單獨(dú)物理磁盤(pán)上的執(zhí)行結(jié)果合并成為對(duì)虛擬SCSI命令的響應(yīng)結(jié)果。
根據(jù)以上所述,SCSI命令的處理過(guò)程主要包括三個(gè)步驟1.虛擬SCSI命令到物理SCSI命令的拆分2.物理SCSI命令的處理3.物理SCSI命令結(jié)果對(duì)虛擬SCSI命令的反饋軟件RAID模塊的全局變量target_data維護(hù)兩個(gè)命令隊(duì)列一個(gè)是虛擬SCSI命令隊(duì)列,另一個(gè)是物理SCSI命令隊(duì)列。其中虛擬SCSI命令隊(duì)列負(fù)責(zé)對(duì)從前端驅(qū)動(dòng)(FETD)傳遞過(guò)來(lái)的虛擬SCSI命令進(jìn)行處理。通過(guò)對(duì)虛擬SCSI命令的邏輯地址信息和其他參數(shù)進(jìn)行分析,一個(gè)虛擬SCSI命令可以拆分成一個(gè)或多個(gè)物理SCSI命令,每個(gè)物理SCSI命令能由SCSI層進(jìn)行執(zhí)行操作。當(dāng)一個(gè)虛擬SCSI命令對(duì)應(yīng)的所有物理SCSI命令都處理完后,通過(guò)分析各個(gè)物理SCSI命令的響應(yīng)結(jié)果,從而形成一個(gè)對(duì)虛擬SCSI命令的響應(yīng)結(jié)果。而物理SCSI命令隊(duì)列負(fù)責(zé)對(duì)物理SCSI命令的處理。
為了實(shí)現(xiàn)上述功能,虛擬SCSI命令必須至少包含虛擬SCSI命令的狀態(tài)和虛擬SCSI命令的標(biāo)識(shí);而物理SCSI命令必須包含如下字段物理SCSI命令的狀態(tài),物理SCSI命令所屬的虛擬SCSI命令,以及該物理SCSI命令的序號(hào)。
在處理虛擬SCSI命令的函數(shù)中,從前端驅(qū)動(dòng)(FETD)接收到的虛擬SCSI命令被封裝成一個(gè)Target_Virtual_Scsi_Cmnd結(jié)構(gòu),并把該虛擬命令插入虛擬命令隊(duì)列。
下列的幾個(gè)步驟是虛擬SCSI命令處理過(guò)程的主要步驟。
是把虛擬SCSI命令分解成物理SCSI命令,并把物理SCSI命令插入相應(yīng)隊(duì)列,同時(shí)維護(hù)虛擬SCSI命令和物理SCSI命令之間的關(guān)系和狀態(tài)。
每次有一個(gè)物理SCSI命令返回后,通過(guò)該命令檢測(cè)原始命令隊(duì)列,如果發(fā)現(xiàn)有對(duì)應(yīng)的所有物理SCSI命令已經(jīng)處理完成的虛擬SCSI命令,則改變?cè)撎摂MSCSI命令的狀態(tài),然后進(jìn)行對(duì)虛擬SCSI命令返回結(jié)果的模擬。
這樣我們只要作如下更改,就可以實(shí)現(xiàn)對(duì)STML的擴(kuò)展,從而使之適合軟件RAID模塊。
在上面所述的基礎(chǔ)上,我們可以把一條針對(duì)RAID5/RAID6的SCSI命令進(jìn)行命令拆分、執(zhí)行和結(jié)果合成。
軟件RAID需要模擬一系列的讀寫(xiě)命令,包括READ(6)/WRITE(6),READ(10)/WRITE(10),READ(12)/WRITE(12)和READ(16)/WRITE(16)。這些命令的區(qū)別在于命令長(zhǎng)度不一樣,因此它們的尋址范圍和一次請(qǐng)求的長(zhǎng)度都不大一樣。對(duì)不同長(zhǎng)度命令的解析過(guò)程也不盡相同。
如READ(10)命令的第0字節(jié)是操作碼,它還包括塊邏輯地址(LBA,Logical Block Address)和傳輸長(zhǎng)度等信息。其中塊邏輯地址位于該命令的第2到第5字節(jié),因此READ(10)命令的邏輯地址LBA可用下列的公式計(jì)算(其中cmnd為SCSI命令)lba=(cmnd[2]<<24)+(cmnd[3]<<16)+(cmnd[4]<<8)+cmnd[5];根據(jù)計(jì)算公式得到命令的塊邏輯地址后,我們就能計(jì)算出讀請(qǐng)求在虛擬設(shè)備中的偏移位置seek=lba*BLOCKSIZEBLOCKSIZE的大小一般為512字節(jié)。
而READ_10命令所請(qǐng)求的塊數(shù)可以計(jì)算如下num=cmd[8]+(cmd[7]<<8)在解析成LBA地址和請(qǐng)求傳輸長(zhǎng)度之后,軟件RAID模塊根據(jù)不同的RAID算法以及RAID的配置信息得出針對(duì)每一個(gè)磁盤(pán)的讀寫(xiě)偏移、讀寫(xiě)數(shù)據(jù)及其長(zhǎng)度,并且重新構(gòu)造成針對(duì)實(shí)際磁盤(pán)的物理SCSI命令。
之后RAID模塊調(diào)用scsi_do_req對(duì)每個(gè)物理命令進(jìn)行執(zhí)行并得到其結(jié)果,再把所有的結(jié)果合成一個(gè)結(jié)果。
除了讀寫(xiě)操作之外,軟件RAID模塊還需要對(duì)啟動(dòng)器發(fā)起的一些查詢(xún)命令做出響應(yīng),如INQUIRY命令。對(duì)于這些命令,我們可以根據(jù)配置信息直接返回其結(jié)果。
塊設(shè)備支持模塊塊設(shè)備支持模塊實(shí)現(xiàn)SCSI命令到塊IO請(qǐng)求轉(zhuǎn)化,并把塊IO的請(qǐng)求結(jié)果封裝成SCSI結(jié)果。這實(shí)際上相當(dāng)于在一般的塊設(shè)備上增加了一層SCSI接口層。塊設(shè)備支持模塊不僅能夠支持不具備SCSI接口的物理設(shè)備,如IDE磁盤(pán),也能夠支持包括LVM,MD在內(nèi)的虛擬塊設(shè)備,而LVM實(shí)現(xiàn)了虛擬化存儲(chǔ),MD實(shí)現(xiàn)了軟件RAID功能,顯然塊設(shè)備支持?jǐn)U大了iSCSI存儲(chǔ)系統(tǒng)對(duì)存儲(chǔ)設(shè)備的支持范圍,擴(kuò)展了iSCSI存儲(chǔ)系統(tǒng)的功能。
塊設(shè)備支持模塊實(shí)現(xiàn)的重點(diǎn)在于對(duì)SCSI讀寫(xiě)命令的解析和對(duì)SCSI讀寫(xiě)命令返回結(jié)果的模擬。塊設(shè)備支持模塊首先需要從前端發(fā)送過(guò)來(lái)的SCSI讀寫(xiě)命令解析成為塊設(shè)備讀寫(xiě)請(qǐng)求,主要是設(shè)備地址和數(shù)據(jù)讀寫(xiě)長(zhǎng)度的解析。然后把塊設(shè)備請(qǐng)求執(zhí)行的結(jié)果轉(zhuǎn)化成為SCSI命令的請(qǐng)求結(jié)果用于相應(yīng)前端。
下面分別就SCSI的讀請(qǐng)求和寫(xiě)請(qǐng)求對(duì)這個(gè)處理過(guò)程作簡(jiǎn)要的介紹。
對(duì)于讀請(qǐng)求,塊設(shè)備支持模塊首先從SCSI請(qǐng)求中解析出LBA地址和所讀取的數(shù)據(jù)長(zhǎng)度,然后根據(jù)LBA地址算出虛擬設(shè)備中對(duì)應(yīng)的偏移地址,再把偏移地址、數(shù)據(jù)長(zhǎng)度和數(shù)據(jù)緩沖區(qū)地址傳遞給塊設(shè)備讀取數(shù)據(jù)。等待塊設(shè)備把數(shù)據(jù)讀入到數(shù)據(jù)緩沖區(qū)后,塊設(shè)備支持模塊設(shè)置SCSI請(qǐng)求的狀態(tài)域并把它返回iSCSI控制器SCSI中間層(STML)。
對(duì)于寫(xiě)請(qǐng)求。塊設(shè)備支持模塊同樣從SCSI請(qǐng)求中解析出LBA地址、數(shù)據(jù)長(zhǎng)度以及把啟動(dòng)器端發(fā)送過(guò)來(lái)的數(shù)據(jù)存放如數(shù)據(jù)緩沖區(qū)中,然后根據(jù)LBA地址算出虛擬設(shè)備中對(duì)應(yīng)的偏移地址,再把偏移地址、數(shù)據(jù)長(zhǎng)度和數(shù)據(jù)緩沖區(qū)地址傳遞給塊設(shè)備層對(duì)塊設(shè)備寫(xiě)入SCSI請(qǐng)求的數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)。等待塊設(shè)備層操作成功后,塊設(shè)備支持模塊設(shè)置SCSI請(qǐng)求的狀態(tài)域并把它返回SCSI中間層(STML)。
塊設(shè)備支持模塊支持的SCSI讀寫(xiě)命令包括READ(6)/WRITE(6),READ(10)/WRITE(10),READ(12)/WRITE(12)和READ(16)/WRITE(16)。這些命令的解析過(guò)程和在RAID模塊中的拆分過(guò)程類(lèi)似。所不同的是其執(zhí)行和結(jié)果合成的過(guò)程不同。在本發(fā)明的實(shí)現(xiàn)中,對(duì)塊設(shè)備的打開(kāi)關(guān)閉和讀寫(xiě)操作是調(diào)用內(nèi)核的filp_open/filp_close,f_op->llseek,f_op->read和f_op->write完成的。
塊設(shè)備支持模塊的流程圖如圖11所示。
測(cè)試結(jié)果性能測(cè)試對(duì)iSCSI存儲(chǔ)系統(tǒng)的測(cè)試分別從IO吞吐率(throughput),平均反應(yīng)時(shí)間(average responsetime)兩方面進(jìn)行。這兩者是衡量iSCSI存儲(chǔ)系統(tǒng)性能的重要指標(biāo)。測(cè)試在一臺(tái)iSCSI控制器和三臺(tái)前端服務(wù)器上進(jìn)行。I/O節(jié)點(diǎn)機(jī)采用32位安騰2.4GHZ雙CPU服務(wù)器,內(nèi)存2GB,操作系統(tǒng)為L(zhǎng)inux(Kernel 2.4.26)。存儲(chǔ)子系統(tǒng)采用Qlogic公司的QLA2200光纖通道卡,以及由2個(gè)Odysys公司的磁盤(pán)柜。在iSCSI控制器上我們安裝有6塊千兆以太網(wǎng)卡,并且每?jī)蓚€(gè)綁定為一個(gè)IP,前端服務(wù)器每臺(tái)安裝有2塊網(wǎng)卡,均綁定為一個(gè)IP,前端服務(wù)器和iSCSI控制器用直連線(xiàn)相連,Bonding算法選擇Active-Standby方式。
在測(cè)試中,我們測(cè)試了在不同塊大小下完全順序讀寫(xiě)的吞吐率和平均反應(yīng)時(shí)間,測(cè)試工具是intel的iometer,結(jié)果如下表所示。
表2IO吞吐率
表3平均響應(yīng)時(shí)間
上述結(jié)果表明,iSCSI存儲(chǔ)系統(tǒng)具有較高的IO吞吐率和較短的平均響應(yīng)時(shí)間。
網(wǎng)絡(luò)鏈路冗余測(cè)試此項(xiàng)測(cè)試的目的是測(cè)試IO控制器進(jìn)行多網(wǎng)卡綁定并配置成為以熱備份算法傳輸時(shí)的鏈路冗余功能。
在測(cè)試中,我們把IO控制器上的兩塊網(wǎng)卡綁定成一個(gè)IP,同樣把應(yīng)用服務(wù)器的兩塊網(wǎng)卡綁定成一個(gè)IP,并設(shè)定網(wǎng)卡綁定模塊的傳輸算法為熱備份方式。IO控制器上兩塊網(wǎng)卡分別通過(guò)直連線(xiàn)和應(yīng)用服務(wù)器的兩塊網(wǎng)卡相連接,按照以下步驟進(jìn)行測(cè)試(1)啟動(dòng)IO控制器的iSCSI存儲(chǔ)服務(wù),啟動(dòng)應(yīng)用服務(wù)器iSCSI啟動(dòng)器軟件把iSCSI系統(tǒng)上一個(gè)存儲(chǔ)設(shè)備映射到本地,并啟動(dòng)應(yīng)用程序?qū)SCSI存儲(chǔ)設(shè)備進(jìn)行讀寫(xiě)。在IO控制器上啟動(dòng)traffic工具對(duì)兩個(gè)網(wǎng)卡的流量進(jìn)行監(jiān)控,這時(shí)可以看到數(shù)據(jù)流通過(guò)激活(Active)鏈路進(jìn)行傳輸。
(2)人為拔掉激活鏈路的網(wǎng)線(xiàn)。這時(shí)可以看到數(shù)據(jù)流立即切換到原來(lái)的備份鏈路。應(yīng)用服務(wù)器上的應(yīng)用程序讀寫(xiě)沒(méi)有察覺(jué)出明顯的影響。
(3)把網(wǎng)線(xiàn)重新插好,再拔掉原來(lái)的備份網(wǎng)線(xiàn)??梢钥吹綌?shù)據(jù)流立即切換到原來(lái)的鏈路。應(yīng)用服務(wù)器上的應(yīng)用程序讀寫(xiě)沒(méi)有察覺(jué)出明顯的影響。
上面的測(cè)試表明,iSCSI存儲(chǔ)系統(tǒng)通過(guò)網(wǎng)卡綁定提供了網(wǎng)絡(luò)鏈路級(jí)的冗余,提高了系統(tǒng)的可用性。
多IO路徑模塊測(cè)試此項(xiàng)測(cè)試的目的是測(cè)試IO控制器的多IO路徑模塊的通道冗余功能。
在測(cè)試中,我們?cè)贗O控制器安裝兩塊SCSI卡,并通過(guò)兩根SCSI數(shù)據(jù)線(xiàn)和一個(gè)雙通道磁盤(pán)陣列的兩個(gè)通道連接,按照以下步驟進(jìn)行測(cè)試(1)啟動(dòng)IO控制器的iSCSI存儲(chǔ)服務(wù),啟動(dòng)應(yīng)用服務(wù)器iSCSI啟動(dòng)器軟件把iSCSI系統(tǒng)上的雙通道磁盤(pán)陣列設(shè)備映射到本地,并啟動(dòng)應(yīng)用程序?qū)﹃嚵羞M(jìn)行讀寫(xiě)。
(2)人為斷掉其中正在使用的SCSI數(shù)據(jù)通道。應(yīng)用程序讀寫(xiě)沒(méi)有受到明顯的影響。
(3)把SCSI數(shù)據(jù)線(xiàn)重新插好,再斷掉另外一個(gè)SCSI數(shù)據(jù)通道。應(yīng)用服務(wù)器上的應(yīng)用程序讀寫(xiě)沒(méi)有察覺(jué)出明顯的影響。
上面的測(cè)試表明,iSCSI存儲(chǔ)系統(tǒng)通過(guò)提供了SCSI數(shù)據(jù)通道級(jí)的冗余,提高了系統(tǒng)的可用性。
設(shè)備管理模塊測(cè)試此項(xiàng)測(cè)試主要測(cè)試設(shè)備管理模塊的在線(xiàn)添減存儲(chǔ)設(shè)備的情況。分別分以下幾種情況測(cè)試1.刪除正在讀寫(xiě)的存儲(chǔ)設(shè)備。這種情況模擬在應(yīng)用服務(wù)器正在讀寫(xiě)某塊磁盤(pán)時(shí)此磁盤(pán)發(fā)生物理故障,需要?jiǎng)h除更換的情況。
按照以下步驟測(cè)試(1)啟動(dòng)IO控制器的iSCSI存儲(chǔ)服務(wù),啟動(dòng)應(yīng)用服務(wù)器iSCSI啟動(dòng)器軟件把iSCSI系統(tǒng)上一個(gè)存儲(chǔ)磁盤(pán)映射到本地,在應(yīng)用服務(wù)器上啟動(dòng)用應(yīng)用程序?qū)υ摯疟P(pán)進(jìn)行讀寫(xiě)操作。
(2)在IO控制器上調(diào)用iscsi_remove腳本,通過(guò)iSCSI存儲(chǔ)系統(tǒng)設(shè)備管理模塊提供的PROC接口發(fā)出刪除該磁盤(pán)的命令。
(3)可以看到,應(yīng)用服務(wù)器上應(yīng)用程序的讀寫(xiě)操作停止。過(guò)一段時(shí)間后,應(yīng)用服務(wù)器到IO控制器的網(wǎng)絡(luò)鏈路中斷,應(yīng)用服務(wù)器上映射過(guò)來(lái)的存儲(chǔ)磁盤(pán)消失,應(yīng)用程序中斷讀寫(xiě)。
從以上的測(cè)試可以看出,在存儲(chǔ)設(shè)備出現(xiàn)物理故障的情況下,iSCSI系統(tǒng)能夠安全的刪除該設(shè)備。
2.正在讀寫(xiě)時(shí)刪除其他存儲(chǔ)設(shè)備。這種情況模擬在應(yīng)用服務(wù)器正在讀寫(xiě)時(shí),某塊不在讀寫(xiě)的磁盤(pán)發(fā)生物理故障,需要?jiǎng)h除更換的情況。
按照以下步驟測(cè)試(1)啟動(dòng)IO控制器的iSCSI存儲(chǔ)服務(wù),啟動(dòng)應(yīng)用服務(wù)器iSCSI啟動(dòng)器軟件把iSCSI系統(tǒng)上一個(gè)存儲(chǔ)磁盤(pán)映射到本地,在應(yīng)用服務(wù)器上啟動(dòng)用應(yīng)用程序?qū)υ摯疟P(pán)進(jìn)行讀寫(xiě)操作。
(2)在IO控制器上調(diào)用iscsi_remove腳本,通過(guò)iSCSI存儲(chǔ)系統(tǒng)設(shè)備管理模塊提供的PROC接口發(fā)出刪除IO控制器上另外一個(gè)磁盤(pán)的命令。
(3)可以看到,應(yīng)用服務(wù)器上應(yīng)用程序的讀寫(xiě)沒(méi)有受到任何影響。而應(yīng)用服務(wù)器上的iSCSI啟動(dòng)器的存儲(chǔ)設(shè)備列表中已經(jīng)看不到被刪除的磁盤(pán)。
從以上的測(cè)試可以看出,iSCSI存儲(chǔ)系統(tǒng)提供了在不停止存儲(chǔ)服務(wù)的情況下刪除存儲(chǔ)設(shè)備的功能。
3.正在讀寫(xiě)時(shí)增加一個(gè)存儲(chǔ)設(shè)備。這種情況模擬在應(yīng)用服務(wù)器正在讀寫(xiě)時(shí),需要增加存儲(chǔ)資源的情況。
按照以下步驟測(cè)試(1)啟動(dòng)IO控制器的iSCSI存儲(chǔ)服務(wù),啟動(dòng)應(yīng)用服務(wù)器iSCSI啟動(dòng)器軟件把iSCSI系統(tǒng)上一個(gè)存儲(chǔ)磁盤(pán)映射到本地,在應(yīng)用服務(wù)器上啟動(dòng)用應(yīng)用程序?qū)υ摯疟P(pán)進(jìn)行讀寫(xiě)操作。
(2)在存儲(chǔ)資源中增加一塊物理磁盤(pán),在IO控制器上調(diào)用scsi_add腳本,使得SCSI更新存儲(chǔ)設(shè)備列表,再調(diào)用iscsi_rescan腳本通過(guò)iSCSI存儲(chǔ)系統(tǒng)設(shè)備管理模塊提供的PROC接口發(fā)出重新掃描存儲(chǔ)設(shè)備列表的命令。
(3)可以看到,應(yīng)用服務(wù)器上應(yīng)用程序的讀寫(xiě)沒(méi)有受到任何影響。而應(yīng)用服務(wù)器上的iSCSI啟動(dòng)器的存儲(chǔ)設(shè)備列表中增加了剛剛所加進(jìn)來(lái)的磁盤(pán)。
從以上的測(cè)試可以看出,iSCSI存儲(chǔ)系統(tǒng)提供了在不停止存儲(chǔ)服務(wù)的情況下增加存儲(chǔ)設(shè)備的功能。
塊設(shè)備支持模塊測(cè)試在此項(xiàng)測(cè)試中,我們?cè)贗O控制器上創(chuàng)建一個(gè)內(nèi)存虛擬盤(pán)(所有讀寫(xiě)操作均在內(nèi)存中),一個(gè)硬件RAID0陣列,一個(gè)MD模塊RAID0虛擬設(shè)備。虛擬設(shè)備是一個(gè)塊設(shè)備,不具備SCSI接口,需要塊設(shè)備支持模塊的支持。我們?cè)趹?yīng)用服務(wù)器上分別用IOMeter測(cè)試內(nèi)存盤(pán),SCSI磁盤(pán)和塊設(shè)備支持模塊的虛擬盤(pán),得出IO吞吐率和IO延時(shí)。在此項(xiàng)測(cè)試中,應(yīng)用服務(wù)器只有一臺(tái)。在塊大小為1MB,的情況下,測(cè)試結(jié)果如下表4IO吞吐率(MB/s)
表5IO延時(shí)(ms)
從以上兩表可以看到對(duì)于讀請(qǐng)求,虛擬RAID0卷的IO吞吐率是硬件RAID0卷的IO吞吐率的2.04倍。而對(duì)于寫(xiě)請(qǐng)求,這個(gè)值是1.82倍。
對(duì)于讀請(qǐng)求,虛擬RAID0卷的IO延時(shí)是硬件RAID0卷的IO延時(shí)的20%。而對(duì)于寫(xiě)請(qǐng)求,這個(gè)值是23%。
測(cè)試表明,塊支持模塊可以很好的支持虛擬塊設(shè)備,并且提供了高性能的協(xié)議轉(zhuǎn)換機(jī)制。測(cè)試中虛擬的塊設(shè)備的性能甚至高于硬件設(shè)備,這主要是由于塊設(shè)備層高速緩存(Cache)的作用。
權(quán)利要求
1.一種iSCSI存儲(chǔ)系統(tǒng)的實(shí)現(xiàn)方法,其特征在于,它依次包含以下步驟第1步在以下兩個(gè)網(wǎng)絡(luò)小型計(jì)算機(jī)系統(tǒng)接口,也稱(chēng)iSCSI的存儲(chǔ)系統(tǒng)中的任何一個(gè)的iSCSI控制器上,啟動(dòng)存儲(chǔ)服務(wù),把iSCSI協(xié)議即該控制器軟件作為該系統(tǒng)的內(nèi)核模塊加載到它的操作系統(tǒng)中第一種iSCSI存儲(chǔ)系統(tǒng)包括多個(gè)網(wǎng)絡(luò)應(yīng)用服務(wù)器,也稱(chēng)啟動(dòng)器;一個(gè)管理控制臺(tái);通過(guò)TCP/IP網(wǎng)絡(luò)協(xié)議分別和上述各啟動(dòng)器和一個(gè)管理控制臺(tái)通訊的一臺(tái)千兆網(wǎng)交換機(jī);根據(jù)iSCSI協(xié)議和上述千兆網(wǎng)交換通訊的iSCSI控制器;在Linux操作系統(tǒng)下并根據(jù)iSCSI協(xié)議與上述iSCSI控制器通訊的多臺(tái)存儲(chǔ)設(shè)備;第二種iSCSI存儲(chǔ)系統(tǒng)包括多個(gè)網(wǎng)絡(luò)應(yīng)用服務(wù)器,也稱(chēng)啟動(dòng)器;一個(gè)管理控制臺(tái);一臺(tái)千兆網(wǎng)交換機(jī);一臺(tái)iSCSI控制器;多臺(tái)存儲(chǔ)設(shè)備;各啟動(dòng)器和iSCSI控制器之間直線(xiàn)連接,千兆網(wǎng)交換機(jī)和各啟動(dòng)器、管理控制臺(tái)、iSCSI控制器之間經(jīng)TCP/IP網(wǎng)絡(luò)協(xié)議通訊,iSCSI控制臺(tái)和各存儲(chǔ)設(shè)備之間按照iSCSI協(xié)議在Linux操作系統(tǒng)下運(yùn)行;上述iSCSI協(xié)議包含上層由網(wǎng)關(guān)綁定模塊及前端目標(biāo)驅(qū)動(dòng)即FETD模塊有一次連接而成;中間層由與上述前端目標(biāo)器驅(qū)動(dòng)模塊依次相連的IO負(fù)載控制模塊和多IO路徑模塊組成;下層,即物理層有一個(gè)和多IO路徑模塊相連的設(shè)備管理模塊;所述網(wǎng)卡綁定模塊,它是一種鏈路聚合式模塊,即它使多塊網(wǎng)卡虛擬為一塊網(wǎng)卡,都具有相同的IP地址;該模塊在Linux操作系統(tǒng)下,針對(duì)不同需要,配備了符合IEEE 802.3ad標(biāo)準(zhǔn)的多網(wǎng)卡輪轉(zhuǎn)和熱備份兩種模式;所述前端目標(biāo)器驅(qū)動(dòng)模塊,它是公知的;所述存儲(chǔ)設(shè)備管理模塊,在啟動(dòng)器啟動(dòng)iSCSI控制器存儲(chǔ)服務(wù)時(shí),它掃描連接在iSCSI控制器上的各儲(chǔ)備設(shè)備,提供固定的虛擬設(shè)備標(biāo)識(shí)符;在熱插拔存儲(chǔ)設(shè)備時(shí),啟動(dòng)對(duì)存儲(chǔ)設(shè)備進(jìn)行增減的操作;它在iSCSI控制器上設(shè)定一個(gè)線(xiàn)性組合形式且用以標(biāo)識(shí)存儲(chǔ)設(shè)備編號(hào)的虛擬目標(biāo)標(biāo)識(shí)符數(shù)組,依次內(nèi)含該設(shè)備的主機(jī)適配器號(hào),即host;通道號(hào),即channel;目標(biāo)號(hào),即target;邏輯單元號(hào),即lun;該模塊用上述四個(gè)變量確定一個(gè)存儲(chǔ)設(shè)備的位置;同時(shí),iSCSI存儲(chǔ)系統(tǒng)的iSCSI控制器上維護(hù)著一個(gè)存儲(chǔ)設(shè)備列表以及表示存儲(chǔ)設(shè)備被掃描次數(shù)的數(shù)組;它為iSCSI控制臺(tái)提供了一個(gè)寫(xiě)入命令以使該模塊重新對(duì)該存儲(chǔ)設(shè)備進(jìn)行掃描的PROC接口;它還為iSCSI控制器提供了動(dòng)態(tài)增減存儲(chǔ)設(shè)備的另一個(gè)PROC接口;在下述情況下iSCSI控制器啟動(dòng)掃描存儲(chǔ)設(shè)備的操作iSCSI存儲(chǔ)系統(tǒng)的iSCSI控制器端加載控制軟件時(shí);iSCSI系統(tǒng)在減少或增加了存儲(chǔ)設(shè)備后,存儲(chǔ)管理員向iSCSI控制器發(fā)出重掃描的命令;所述存儲(chǔ)設(shè)備模塊依次按以下步驟實(shí)施存儲(chǔ)設(shè)備掃描流程初始化模塊;有更多的host號(hào)否,若沒(méi)有,便返回;否則,執(zhí)行下一步驟;Host中還有更多的設(shè)備否,若沒(méi)有,便返回初始化模塊下面的一步;否則,執(zhí)行下一步驟;設(shè)備的類(lèi)型是否為存儲(chǔ)磁盤(pán),若不是,便返回初始化模塊下面的一步;否則,執(zhí)行下一步驟;獲取設(shè)備的信息;構(gòu)造設(shè)備信息,插入設(shè)備到表中;可用設(shè)備增1,返回初始化模塊下面的一步;所述存儲(chǔ)設(shè)備管理模塊依次按以下步驟實(shí)施存儲(chǔ)設(shè)備刪除流程管理員指定要?jiǎng)h除設(shè)備的標(biāo)識(shí)符;從設(shè)備列表中得到該設(shè)備的信息;設(shè)置該設(shè)備的刪除標(biāo)志;釋放該設(shè)備所有的未執(zhí)行命令;設(shè)置該設(shè)備的引用計(jì)數(shù)為0,引用次數(shù)是指存儲(chǔ)管理設(shè)定的該設(shè)備的被掃描次數(shù);返回;所述存儲(chǔ)管理模塊按以下步驟實(shí)施存儲(chǔ)設(shè)備增加流程管理員指定要增加的設(shè)備的標(biāo)識(shí)符;設(shè)置該設(shè)備的增加標(biāo)志;把該設(shè)備的標(biāo)識(shí)符加入到存儲(chǔ)設(shè)備列表中;設(shè)置該設(shè)備的引用計(jì)數(shù)為0;自適應(yīng)負(fù)載控制算法程序,它自動(dòng)適應(yīng)存儲(chǔ)設(shè)備的能力,控制低端存儲(chǔ)設(shè)備上的IO負(fù)載;它在上述表示一個(gè)存儲(chǔ)設(shè)備位置的數(shù)據(jù)組中,分別設(shè)置表示該設(shè)備同時(shí)所能處理的SCSI命令隊(duì)列的長(zhǎng)度的域,同時(shí)設(shè)置表示目前正處于SCSI的執(zhí)行隊(duì)列中的SCSI命令的個(gè)數(shù)的域,且在任何時(shí)候后者都要小于前者;同時(shí),在中間層中,設(shè)置一個(gè)ST_HOLD_ON狀態(tài),它表示所有到達(dá)中間層且準(zhǔn)備完畢以便立即執(zhí)行但因目前正處于SCSI的執(zhí)行隊(duì)列中的SCSI命令的個(gè)數(shù)已到達(dá)該設(shè)備同時(shí)所能處理的SCSI命令隊(duì)列長(zhǎng)度的闕值而未能得到執(zhí)行的命令的狀態(tài);所述實(shí)施負(fù)載自適應(yīng)算法的程序依次含有以下程序模塊從命令隊(duì)列中得到一個(gè)需處理的SCSI命令;判別該命令是否處于ST_HOLD_ON狀態(tài),若否,則執(zhí)行下一步驟;判斷該命令是否是寫(xiě)命令,若為寫(xiě)命令且尚未接收到存儲(chǔ)數(shù)據(jù),若是,則把該命令設(shè)置成目前正處于SCSI執(zhí)行隊(duì)列中的一個(gè)正待執(zhí)行的命令的狀態(tài),執(zhí)行完畢,則返回,若否,則設(shè)置成ST_HOLD_ON狀態(tài),然后判斷目標(biāo)存儲(chǔ)設(shè)備的同時(shí)所能處理的SCSI命令隊(duì)列長(zhǎng)度是否大于目前正處于SCSI的執(zhí)行隊(duì)列中的SCSI命令的個(gè)數(shù),若否,則返回;若是,則執(zhí)行SCSI命令并把存儲(chǔ)設(shè)備的目前正處于SCSI執(zhí)行隊(duì)列中的SCSI命令的個(gè)數(shù)增1,要處理的SCSI命令的個(gè)數(shù)減1,返回;若從命令隊(duì)列中得到的要處理的SCSI命令處于ST_HOLD_ON狀態(tài),則維持原狀態(tài)等待下一輪處理,執(zhí)行下一步驟;該模塊再?gòu)拿铌?duì)列中得到下一步要處理的SCSI命令按以上步驟處理;若命令沒(méi)有超時(shí),則循環(huán)反復(fù),直到處理完命令隊(duì)列中的有要處理的SCSI命令為止;所述的多IO路徑模塊,它對(duì)不同的存儲(chǔ)隊(duì)列通道進(jìn)行IO請(qǐng)求控制,實(shí)現(xiàn)輪轉(zhuǎn)或熱備份配置,即充分利用具有雙控功能磁盤(pán)陣列的雙通道功能,實(shí)現(xiàn)多個(gè)通道之間的冗余和提高;SCSI存儲(chǔ)系統(tǒng)異步IO能力;設(shè)定各主機(jī)適配器的最大通道數(shù),記錄多IO路徑模塊中的SCSI適配器所對(duì)應(yīng)的主機(jī)適配器號(hào);對(duì)于雙控功能磁盤(pán)陣列而言,一個(gè)主機(jī)適配號(hào)所表示的SCSI適配器上的存儲(chǔ)設(shè)備的相關(guān)信息記錄在存儲(chǔ)設(shè)備列表中,另一個(gè)則保存在多IO路徑模塊定義的結(jié)構(gòu)中,同時(shí)記錄兩個(gè)通道的狀態(tài)域;該模塊提供相應(yīng)的PROC命令接口;在中間層用狀態(tài)ST_PATH_FAIL表達(dá)一個(gè)SCSI命令在現(xiàn)在的激活通道上執(zhí)行失敗,一旦該模塊探測(cè)到該狀態(tài),就把這個(gè)命令的狀態(tài)設(shè)置成ST_PATH_FAIL,并再次放入隊(duì)列中,同時(shí)選擇另外一個(gè)通道執(zhí)行;多IO路徑模塊對(duì)SCSI命令的處理流程如下先判斷收到的SCSI命令是否為寫(xiě)命令;若不是,則直接把該命令放入分發(fā)命令隊(duì)列中;否則,為寫(xiě)命令分配數(shù)據(jù)緩沖區(qū)并把該命令放入等待隊(duì)列,等著數(shù)據(jù)到達(dá);若數(shù)據(jù)到達(dá),則從等待隊(duì)列中取出該寫(xiě)命令,放入分發(fā)命令隊(duì)列;在確定的配置模式下,對(duì)于分發(fā)命令隊(duì)列中的命令進(jìn)行判斷是否有可選擇的IO路徑,若沒(méi)有,則推出;若有,則根據(jù)設(shè)定策略選出一條可用的IO路徑,并把命令發(fā)送到該路徑再等待執(zhí)行結(jié)果,若執(zhí)行正確則返回,否則,把該命令放入重試隊(duì)列中,進(jìn)行下一輪的路徑選擇。
2.根據(jù)權(quán)利要求1所述的一種iSCSI存儲(chǔ)系統(tǒng)的實(shí)現(xiàn)方法,其特征在于在物理層,還有一個(gè)軟件RAID模塊與所述的多IO路徑模塊相連所述軟件RAID模塊,它把針對(duì)RAID存儲(chǔ)隊(duì)列的虛擬SCSI命令根據(jù)不同的RAID算法轉(zhuǎn)化為物理SCSI命令,并且把物理SCSI命令在各個(gè)單獨(dú)物理磁盤(pán)上的執(zhí)行結(jié)果合并或?qū)μ摂MSCSI命令的響應(yīng)結(jié)果;使RAID模塊的全局變量維護(hù)下述兩個(gè)命令隊(duì)列虛擬SCSI命令隊(duì)列,它必須至少包含虛擬SCSI命令的狀態(tài)和虛擬SCSI命令的標(biāo)識(shí);物理SCSI命令隊(duì)列,它至少必須包括如下字段物理SCSI命令的狀態(tài),物理SCSI命令所對(duì)應(yīng)的虛擬命令,以及該物理SCSI命令的序號(hào);所述RAID模塊依次含有以下步驟根據(jù)虛擬SCSI命令的邏輯地址信息和其他參數(shù),把一條虛擬SCSI命令分解成物理SCSI命令并把物理SCSI命令組成隊(duì)列,同時(shí)維護(hù)虛擬SCSI和物理SCSI命令之間的關(guān)系和狀態(tài);由SCSI層對(duì)每個(gè)物理SCSI命令進(jìn)行操作;每次有一個(gè)物理SCSI命令返回后,通過(guò)該命令檢測(cè)原始命令隊(duì)列,若發(fā)現(xiàn)對(duì)應(yīng)的所有物理SCSI命令已經(jīng)處理完畢,通過(guò)分析各個(gè)物理SCSI命令的響應(yīng)結(jié)果形成一個(gè)對(duì)虛擬SCSI命令的響應(yīng)結(jié)果。
3.根據(jù)權(quán)利要求1所述的一種iSCSI存儲(chǔ)系統(tǒng)的實(shí)現(xiàn)方法,其特征在于在物理層,還有一個(gè)塊設(shè)備支持模塊與上述多IO路徑模塊相連所述塊設(shè)備支持模塊,它使iSCSI存儲(chǔ)系統(tǒng)的啟動(dòng)器能連接多種非SCSI設(shè)備,包括虛擬塊設(shè)備,它是通過(guò)把SCSI命令轉(zhuǎn)化到塊IO請(qǐng)求來(lái)實(shí)現(xiàn)的;所述塊設(shè)備模塊依次含有以下執(zhí)行步驟在從中間層接收一個(gè)SCSI命令后,判別該命令的目標(biāo)是否為SCSI設(shè)備,若是,則把該命令發(fā)送給SCSI設(shè)備,返回;若否,則執(zhí)行下一個(gè)步驟;判別該命令是否為查詢(xún)類(lèi)命令,若是,則根據(jù)配置信息返回響應(yīng),再返回;若否,便執(zhí)行下一步驟;判斷該命令是否為讀命令,若是,則分析出LBA和數(shù)據(jù)長(zhǎng)度,再根據(jù)LBA地址算出虛擬設(shè)備中對(duì)應(yīng)的偏移地址;再把偏移地址、數(shù)據(jù)長(zhǎng)度和數(shù)據(jù)緩沖區(qū)地址傳送給塊設(shè)備讀取數(shù)據(jù);等待塊設(shè)備把數(shù)據(jù)寫(xiě)入到數(shù)據(jù)緩沖區(qū)后,塊設(shè)備支持模塊設(shè)置SCSI請(qǐng)求的狀態(tài)域,返回SCSI中間層;若是寫(xiě)命令,則分析出LBA和數(shù)據(jù)長(zhǎng)度后,再把啟動(dòng)器端發(fā)送過(guò)來(lái)的數(shù)據(jù)存放到數(shù)據(jù)緩沖區(qū)中;再根據(jù)LBA地址算出虛擬設(shè)備中對(duì)應(yīng)的偏移地址;把偏移地址、數(shù)據(jù)長(zhǎng)度和數(shù)據(jù)緩沖區(qū)地址傳送給塊設(shè)備對(duì)塊設(shè)備寫(xiě)入SCSI請(qǐng)求的數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù);等待塊設(shè)備層操作成功,塊設(shè)備支持模塊設(shè)置SCSI請(qǐng)求的狀態(tài)域并把它返回SCSI中間層。
4.根據(jù)權(quán)利要求1所述的一種iSCSI存儲(chǔ)系統(tǒng)的實(shí)現(xiàn)方法,其特征在于在中間層中,所述前端目標(biāo)驅(qū)動(dòng)器模塊和IO負(fù)載控制模塊間有一個(gè)存儲(chǔ)設(shè)備映射模塊它提供存儲(chǔ)設(shè)備位置、iSCSI控制器IP地址和啟動(dòng)器IP地址三者的映射關(guān)系,控制啟動(dòng)器對(duì)存儲(chǔ)系統(tǒng)中存儲(chǔ)設(shè)備訪(fǎng)問(wèn)的權(quán)限,據(jù)此,訪(fǎng)問(wèn)權(quán)限分為三種級(jí)別完全訪(fǎng)問(wèn)、只讀訪(fǎng)問(wèn)和禁止訪(fǎng)問(wèn);它對(duì)存儲(chǔ)管理員改變?cè)O(shè)定如下格式的權(quán)限規(guī)劃[源IP地址][源地址掩碼][目的IP地址][Target ID][訪(fǎng)問(wèn)權(quán)限];存儲(chǔ)設(shè)備映射模塊向存儲(chǔ)管理員以PROC形式提供寫(xiě)入或查看規(guī)劃、啟動(dòng)或停止存儲(chǔ)設(shè)備映射模塊的接口;存儲(chǔ)設(shè)備映射模塊把向PROC接口寫(xiě)入的規(guī)劃解析成以上述鏈表形式組織的規(guī)劃,該模塊通過(guò)查詢(xún)這個(gè)鏈表決定一個(gè)啟動(dòng)器對(duì)某個(gè)存儲(chǔ)設(shè)備訪(fǎng)問(wèn)的權(quán)限;所述存儲(chǔ)設(shè)備有映射模塊依次按以下三個(gè)階段實(shí)現(xiàn)映射流程設(shè)備發(fā)現(xiàn)階段,它依次含有以下步驟接收啟動(dòng)器的命令,判斷是否為設(shè)備發(fā)現(xiàn)命令,若否,則返回;若是,則執(zhí)行下一步驟;判斷是否還有存儲(chǔ)設(shè)備,若否,則返回;若有,則執(zhí)行下一步驟;根據(jù)以上規(guī)則判斷啟動(dòng)器對(duì)存儲(chǔ)設(shè)備所標(biāo)識(shí)的權(quán)限;根據(jù)權(quán)限判斷存儲(chǔ)設(shè)備對(duì)啟動(dòng)器是否可見(jiàn),若可見(jiàn),則把設(shè)備標(biāo)識(shí)符填入后向啟動(dòng)器返回存儲(chǔ)設(shè)備列表;否則,返回“是否還有存儲(chǔ)設(shè)備”步驟;參數(shù)協(xié)商階段,它依次含有以下步驟存儲(chǔ)設(shè)備映射模塊從啟動(dòng)器取得連接的客戶(hù)端和服務(wù)器的地址;存儲(chǔ)設(shè)備映射模塊判斷該存儲(chǔ)設(shè)備是否為一個(gè)對(duì)啟動(dòng)器禁止的存儲(chǔ)設(shè)備,若為禁止的存儲(chǔ)設(shè)備,則主動(dòng)中斷該啟動(dòng)器到iSCSI控制器的網(wǎng)絡(luò)連接;否則,進(jìn)行下一階段IO操作;IO請(qǐng)求階段,它依次含有以下步驟判斷SCSI命令是否為寫(xiě)命令。若否轉(zhuǎn)到“對(duì)于讀命令”;對(duì)于寫(xiě)命令,先分配緩沖區(qū),并且根據(jù)規(guī)則設(shè)置這個(gè)命令的權(quán)限,最后把命令放入等待隊(duì)列;接收到數(shù)據(jù)后,把相應(yīng)的SCSI命令從等待隊(duì)列中取出;檢測(cè)命令的權(quán)限,判別該命令可否被執(zhí)行。若是,則把該命令放入分發(fā)隊(duì)列;若否,丟棄該命令并構(gòu)造SCSI響應(yīng)向啟動(dòng)器報(bào)告錯(cuò)誤;對(duì)于讀命令,直接根據(jù)規(guī)則設(shè)置這個(gè)命令的權(quán)限;檢測(cè)命令的權(quán)限,判別該命令可否被執(zhí)行。若是,則把該命令放入分發(fā)隊(duì)列;若否,丟棄該命令并構(gòu)造SCSI響應(yīng)向啟動(dòng)器報(bào)告錯(cuò)誤。
全文摘要
一種iSCSI存儲(chǔ)系統(tǒng)的實(shí)現(xiàn)方法屬于存儲(chǔ)區(qū)域網(wǎng)絡(luò)領(lǐng)域,其特征在于在iSCSI控制器上實(shí)現(xiàn)了iSCSI協(xié)議,它包括實(shí)現(xiàn)不同的負(fù)載均衡方法的網(wǎng)卡綁定模塊、提供固定的虛擬設(shè)備標(biāo)識(shí)符和熱插拔功能的存儲(chǔ)設(shè)備管理模塊、控制低端存儲(chǔ)設(shè)備并行IO負(fù)載的自適應(yīng)IO負(fù)載控制程序以及對(duì)不同的存儲(chǔ)陣列通道進(jìn)行IO請(qǐng)求控制的多IO路徑模塊。必要時(shí),可增設(shè)控制啟動(dòng)器對(duì)存儲(chǔ)設(shè)備的訪(fǎng)問(wèn)權(quán)限的存儲(chǔ)設(shè)備映射模塊、實(shí)現(xiàn)SCSI命令和塊設(shè)備IO相互轉(zhuǎn)化的塊設(shè)備支持模塊以及軟件RAID模塊。它提高了數(shù)據(jù)塊的吞吐率及平均響應(yīng)時(shí)間,在系統(tǒng)可用性及失效容錯(cuò)等也有較大優(yōu)勢(shì)。
文檔編號(hào)H04L29/06GK1633131SQ200510011179
公開(kāi)日2005年6月29日 申請(qǐng)日期2005年1月14日 優(yōu)先權(quán)日2005年1月14日
發(fā)明者舒繼武, 薛巍, 潘家銘, 羅駿, 于冰, 鄭緯民 申請(qǐng)人:清華大學(xué)