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