宋玲玲,蔣澤軍,王麗芳
(西北工業(yè)大學(xué)計(jì)算機(jī)學(xué)院,西安 710129)
磁盤陣列采用條帶化技術(shù)和冗余技術(shù),將多個(gè)普通磁盤組織成一個(gè)容量更大、訪問速度更快,并具有一定容錯(cuò)能力的邏輯設(shè)備[1]。目前磁盤陣列已經(jīng)成為構(gòu)建大型存儲(chǔ)系統(tǒng)的主要設(shè)備,磁盤陣列的各項(xiàng)功能通常利用專門的控制器軟件實(shí)現(xiàn)[2-3],并能夠以多種終端為多個(gè)用戶提供服務(wù)。
磁盤陣列管理系統(tǒng)實(shí)現(xiàn)各種復(fù)雜的RAID(Redundant Array Of Independent Disks)功能,如驅(qū)動(dòng)器管理、RAID 管理、邏輯卷管理、分區(qū)管理等。多個(gè)用戶和多種功能交織在一起,需要有一個(gè)清晰的處理邏輯來保證系統(tǒng)高效、正確的運(yùn)行。因此,結(jié)合具體磁盤陣列控制器的實(shí)例,介紹了一種可支持多個(gè)用戶通過不同終端并發(fā)訪問的磁盤陣列管理系統(tǒng)。該系統(tǒng)以軟件分層設(shè)計(jì)思想為基礎(chǔ),充分利用了消息隊(duì)列和XML 較強(qiáng)的數(shù)據(jù)格式表示能力,簡化了軟件的設(shè)計(jì)和開發(fā),提高了系統(tǒng)的可維護(hù)性和擴(kuò)展性。
用戶可以通過兩種方式來使用磁盤陣列:一種是作為普通用戶,只將磁盤陣列作為存儲(chǔ)設(shè)備進(jìn)行讀寫操作;第二種是作為管理員,主要實(shí)現(xiàn)對(duì)磁盤陣列的配置、管理。
如圖1 所示。作為普通用戶,主要實(shí)現(xiàn)陣列I/O,從上到下依次分為5個(gè)模塊[3]:①目標(biāo)器模塊,接收讀寫命令,并返回應(yīng)答和數(shù)據(jù);②Cache 管理模塊,實(shí)現(xiàn)高速緩存功能,通過預(yù)讀及回寫優(yōu)化I/O 性能;③Raid 核心模塊,根據(jù)不同RAID 級(jí)別的數(shù)據(jù)布局,將一個(gè)邏輯讀寫命令轉(zhuǎn)換為一個(gè)或多個(gè)物理讀寫命令,并將返回的數(shù)據(jù)按RAID 級(jí)別進(jìn)行組織;④I/O 調(diào)度模塊,利用聚集技術(shù)實(shí)現(xiàn)有效的命令整合及I/O 調(diào)度;⑤啟動(dòng)器模塊,完成實(shí)際的物理磁盤I/O 操作。
作為管理員,主要完成對(duì)陣列I/O 線路中各模塊的配置,如設(shè)置緩存策略、RAID 級(jí)別、邏輯卷管理等,需要完成陣列管理這條線路,即實(shí)現(xiàn)磁盤陣列管理系統(tǒng)。磁盤陣列管理系統(tǒng)是陣列控制器的重要組成部分,分三層實(shí)現(xiàn):①終端配置層,將陣列的信息呈現(xiàn)給管理人員,并將管理員對(duì)陣列的配置命令發(fā)送給隊(duì)列管理層。終端配置層為管理人員提供了三種配置訪問界面:web 配置終端、串口配置終端、LCD 配置終端。②隊(duì)列管理層,實(shí)現(xiàn)了多種隊(duì)列,將多個(gè)用戶的請(qǐng)求統(tǒng)一處理,使請(qǐng)求命令的并發(fā)操作串行化;并且其上下兩層通過非結(jié)構(gòu)化的消息進(jìn)行通信,將層間耦合度降到最低,提高了系統(tǒng)的開發(fā)效率和可維護(hù)性。③全局配置層,實(shí)現(xiàn)對(duì)磁盤陣列的配置工作,如RAID 配置、邏輯卷配置、通道配置、參數(shù)配置等。
圖1 磁盤陣列控制器軟件架構(gòu)
終端配置層用于生成用戶交互界面,為用戶提供了三種終端訪問方式:Web 界面、串口界面和LCD 界面,每種終端每次只能由一個(gè)用戶使用,但是不同的用戶可以同時(shí)通過三種終端對(duì)陣列進(jìn)行配置。
終端配置層借鑒MDA(Model Driven Architecture)的思想[4],采用XML(Extensible Markup Language)描述用戶界面。如圖2,界面管理模塊作為核心部分實(shí)現(xiàn)了終端配置層的運(yùn)行邏輯,當(dāng)一個(gè)用戶請(qǐng)求到來時(shí),如果是需要下層處理的配置命令,則把捕獲的界面參數(shù)通過界面數(shù)據(jù)管理模塊封裝成消息加入命令隊(duì)列;如果需要進(jìn)行頁面更新,則調(diào)用XML 解析器,解析頁面描述XML 文件,獲取界面靜態(tài)元素信息(菜單、列表選項(xiàng)、對(duì)話框等),界面的動(dòng)態(tài)信息則是界面數(shù)據(jù)管理模塊從響應(yīng)隊(duì)列或者報(bào)告隊(duì)列中獲取的命令響應(yīng)結(jié)果,最后根據(jù)頁面布局組裝界面靜態(tài)元素和從下層獲取的動(dòng)態(tài)信息形成新的界面。
圖2 終端配置層
基于XML為用戶界面建模,使得用戶界面的開發(fā)和維護(hù)更加便捷,對(duì)于界面管理模塊已經(jīng)支持的頁面布局,實(shí)現(xiàn)一個(gè)新的界面只需編寫相應(yīng)的XML,并且加載新頁面不需要重新編譯程序,實(shí)現(xiàn)了界面風(fēng)格統(tǒng)一的“零編碼”開發(fā)。
如圖3,隊(duì)列管理層為系統(tǒng)維護(hù)一個(gè)命令隊(duì)列、一個(gè)報(bào)告隊(duì)列和多個(gè)響應(yīng)隊(duì)列。不同配置終端把命令發(fā)送到同一個(gè)命令隊(duì)列中,由全局配置模塊統(tǒng)一處理,實(shí)現(xiàn)了并發(fā)操作的串行化。全局配置模塊將同步命令(如查看RAID 信息等可立即返回的命令)的處理結(jié)果填入響應(yīng)隊(duì)列,將異步命令(如創(chuàng)建RAID 等非常耗時(shí)的操作)的處理結(jié)果或者系統(tǒng)監(jiān)控到的異常情況填入報(bào)告隊(duì)列。由于響應(yīng)隊(duì)列較報(bào)告隊(duì)列應(yīng)用頻繁,通常為每個(gè)配置終端分配一個(gè)響應(yīng)隊(duì)列,簡化了隊(duì)列中響應(yīng)信息的解析和分配。
隊(duì)列中的基本存儲(chǔ)單元是消息,每條消息都是按照XML 數(shù)據(jù)組織方式構(gòu)成的可變長字符串,如下是一條查詢RAID 詳細(xì)信息的消息,消息標(biāo)簽賦予了消息較強(qiáng)的可讀性。
其中標(biāo)簽的第一個(gè)字符代表消息的類型,i 表示整形,f 表示浮點(diǎn)型,s 表示字符串。每條消息可由四部分組成:①操作碼,定義消息對(duì)應(yīng)的操作。②命令索引,隨機(jī)生成的整型值,用于區(qū)別同一個(gè)用戶的不同命令。③響應(yīng)隊(duì)列,指定命令結(jié)果的存放隊(duì)列。④參數(shù),對(duì)于請(qǐng)求命令是指執(zhí)行命令的參數(shù),對(duì)于結(jié)果消息是指命令的執(zhí)行結(jié)果信息。
圖3 隊(duì)列管理層
基于XML 消息的隊(duì)列管理利用共享內(nèi)存機(jī)制實(shí)現(xiàn),分成三個(gè)模塊完成:
(1)隊(duì)列注冊(cè),為用戶在共享內(nèi)存中申請(qǐng)隊(duì)列空間,并利用三元組(ServiceID,QueueID,Offset)唯一標(biāo)識(shí)用戶所注冊(cè)的隊(duì)列。其中ServiceID 表示隊(duì)列的服務(wù)對(duì)象,可用于區(qū)分多個(gè)用戶;QueueID 表示隊(duì)列ID,是識(shí)別隊(duì)列的唯一標(biāo)識(shí),以易于理解的標(biāo)識(shí)符給出,其中同一個(gè)用戶可以同時(shí)注冊(cè)命令隊(duì)列、響應(yīng)隊(duì)列和報(bào)告隊(duì)列三種不同的隊(duì)列,不同的用戶也可以注冊(cè)同一個(gè)隊(duì)列,即命令隊(duì)列和報(bào)告隊(duì)列;Offset是隊(duì)列在共享內(nèi)存中的偏移地址,用于實(shí)現(xiàn)邏輯地址到物理地址的轉(zhuǎn)換。
(2)隊(duì)列管理,該模塊采用FIFO的方式對(duì)XML消息進(jìn)行入隊(duì)和出隊(duì)管理,在隊(duì)列操作中不需要處理消息自身,因此對(duì)消息隊(duì)列的并發(fā)訪問效率可明顯提高。同時(shí)為了保證臨界資源的一致性,隊(duì)列管理模塊還提供了隊(duì)列的互斥操作,在操作隊(duì)列前加鎖,操作完后解鎖。
(3)隊(duì)列消息解析,對(duì)外提供XML 格式消息的封裝和解析接口,主要完成各種數(shù)據(jù)到消息的組裝,以及從消息到所需數(shù)據(jù)格式的解析。
全局配置層實(shí)現(xiàn)磁盤管理系統(tǒng)的業(yè)務(wù)邏輯,它從命令隊(duì)列中讀取命令并進(jìn)行處理,然后再將處理結(jié)果以消息的形式分類放到響應(yīng)隊(duì)列和報(bào)告隊(duì)列中。全局配置層分5個(gè)模塊,分別負(fù)責(zé)不同的職能:
(1)全局配置信息模塊,該模塊利用共享內(nèi)存記錄所有的磁盤陣列配置信息,并將這些信息作為一種全局變量供系統(tǒng)各模塊間共享。為了避免共享數(shù)據(jù)的不一致問題,在對(duì)全局配置信息進(jìn)行操作時(shí),利用Linux 系統(tǒng)的讀- 寫鎖機(jī)制對(duì)其進(jìn)行加鎖處理;同時(shí),為了保證全局配置信息在系統(tǒng)重啟后仍有效,需要將配置信息在FLASH 中進(jìn)行同步。
(2)命令處理模塊,該模塊從命令隊(duì)列中逐條讀取命令,并根據(jù)全局配置信息模塊提供的信息對(duì)命令進(jìn)行合法性驗(yàn)證,保證只有合法的命令才會(huì)交給陣列配置處理模塊,對(duì)于非法命令通過響應(yīng)隊(duì)列通知給用戶。該模塊還負(fù)責(zé)將陣列配置處理模塊處理過的命令結(jié)果返回給用戶,同步命令的結(jié)果通過對(duì)應(yīng)的響應(yīng)隊(duì)列返回,異步命令和異常錯(cuò)誤信息通過報(bào)告隊(duì)列返回。
(3)陣列配置處理模塊,該模塊包括邏輯驅(qū)動(dòng)器管理、邏輯卷管理和緩存管理等,通過操作相關(guān)子設(shè)備的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)真正的配置處理。如對(duì)于一個(gè)創(chuàng)建RAID的命令,邏輯驅(qū)動(dòng)器管理子模塊將根據(jù)請(qǐng)求命令中的參數(shù)信息(RAID 級(jí)別,磁盤個(gè)數(shù),各磁盤ID 等)和特定RAID 級(jí)別的布局特征,在內(nèi)核中構(gòu)造讀寫和控制RAID 所需的結(jié)構(gòu)體。
(4)日志管理模塊,該模塊記錄了對(duì)系統(tǒng)的配置命令,主要用于保證系統(tǒng)的一致性,當(dāng)系統(tǒng)出現(xiàn)掉電等異常情況時(shí),能夠根據(jù)日志記錄信息,將系統(tǒng)恢復(fù)到最近的一個(gè)一致性狀態(tài)。
(5)監(jiān)控信息模塊,該模塊實(shí)時(shí)監(jiān)控系統(tǒng)內(nèi)核信息,保證及時(shí)發(fā)現(xiàn)并處理磁盤陣列運(yùn)行期間所出現(xiàn)的各種軟硬件故障,根據(jù)故障影響程度的不同,可以分為主動(dòng)警告和降級(jí)運(yùn)行的處理方式,用戶通過查看可以獲得詳細(xì)的異常信息。
圖4 全局配置層
詳細(xì)介紹了一個(gè)可支持多終端并發(fā)操作的磁盤陣列管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)。該系統(tǒng)除了具有分層架構(gòu)所帶來的良好的可擴(kuò)展性和可維護(hù)性外,還具有如下三個(gè)特點(diǎn):
(1)將隊(duì)列管理納入軟件分層實(shí)現(xiàn)中,上下層之間通過消息進(jìn)行通信,系統(tǒng)的維護(hù)和擴(kuò)展只需要保證消息的正確性即可;并且下層將上層多個(gè)用戶的命令統(tǒng)一處理,這也從根源上解決了并發(fā)請(qǐng)求帶來的沖突問題。例如,A 和B 同時(shí)請(qǐng)求用磁盤1 和2 創(chuàng)建RAID0,如果全局配置層先對(duì)A 命令進(jìn)行了處理,則輪到B 命令時(shí),通過全局配置信息的檢查將發(fā)現(xiàn)這是一個(gè)不合法的命令,直接返回錯(cuò)誤信息。
(2)采用XML 文檔描述消息,簡化了結(jié)構(gòu)體在消息中的表示,降低了消息發(fā)送方和接收方的依賴性,不用雙方逐條協(xié)商消息的長度、順序等內(nèi)容,大大提高了系統(tǒng)開發(fā)的效率。
(3)利用XML為用戶界面建模,開發(fā)一個(gè)新的界面只需要編寫相應(yīng)的XML 文檔即可,簡化了開發(fā)工作;而且每加入一種新的配置終端,只需要開發(fā)新的界面管理模塊即可,提高了系統(tǒng)的復(fù)用性和擴(kuò)展性。
[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]魏沁祺,謝長生,劉瑞芳.基于結(jié)構(gòu)化模型的高性能RAID 系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].小型微型計(jì)算機(jī)系統(tǒng),2007,28(2):376-380.
[3]謝長生,董曉明,萬繼光,等.磁盤陣列控制器的設(shè)計(jì)與原型實(shí)現(xiàn)[J].小型微型計(jì)算機(jī)系統(tǒng),2006,27(1):171-174.
[4][美]Timothy J.Grose,Gary C.Doney,Stephen A.Brodsky.Mastering XMI[M].徐強(qiáng),金艷紅,譯.北京:電子工業(yè)出版社,2004.