宋玲玲,蔣澤軍,王麗芳
(西北工業大學計算機學院,西安 710129)
磁盤陣列采用條帶化技術和冗余技術,將多個普通磁盤組織成一個容量更大、訪問速度更快,并具有一定容錯能力的邏輯設備[1]。目前磁盤陣列已經成為構建大型存儲系統的主要設備,磁盤陣列的各項功能通常利用專門的控制器軟件實現[2-3],并能夠以多種終端為多個用戶提供服務。
磁盤陣列管理系統實現各種復雜的RAID(Redundant Array Of Independent Disks)功能,如驅動器管理、RAID 管理、邏輯卷管理、分區管理等。多個用戶和多種功能交織在一起,需要有一個清晰的處理邏輯來保證系統高效、正確的運行。因此,結合具體磁盤陣列控制器的實例,介紹了一種可支持多個用戶通過不同終端并發訪問的磁盤陣列管理系統。該系統以軟件分層設計思想為基礎,充分利用了消息隊列和XML 較強的數據格式表示能力,簡化了軟件的設計和開發,提高了系統的可維護性和擴展性。
用戶可以通過兩種方式來使用磁盤陣列:一種是作為普通用戶,只將磁盤陣列作為存儲設備進行讀寫操作;第二種是作為管理員,主要實現對磁盤陣列的配置、管理。
如圖1 所示。作為普通用戶,主要實現陣列I/O,從上到下依次分為5個模塊[3]:①目標器模塊,接收讀寫命令,并返回應答和數據;②Cache 管理模塊,實現高速緩存功能,通過預讀及回寫優化I/O 性能;③Raid 核心模塊,根據不同RAID 級別的數據布局,將一個邏輯讀寫命令轉換為一個或多個物理讀寫命令,并將返回的數據按RAID 級別進行組織;④I/O 調度模塊,利用聚集技術實現有效的命令整合及I/O 調度;⑤啟動器模塊,完成實際的物理磁盤I/O 操作。
作為管理員,主要完成對陣列I/O 線路中各模塊的配置,如設置緩存策略、RAID 級別、邏輯卷管理等,需要完成陣列管理這條線路,即實現磁盤陣列管理系統。磁盤陣列管理系統是陣列控制器的重要組成部分,分三層實現:①終端配置層,將陣列的信息呈現給管理人員,并將管理員對陣列的配置命令發送給隊列管理層。終端配置層為管理人員提供了三種配置訪問界面:web 配置終端、串口配置終端、LCD 配置終端。②隊列管理層,實現了多種隊列,將多個用戶的請求統一處理,使請求命令的并發操作串行化;并且其上下兩層通過非結構化的消息進行通信,將層間耦合度降到最低,提高了系統的開發效率和可維護性。③全局配置層,實現對磁盤陣列的配置工作,如RAID 配置、邏輯卷配置、通道配置、參數配置等。

圖1 磁盤陣列控制器軟件架構
終端配置層用于生成用戶交互界面,為用戶提供了三種終端訪問方式:Web 界面、串口界面和LCD 界面,每種終端每次只能由一個用戶使用,但是不同的用戶可以同時通過三種終端對陣列進行配置。
終端配置層借鑒MDA(Model Driven Architecture)的思想[4],采用XML(Extensible Markup Language)描述用戶界面。如圖2,界面管理模塊作為核心部分實現了終端配置層的運行邏輯,當一個用戶請求到來時,如果是需要下層處理的配置命令,則把捕獲的界面參數通過界面數據管理模塊封裝成消息加入命令隊列;如果需要進行頁面更新,則調用XML 解析器,解析頁面描述XML 文件,獲取界面靜態元素信息(菜單、列表選項、對話框等),界面的動態信息則是界面數據管理模塊從響應隊列或者報告隊列中獲取的命令響應結果,最后根據頁面布局組裝界面靜態元素和從下層獲取的動態信息形成新的界面。

圖2 終端配置層
基于XML為用戶界面建模,使得用戶界面的開發和維護更加便捷,對于界面管理模塊已經支持的頁面布局,實現一個新的界面只需編寫相應的XML,并且加載新頁面不需要重新編譯程序,實現了界面風格統一的“零編碼”開發。
如圖3,隊列管理層為系統維護一個命令隊列、一個報告隊列和多個響應隊列。不同配置終端把命令發送到同一個命令隊列中,由全局配置模塊統一處理,實現了并發操作的串行化。全局配置模塊將同步命令(如查看RAID 信息等可立即返回的命令)的處理結果填入響應隊列,將異步命令(如創建RAID 等非常耗時的操作)的處理結果或者系統監控到的異常情況填入報告隊列。由于響應隊列較報告隊列應用頻繁,通常為每個配置終端分配一個響應隊列,簡化了隊列中響應信息的解析和分配。
隊列中的基本存儲單元是消息,每條消息都是按照XML 數據組織方式構成的可變長字符串,如下是一條查詢RAID 詳細信息的消息,消息標簽賦予了消息較強的可讀性。

其中標簽的第一個字符代表消息的類型,i 表示整形,f 表示浮點型,s 表示字符串。每條消息可由四部分組成:①操作碼,定義消息對應的操作。②命令索引,隨機生成的整型值,用于區別同一個用戶的不同命令。③響應隊列,指定命令結果的存放隊列。④參數,對于請求命令是指執行命令的參數,對于結果消息是指命令的執行結果信息。

圖3 隊列管理層
基于XML 消息的隊列管理利用共享內存機制實現,分成三個模塊完成:
(1)隊列注冊,為用戶在共享內存中申請隊列空間,并利用三元組(ServiceID,QueueID,Offset)唯一標識用戶所注冊的隊列。其中ServiceID 表示隊列的服務對象,可用于區分多個用戶;QueueID 表示隊列ID,是識別隊列的唯一標識,以易于理解的標識符給出,其中同一個用戶可以同時注冊命令隊列、響應隊列和報告隊列三種不同的隊列,不同的用戶也可以注冊同一個隊列,即命令隊列和報告隊列;Offset是隊列在共享內存中的偏移地址,用于實現邏輯地址到物理地址的轉換。
(2)隊列管理,該模塊采用FIFO的方式對XML消息進行入隊和出隊管理,在隊列操作中不需要處理消息自身,因此對消息隊列的并發訪問效率可明顯提高。同時為了保證臨界資源的一致性,隊列管理模塊還提供了隊列的互斥操作,在操作隊列前加鎖,操作完后解鎖。
(3)隊列消息解析,對外提供XML 格式消息的封裝和解析接口,主要完成各種數據到消息的組裝,以及從消息到所需數據格式的解析。
全局配置層實現磁盤管理系統的業務邏輯,它從命令隊列中讀取命令并進行處理,然后再將處理結果以消息的形式分類放到響應隊列和報告隊列中。全局配置層分5個模塊,分別負責不同的職能:
(1)全局配置信息模塊,該模塊利用共享內存記錄所有的磁盤陣列配置信息,并將這些信息作為一種全局變量供系統各模塊間共享。為了避免共享數據的不一致問題,在對全局配置信息進行操作時,利用Linux 系統的讀- 寫鎖機制對其進行加鎖處理;同時,為了保證全局配置信息在系統重啟后仍有效,需要將配置信息在FLASH 中進行同步。
(2)命令處理模塊,該模塊從命令隊列中逐條讀取命令,并根據全局配置信息模塊提供的信息對命令進行合法性驗證,保證只有合法的命令才會交給陣列配置處理模塊,對于非法命令通過響應隊列通知給用戶。該模塊還負責將陣列配置處理模塊處理過的命令結果返回給用戶,同步命令的結果通過對應的響應隊列返回,異步命令和異常錯誤信息通過報告隊列返回。
(3)陣列配置處理模塊,該模塊包括邏輯驅動器管理、邏輯卷管理和緩存管理等,通過操作相關子設備的數據結構實現真正的配置處理。如對于一個創建RAID的命令,邏輯驅動器管理子模塊將根據請求命令中的參數信息(RAID 級別,磁盤個數,各磁盤ID 等)和特定RAID 級別的布局特征,在內核中構造讀寫和控制RAID 所需的結構體。
(4)日志管理模塊,該模塊記錄了對系統的配置命令,主要用于保證系統的一致性,當系統出現掉電等異常情況時,能夠根據日志記錄信息,將系統恢復到最近的一個一致性狀態。
(5)監控信息模塊,該模塊實時監控系統內核信息,保證及時發現并處理磁盤陣列運行期間所出現的各種軟硬件故障,根據故障影響程度的不同,可以分為主動警告和降級運行的處理方式,用戶通過查看可以獲得詳細的異常信息。

圖4 全局配置層
詳細介紹了一個可支持多終端并發操作的磁盤陣列管理系統的設計與實現。該系統除了具有分層架構所帶來的良好的可擴展性和可維護性外,還具有如下三個特點:
(1)將隊列管理納入軟件分層實現中,上下層之間通過消息進行通信,系統的維護和擴展只需要保證消息的正確性即可;并且下層將上層多個用戶的命令統一處理,這也從根源上解決了并發請求帶來的沖突問題。例如,A 和B 同時請求用磁盤1 和2 創建RAID0,如果全局配置層先對A 命令進行了處理,則輪到B 命令時,通過全局配置信息的檢查將發現這是一個不合法的命令,直接返回錯誤信息。
(2)采用XML 文檔描述消息,簡化了結構體在消息中的表示,降低了消息發送方和接收方的依賴性,不用雙方逐條協商消息的長度、順序等內容,大大提高了系統開發的效率。
(3)利用XML為用戶界面建模,開發一個新的界面只需要編寫相應的XML 文檔即可,簡化了開發工作;而且每加入一種新的配置終端,只需要開發新的界面管理模塊即可,提高了系統的復用性和擴展性。
[1]David A.Patterson,Garth Gibson,Randy H.Katz.A case for redundant arrays of inexpensive Disks(RAID)[C].Proceedings of the 1988 ACM SIGMOD International Conference on Management of Data.Chicago,Illinois:ACM Press,1988.
[2]魏沁祺,謝長生,劉瑞芳.基于結構化模型的高性能RAID 系統的設計與實現[J].小型微型計算機系統,2007,28(2):376-380.
[3]謝長生,董曉明,萬繼光,等.磁盤陣列控制器的設計與原型實現[J].小型微型計算機系統,2006,27(1):171-174.
[4][美]Timothy J.Grose,Gary C.Doney,Stephen A.Brodsky.Mastering XMI[M].徐強,金艷紅,譯.北京:電子工業出版社,2004.