范長(zhǎng)軍,胡志成,楊佳東
(中電海康集團(tuán)有限公司,杭州 310013)
基于ALUA的多路徑存儲(chǔ)系統(tǒng)①
范長(zhǎng)軍,胡志成,楊佳東
(中電??导瘓F(tuán)有限公司,杭州 310013)
隨著網(wǎng)絡(luò)存儲(chǔ)技術(shù)的不斷深入發(fā)展與廣泛應(yīng)用,存儲(chǔ)多路徑技術(shù)成為信息系統(tǒng)容災(zāi)與故障恢復(fù)方案中的核心技術(shù)之一.在現(xiàn)有存儲(chǔ)多路徑技術(shù)的基礎(chǔ)上,提出了一種基于ALUA的多路徑存儲(chǔ)子系統(tǒng)總體框架,并重點(diǎn)在邏輯卷控制器屬主管理、ALUA屬性與路徑選擇策略配置和I/O重定向等模塊進(jìn)行了創(chuàng)新性的設(shè)計(jì)與實(shí)現(xiàn).經(jīng)過(guò)應(yīng)用測(cè)試,該系統(tǒng)很好地解決了存儲(chǔ)系統(tǒng)的路徑故障遷移和故障恢復(fù)問(wèn)題,并智能地實(shí)現(xiàn)了路徑間I/O的負(fù)載均衡,極大地提高了性能和可靠性.
多路徑; ALUA 屬性; I/O 重定向; 負(fù)載均衡; 故障遷移; 故障恢復(fù)
隨著移動(dòng)互聯(lián)網(wǎng)、社交網(wǎng)絡(luò)等新型IT技術(shù)的發(fā)展,可用數(shù)據(jù)總量呈幾何級(jí)增長(zhǎng),人類進(jìn)入大數(shù)據(jù)時(shí)代.大數(shù)據(jù)中蘊(yùn)含的知識(shí)是寶貴的社會(huì)財(cái)富,但其價(jià)值的體現(xiàn)依賴于對(duì)數(shù)據(jù)的可靠存儲(chǔ)和高效處理,這對(duì)存儲(chǔ)系統(tǒng)的可用性、可靠性和存取效率提出了新的挑戰(zhàn),為此,SAN (Storage area network)網(wǎng)絡(luò)存儲(chǔ)技術(shù)應(yīng)運(yùn)而生,并得到大力發(fā)展和廣泛應(yīng)用.
在SAN系統(tǒng)中,有兩個(gè)基本實(shí)體,發(fā)起端和目標(biāo)端.發(fā)起端主動(dòng)發(fā)起I/O命令請(qǐng)求存儲(chǔ)資源,目標(biāo)端響應(yīng)存取命令.發(fā)起端可以是應(yīng)用服務(wù)器、個(gè)人PC機(jī)等各種有存儲(chǔ)需求的實(shí)體,目標(biāo)端主要是磁盤陣列、磁帶庫(kù)等存儲(chǔ)實(shí)體,兩端由光纖通過(guò)(網(wǎng)絡(luò)、FC等)交換機(jī)連接起來(lái)形成I/O路徑,構(gòu)成發(fā)起端與目標(biāo)端通信的橋梁.在I/O子系統(tǒng)中,單路徑I/O傳輸錯(cuò)誤是導(dǎo)致系統(tǒng)單點(diǎn)失效的根源,它難以滿足現(xiàn)代存儲(chǔ)對(duì)系統(tǒng)可用性和可靠性的要求; 同時(shí),在單路徑場(chǎng)景中,數(shù)據(jù)只能擁堵在一條I/O通道中傳輸,成為性能的瓶頸.為了提高性能和可靠性,在從主機(jī)到交換機(jī)到存儲(chǔ)控制器的鏈路中,一般采用冗余的部件,使對(duì)存儲(chǔ)設(shè)備的I/O操作可以在多條路徑上執(zhí)行,由此發(fā)展出I/O多路徑技術(shù),以期解決故障切換和負(fù)載均衡問(wèn)題.
目前,國(guó)內(nèi)外都有多路徑技術(shù)的研究工作,主要集中在一些存儲(chǔ)廠商,如EMC、NetApp、HP、IBM等,一些大學(xué)、研究機(jī)構(gòu)也在參與[1].本文在現(xiàn)有存儲(chǔ)多路徑技術(shù)的基礎(chǔ)上設(shè)計(jì)和實(shí)現(xiàn)了一種基于ALUA的多路徑存儲(chǔ)子系統(tǒng),它支持I/O的故障遷移和負(fù)載均衡等功能,同時(shí)具備高性能、可靠性以及高擴(kuò)展性.
在現(xiàn)代網(wǎng)絡(luò)存儲(chǔ)環(huán)境中,為了提高存儲(chǔ)系統(tǒng)的可靠性,通常會(huì)使用冗余的物理組件(如適配器、電纜或交換機(jī)等)連接服務(wù)器主機(jī)與存儲(chǔ)設(shè)備,所以在主機(jī)系統(tǒng)到存儲(chǔ)陣列控制器間會(huì)存在多條物理鏈路(SAN存儲(chǔ)網(wǎng)絡(luò)多路徑連接示意圖如圖1所示).通過(guò)這些物理鏈路,存儲(chǔ)陣列上的塊設(shè)備被映射給主機(jī)系統(tǒng),在默認(rèn)情況下,主機(jī)系統(tǒng)將每條路徑映射的塊設(shè)備都認(rèn)作一個(gè)實(shí)際的物理盤,而本質(zhì)上它們只是通向同一個(gè)物理盤的不同路徑.主機(jī)端在對(duì)這一虛擬的塊設(shè)備進(jìn)行訪問(wèn)時(shí),可以在多個(gè)物理鏈路中選擇一個(gè)下發(fā)指令,即便出現(xiàn)其中一條路徑斷掉的單點(diǎn)故障,還有其它物理路徑可以保證主機(jī)業(yè)務(wù)的正常執(zhí)行,提升了存儲(chǔ)系統(tǒng)整體的可靠性.同時(shí),多路徑軟件也可通過(guò)自動(dòng)監(jiān)控和動(dòng)態(tài)分流數(shù)據(jù)I/O,實(shí)現(xiàn)傳輸速率的提高.
圖1 SAN 存儲(chǔ)網(wǎng)絡(luò)多路徑連接示意圖
鑒于多路徑技術(shù)的諸多優(yōu)點(diǎn),各大存儲(chǔ)廠商如EMC、華為等也將其納入標(biāo)準(zhǔn)配置,對(duì)該技術(shù)的應(yīng)用和研究也一直比較熱門.目前多路徑技術(shù)研究主要集中在兩方面,一方面是主機(jī)端多路徑軟件的設(shè)計(jì)與實(shí)現(xiàn),如文獻(xiàn)[2,3]分別介紹了現(xiàn)有的各種主機(jī)端多路徑實(shí)現(xiàn)方法,文獻(xiàn)[4-7]分別在不同的層面,用不同的方式設(shè)計(jì)和實(shí)現(xiàn)了主機(jī)多路徑; 另一方面是多路徑軟件的特定應(yīng)用,如文獻(xiàn)[8]將不同模式的磁盤陣列與不同多路徑軟件搭配使用,文獻(xiàn)[9]將多路徑技術(shù)與虛擬化、集群等軟件配合使用,文獻(xiàn)[10-12]分別將多路徑應(yīng)用到電臺(tái)廣播和地震資料處理集群中.
這些多路徑方案在各自的領(lǐng)域針對(duì)不同應(yīng)用場(chǎng)景能夠很好的滿足需要,但是都存在各自的問(wèn)題.首先,多路徑技術(shù)涉及諸多方面,包括主機(jī)系統(tǒng)和存儲(chǔ)系統(tǒng)等,它們相互配合共同實(shí)現(xiàn)相應(yīng)功能,而現(xiàn)有方案往往只著眼于主機(jī)端的多路徑軟件,沒(méi)有從整體上考量.其次,一部分方案是將現(xiàn)有的多路徑技術(shù)應(yīng)用到某一個(gè)特定的領(lǐng)域,并未對(duì)多路徑技術(shù)進(jìn)行升級(jí)和優(yōu)化.
為應(yīng)對(duì)上述問(wèn)題,本文設(shè)計(jì)并實(shí)現(xiàn)了一整套的多路徑存儲(chǔ)子系統(tǒng),它具備如下特點(diǎn):
? 高性能,高度負(fù)載均衡和高聚合帶寬;
? 高擴(kuò)展性,支持鏈路、交換機(jī)和HBA卡等的擴(kuò)展;
? 高可靠性,鏈路冗余和路徑選擇策略避免了單點(diǎn)故障.
在多路徑典型應(yīng)用場(chǎng)景中,存儲(chǔ)陣列中的物理磁盤通過(guò)存儲(chǔ)控制器上運(yùn)行的RAID程序組成RAID組,再將RAID組中的存儲(chǔ)池劃分為存儲(chǔ)單元,稱為L(zhǎng)UN(Logical unit number,又稱邏輯卷),存儲(chǔ)設(shè)備將 LUN提供給主機(jī)進(jìn)行I/O訪問(wèn).存儲(chǔ)控制器是多路徑I/O的目標(biāo)端,對(duì)于多路徑的故障切換和負(fù)載均衡起著至關(guān)重要的作用.存儲(chǔ)設(shè)備一般包含兩臺(tái)或更多的存儲(chǔ)控制器,以達(dá)到冗余配置,每臺(tái)存儲(chǔ)控制器又有多個(gè)存儲(chǔ)端口,以方便連接前端主機(jī)或存儲(chǔ)網(wǎng)絡(luò)交換機(jī),從而形成多條鏈路.當(dāng)采用多條鏈路時(shí),多條傳輸路徑可同時(shí)傳輸數(shù)據(jù)塊,以解決單條鏈路的傳輸能力有限的問(wèn)題.
本文提出的方案對(duì)存儲(chǔ)系統(tǒng)進(jìn)行多路徑組網(wǎng),實(shí)現(xiàn)下述一整套的流程.主機(jī)啟動(dòng)時(shí)系統(tǒng)通過(guò)掃描,發(fā)現(xiàn)每條路徑上的塊設(shè)備,并記錄路徑狀態(tài)等相關(guān)信息.對(duì)于每個(gè)塊設(shè)備(LUN),主機(jī)端多路徑軟件下發(fā)命令,查詢它的所屬控制器,并將主機(jī)到其控制器屬主之間的路徑作為優(yōu)先選擇路徑,即主路徑.如果主機(jī)到其所屬控制器之間有多條路徑,I/O就會(huì)被多路徑軟件分?jǐn)偟礁鳁l路徑上,以期提高存儲(chǔ)系統(tǒng)的整體性能.如圖1所示,當(dāng)主路徑(如路徑1)由于控制器A宕機(jī)而失效后,存儲(chǔ)端自動(dòng)將業(yè)務(wù)通過(guò)failover切換到控制器B,隨之主機(jī)端多路徑軟件將I/O切換到備用路徑(路徑3),避免因單點(diǎn)故障而造成業(yè)務(wù)中斷.當(dāng)控制器A的故障得以解除或修復(fù)后,存儲(chǔ)業(yè)務(wù)通過(guò)failback切換回控制器A,并由主機(jī)端多路徑將I/O從備用路徑切換回主路徑.
總體而言,多路徑技術(shù)涉及從主機(jī)到存儲(chǔ)陣列之間的各類實(shí)體.邏輯卷所屬控制器的設(shè)定會(huì)影響其在ALUA機(jī)制下目標(biāo)端口組的配置,此兩者與主機(jī)端路徑選擇策略相配合,共同實(shí)現(xiàn)多路徑功能.因此,多路徑存儲(chǔ)子系統(tǒng)的設(shè)計(jì)需要從系統(tǒng)論角度來(lái)考慮,由總到分、自頂向下地進(jìn)行,并充分考慮各個(gè)模塊之間的相互促進(jìn)與制約,在保證故障轉(zhuǎn)移功能的基礎(chǔ)上,盡最大努力實(shí)現(xiàn)負(fù)載均衡,從根本上改善系統(tǒng)I/O性能.
本文提出了一種新的基于ALUA的多路徑存儲(chǔ)子系統(tǒng)架構(gòu),包括系統(tǒng)管理模塊、ALUA屬性配置模塊、路徑選擇策略管理模塊和I/O重定向模塊等.系統(tǒng)管理模塊負(fù)責(zé)整個(gè)存儲(chǔ)陣列的存儲(chǔ)資源管理,其中與多路徑相關(guān)的是LUN的控制器屬主信息,它是實(shí)現(xiàn)不同I/O路徑優(yōu)先級(jí)的關(guān)鍵因素; ALUA屬性配置模塊就是據(jù)此來(lái)設(shè)置其對(duì)應(yīng)的目標(biāo)端口和目標(biāo)端口組的,它與路徑選擇策略管理模塊一起為I/O規(guī)劃下發(fā)路徑,以保證不同I/O路徑間的負(fù)載均衡和單條路徑I/O性能的最優(yōu)化; 當(dāng)進(jìn)行了上述的設(shè)定之后,I/O只能通過(guò)主存儲(chǔ)控制器下盤,分發(fā)到冗余存儲(chǔ)控制器的I/O需要重定向模塊將其轉(zhuǎn)發(fā)給所屬控制器.具體的多路徑存儲(chǔ)子系統(tǒng)架構(gòu)如圖2所示.
具體而言,在系統(tǒng)管理模塊,本文提出了一種邏輯卷控制器屬主的自動(dòng)分配和智能均衡方法,通過(guò)收集各存儲(chǔ)控制器上的I/O信息來(lái)動(dòng)態(tài)分配LUN到各存儲(chǔ)控制器上; 其次,在底層存儲(chǔ)中,基于ALUA機(jī)制提出了一種LUN目標(biāo)端口和目標(biāo)端口組的配置方式,根據(jù)LUN的控制器屬主信息,來(lái)規(guī)劃路徑的優(yōu)先級(jí); 再次,在底層存儲(chǔ)中,開(kāi)發(fā)了I/O重定向模塊,在I/O從非所屬控制器下發(fā)時(shí),通過(guò)內(nèi)部端口將I/O轉(zhuǎn)發(fā)到所屬控制器; 最后,在路徑選擇策略管理模塊中,根據(jù)底層存儲(chǔ)ALUA屬性的配置,設(shè)置了相應(yīng)的路徑管理策略,并開(kāi)發(fā)了新的路徑選擇算法.通過(guò)對(duì)上述方案的設(shè)計(jì)與開(kāi)發(fā),更好地實(shí)現(xiàn)了I/O路徑的故障轉(zhuǎn)移和負(fù)載均衡功能.
在多控制器存儲(chǔ)陣列中,主機(jī)在訪問(wèn)存儲(chǔ)設(shè)備邏輯單元(LUN)時(shí),由于LUN存在控制器屬主的概念,下發(fā)給不同LUN的I/O將選擇不同的路徑,這會(huì)造成各控制器I/O負(fù)載和性能的不同.為了充分利用存儲(chǔ)資源,提高性能和可靠性,實(shí)現(xiàn)故障切換和負(fù)載均衡,需要一種有效的配置方案.
目前,多控制器存儲(chǔ)陣列的LUN屬主和多路徑配置方案多種多樣,各廠商都有自己的多路徑軟件和LUN屬主配置子系統(tǒng),種類繁多、配置復(fù)雜,并且存在以下問(wèn)題:傳統(tǒng)的LUN控制器屬主的配置都是通過(guò)系統(tǒng)管理界面人為手動(dòng)操作的,由于難于全面掌握各控制器的狀態(tài)信息,管理員很難有效地進(jìn)行所屬控制器的劃分.這有可能導(dǎo)致I/O在一臺(tái)控制器上擁堵或饑餓的極端情況,極大地?fù)p耗了性能,對(duì)可用性也造成了一定的影響.
為解決上述問(wèn)題,本文提出了一種多控制器存儲(chǔ)設(shè)備邏輯卷屬主管理方法.在雙控制器場(chǎng)景下,創(chuàng)建LUN之前,首先收集各控制器的I/O統(tǒng)計(jì)信息,并根據(jù)設(shè)定的算法決定相應(yīng)的控制器屬主,然后據(jù)此通過(guò)ALUA進(jìn)行存儲(chǔ)端口和端口組的配置,為L(zhǎng)UN提供路徑訪問(wèn)的優(yōu)先級(jí)機(jī)制.最后,當(dāng)新創(chuàng)建的 LUN 投入使用后,反饋并更新各控制器的I/O統(tǒng)計(jì)信息.具體參看圖3.
圖3 LUN 控制器屬主管理流程
具體而言,首先采集各個(gè)控制器的基本I/O信息,包括帶寬、IOPS等; 然后通過(guò)一定的統(tǒng)計(jì)方法計(jì)算求取均值、方差和積分等性能表征參數(shù); 接著,將給定的決策因子與表征向量進(jìn)行加權(quán)平均計(jì)算,得到每個(gè)控制器的決策指數(shù); 最后,選取指數(shù)較大的控制器為新建卷的控制器屬主.
根據(jù)存儲(chǔ)的特性,選取各個(gè)控制器的帶寬、IOPS、LUN數(shù)目、LUN總?cè)萘?、總I/O error率、故障率、I/O突發(fā)率、總I/O量、I/O集中度、吞吐量等來(lái)作為性能指標(biāo),計(jì)算并表示其性能表征參數(shù)為 X={x1,…,xi,…,xn}.為了消除數(shù)值量綱不同造成的影響,將數(shù)據(jù)進(jìn)行歸一化處理.Xi與Yi分別表示雙端控制器各自的第i個(gè)參數(shù).
權(quán)重系數(shù)?={ω1,…,ωi,…,ωn}可由管理員根據(jù)應(yīng)用場(chǎng)景的不同而設(shè)置不同的值,以決定主要的影響因素.例如,兩個(gè)控制器的 LUN 的總帶寬均值相同,但是其方差有較大差別,而且一邊的I/O突發(fā)率明顯高于對(duì)端,如果新建的LUN主要應(yīng)用于平滑的I/O順序讀寫,則應(yīng)該將I/O突發(fā)率和方差對(duì)應(yīng)項(xiàng)的權(quán)重系數(shù)提高.
進(jìn)一步地,當(dāng)配置信息的數(shù)據(jù)積累到一定程度時(shí),可以用線性回歸的方法來(lái)學(xué)習(xí)得到?jīng)Q策因子,自適應(yīng)地得到各項(xiàng)參數(shù),增加子系統(tǒng)的智能性和自動(dòng)化程度.
兩個(gè)控制器通過(guò)加權(quán)求和公式(如公式(1)所示)得到一個(gè)決策指數(shù),比較兩個(gè)決策指數(shù),數(shù)值較大的控制器為新建邏輯卷的所屬控制器.
分配好新建LUN的控制器屬主后,接下來(lái)在安裝了LIO(Linux-IO target)模塊的存儲(chǔ)端控制器上進(jìn)行端口組的劃分和ALUA的配置.
ALUA(Asymmetric logical unit access)的全稱是非對(duì)稱邏輯單元訪問(wèn),是SPC-4協(xié)議的一個(gè)重要組成部分,主要應(yīng)用于某個(gè)存儲(chǔ)資源(LUN)具備多條訪問(wèn)路徑的環(huán)境下.在本文,I/O性能在LUN所屬控制器對(duì)應(yīng)的路徑上會(huì)更好,不同路徑具備不同的訪問(wèn)特性,使用ALUA來(lái)規(guī)定路徑訪問(wèn)的優(yōu)先級(jí),確保在正常情況下讀寫指令都是通過(guò)最優(yōu)路徑進(jìn)行下發(fā),以此達(dá)到最優(yōu)的訪問(wèn)體驗(yàn),并通過(guò)目標(biāo)端口組TPG(Target port group)來(lái)對(duì)這些路徑進(jìn)行分類管理.
一個(gè)目標(biāo)端口組TPG包括若干目標(biāo)端口,同一個(gè)TPG中的目標(biāo)端口在訪問(wèn)邏輯單元LUN的時(shí)候具有相同的屬性.主機(jī)可以通過(guò)SCSI命令來(lái)獲取某一個(gè)LUN對(duì)應(yīng)的TPG及其相關(guān)屬性,并通過(guò)這些信息來(lái)組織訪問(wèn)LUN的路徑.
ALUA有4種訪問(wèn)模式,這些工作模式是在主機(jī)下發(fā)inquiry指令時(shí),存儲(chǔ)端上報(bào)給主機(jī)的,主要目的是告訴主機(jī),存儲(chǔ)處于哪個(gè)工作模式上.具體的描述如表1所示.
表1 SCSI命令中的 TPGS 域
ALUA的訪問(wèn)狀態(tài)有4種,這些狀態(tài)是通過(guò)響應(yīng)主機(jī)下發(fā)的 SCSI指令 REPORT TARGET PORT GROUPS上報(bào)給主機(jī)的,對(duì)應(yīng)的位是“ASYMMETRIC ACCESS STATE”.
SPC-4(SCSI Primary Command-4)對(duì)存儲(chǔ)端口劃分為四種狀態(tài):
1)主動(dòng)優(yōu)化 (Active/optimized):目標(biāo)端口能立即訪問(wèn)LUN.
2)主動(dòng)非優(yōu)化 (Active/un-optimized):僅能響應(yīng)相應(yīng)的命令,可轉(zhuǎn)化為Active/optimized狀態(tài).
3)備用 (Standby):僅能響應(yīng)相應(yīng)的命令,可轉(zhuǎn)化為Active/optimized狀態(tài).
4)不可用(Unavailable):僅能響應(yīng)受限的命令集,不可轉(zhuǎn)化為其它狀態(tài).
設(shè)定端口為某一訪問(wèn)狀態(tài),相應(yīng)的存儲(chǔ)控制器就僅能響應(yīng)對(duì)應(yīng)的命令集,限定了目標(biāo)端口訪問(wèn)LUN的權(quán)限.對(duì)于雙控制器存儲(chǔ)陣列,根據(jù)端口狀態(tài)的劃分,可以有三種不同的多路徑訪問(wèn)方式:A/A(Symmetric Active/Active,對(duì)稱雙活),A/P (Active/Passive,主備模式)和 ALUA(Asymmetric Active/Active,非對(duì)稱雙活).為了性能和實(shí)現(xiàn)的簡(jiǎn)易型,本文選擇ALUA.
為了有效地約束I/O下發(fā)路徑,防止I/O在一臺(tái)控制器上擁堵或饑餓,結(jié)合上述的LUN控制器屬主的設(shè)計(jì),本文利用LIO提供的ALUA機(jī)制來(lái)配置目標(biāo)端口和目標(biāo)端口組.
為進(jìn)行端口組屬性的配置,開(kāi)發(fā)了相應(yīng)的系統(tǒng)接口,將目標(biāo)端口按照所屬控制器進(jìn)行分組,為L(zhǎng)UN控制器屬主的目標(biāo)端口組提供更高的路徑優(yōu)先級(jí),從而提高I/O效率和可用性.
具體而言,對(duì)于特定的LUN,將目標(biāo)端口按照所屬控制器進(jìn)行分組,劃分到不同的目標(biāo)端口組TPG中.將所屬控制器的所有目標(biāo)端口設(shè)為Active/optimized狀態(tài),形成一個(gè)目標(biāo)端口組,將備控制器的所有目標(biāo)端口設(shè)為Active/un-optimized狀態(tài),形成另一個(gè)目標(biāo)端口組.當(dāng)有I/O讀寫請(qǐng)求時(shí),主備控制器都可以接受對(duì)LUN的訪問(wèn),但流經(jīng)備控制器的I/O,會(huì)被重定向模塊轉(zhuǎn)發(fā)到主控制器,最終I/O只能通過(guò)主控制器下盤.
此外,由于所屬控制器端路徑和非所屬控制器端路徑的性能不同,當(dāng)一端控制器因故宕機(jī),其上的LUN故障遷移(也即failover)到對(duì)端控制器時(shí),I/O切換到非優(yōu)化的路徑下發(fā),性能隨之下降.為了解決此問(wèn)題,將對(duì)應(yīng)TPG的type屬性設(shè)置為both(Implicit and Explicit),其中的Explicit ALUA屬性賦予主機(jī)端更改備端控制器對(duì)應(yīng)端口組存取狀態(tài)的權(quán)限,以實(shí)現(xiàn)多路徑軟件對(duì)存儲(chǔ)端TPG屬性的修改,達(dá)到提升路徑優(yōu)先級(jí)的目的.
3.3.1 路徑組織策略
針對(duì)網(wǎng)絡(luò)存儲(chǔ),各大廠商都有自己的多路徑實(shí)現(xiàn)方法,為了提高響應(yīng)速度和總體性能,需要在主機(jī)端開(kāi)發(fā)相應(yīng)的多路徑軟件來(lái)組織I/O路徑和進(jìn)行I/O路徑的選擇.但是由于主機(jī)系統(tǒng)的種類繁多,針對(duì)不同類型的操作系統(tǒng)都需要開(kāi)發(fā)一套多路徑軟件,這極大地增大了維護(hù)成本,降低了擴(kuò)展性.本文充分利用各大系統(tǒng)平臺(tái)提供的原生多路徑軟件,通過(guò)其提供的通用框架來(lái)設(shè)計(jì)路徑組織和選擇策略.
在各類主機(jī)多路徑軟件中,路徑組把具有相同特征的路徑組織在一起,以便于管理I/O路徑.在某一瞬時(shí)只有一個(gè)路徑組處在活躍狀態(tài),在路徑切換時(shí)只能從當(dāng)前活躍的路徑組里選擇最優(yōu)的路徑.不同的主機(jī)系統(tǒng)平臺(tái)內(nèi)嵌的多路徑軟件的組織策略各不相同,但都實(shí)現(xiàn)了常用的模式.在應(yīng)用服務(wù)器領(lǐng)域,Linux類型系統(tǒng)的主機(jī)占有絕對(duì)優(yōu)勢(shì),下面以Linux主機(jī)為例.
Linux系統(tǒng)主機(jī)自帶的多路徑框架DM-Multipath的組織策略分為五種:
1)multibus策略,同一個(gè)路徑組包含一個(gè)塊設(shè)備對(duì)應(yīng)的所有路徑.
2)failover策略,一個(gè)路徑組只含一條路徑.
3)group_by_serial策略,同一個(gè)路徑組內(nèi)只含序列號(hào)相同的路徑.
4)group_by_prio 策略,同一路徑組內(nèi)只含優(yōu)先級(jí)相同的路徑.
5)group_by_node 策略,同一路徑組內(nèi)只含節(jié)點(diǎn)名相同的路徑.
為了負(fù)載均衡的目的,本文選擇group_by_serial模式來(lái)配合存儲(chǔ)端ALUA屬性的配置,這樣I/O的切換被限定在同一控制器的路徑組內(nèi),只有在進(jìn)行failover故障遷移時(shí),才在不同的控制器間切換,實(shí)現(xiàn)了對(duì)I/O路徑的管控.
3.3.2 路徑選擇
在主機(jī)下發(fā)讀寫指令時(shí),先根據(jù)優(yōu)先級(jí)從多個(gè)路徑組中選一個(gè),然后在這個(gè)路徑組里根據(jù)設(shè)定的路徑選擇算法進(jìn)行選擇.DM-Multipath內(nèi)置的路徑選擇算法有三種,分別是 Round-robin(輪詢算法)、Queue-length(排隊(duì)深度算法)以及Service-time(服務(wù)時(shí)間算法).
輪詢算法通過(guò)雙向循環(huán)鏈表來(lái)組織所有路徑,當(dāng)選擇新路徑時(shí),會(huì)順次選取下一個(gè)節(jié)點(diǎn)對(duì)應(yīng)的路徑返回.觸發(fā)路徑切換的條件是,每條路徑固定分發(fā)一定次數(shù)的I/O,當(dāng)前路徑發(fā)完規(guī)定次數(shù)的I/O后,就會(huì)自動(dòng)切換到下一條路徑.但是,該算法沒(méi)有考慮到路徑處理能力、響應(yīng)時(shí)間等的不同.
隊(duì)列深度算法參考每條路徑上的I/O負(fù)載,通過(guò)動(dòng)態(tài)記錄每條路徑上排隊(duì)等待處理的I/O數(shù)量來(lái)衡量路徑的優(yōu)劣.具體而言,當(dāng)有I/O分發(fā)到某條路徑上時(shí),對(duì)應(yīng)的隊(duì)列深度就增加; 當(dāng)隊(duì)列中的I/O下發(fā)到底層驅(qū)動(dòng)上時(shí),隊(duì)列深度就減少.同上,此算法也沒(méi)有考慮不同路徑物理特性的不同.
服務(wù)時(shí)間算法預(yù)估I/O請(qǐng)求發(fā)送到每條路徑后進(jìn)行處理所需要的周轉(zhuǎn)時(shí)間,服務(wù)時(shí)間最短的那條路徑為最優(yōu)路徑.具體而言,將路徑上總的排隊(duì)I/O塊大小除以此路徑的吞吐量即可得到服務(wù)時(shí)間.
為了更好地在路徑間均衡I/O負(fù)載,本文提出并實(shí)現(xiàn)了一種新的路徑選擇算法——hikdata-selector算法.在選擇一條路徑時(shí),不僅僅單一地參考響應(yīng)時(shí)間、相對(duì)吞吐量、排隊(duì)I/O塊大小和重復(fù)次數(shù)等,而是將它們綜合起來(lái)考慮.
在選取一條路徑時(shí),先考慮路徑的響應(yīng)速度,選擇響應(yīng)時(shí)間短的路徑作為最優(yōu)路徑; 當(dāng)兩條路徑的響應(yīng)時(shí)間一樣時(shí),再計(jì)算相對(duì)服務(wù)時(shí)間,優(yōu)選耗時(shí)少的路徑;如仍無(wú)法確定,還可繼續(xù)參考路徑的相對(duì)吞吐量; 當(dāng)相關(guān)指標(biāo)都相同時(shí),可隨機(jī)選一條路徑返回.具體流程可參看圖4所示.
圖4 hikdata 路徑比較算法
路徑由雙向循環(huán)鏈表組織起來(lái),選擇的具體流程是:首先,從備選路徑鏈表里選取前兩條路徑,并根據(jù)上述算法進(jìn)行比較,得到當(dāng)前最優(yōu)路徑; 隨后再?gòu)穆窂芥湵砝锶〕鱿乱粭l路徑,與當(dāng)前最優(yōu)路徑進(jìn)行比較,選出較好的一條來(lái)更新當(dāng)前最優(yōu)路徑,循環(huán)往復(fù),直到整條鏈表全部判斷完畢,選出的就是最佳路徑.總體流程如圖5所示.
圖5 hikdata 路徑選擇流程
根據(jù)上文的設(shè)定,多路徑軟件優(yōu)選主控制器端路徑,備控制器端路徑閑置.當(dāng)出現(xiàn)主存儲(chǔ)控制器(如:A控)的網(wǎng)卡損壞或者網(wǎng)絡(luò)環(huán)境異常等故障時(shí),主機(jī)系統(tǒng)與主控之間的路徑斷開(kāi),主機(jī)多路徑軟件會(huì)將I/O切換到備控(如B控)的路徑下發(fā)指令,由于主控沒(méi)有因故障宕機(jī),所以不會(huì)執(zhí)行failover操作,備控中相應(yīng)的塊設(shè)備仍然是只讀的,從主機(jī)端下發(fā)到備控的讀寫指令將無(wú)法在備控下盤.為了保證業(yè)務(wù)不中斷,需要將備控接收到的I/O通過(guò)內(nèi)部端口重定向到主控,才能保證整個(gè)I/O過(guò)程的完整.為此,基于LIO開(kāi)發(fā)了I/O重定向模塊,其整體架構(gòu)如圖6所示.
圖6 I/O 重定向模塊系統(tǒng)架構(gòu)
整個(gè)I/O重定向可以分為初始化模塊和轉(zhuǎn)發(fā)模塊.初始化模塊主要負(fù)責(zé)初始化I/O重定向所需的全局變量,分配全局空間,并創(chuàng)建轉(zhuǎn)發(fā)線程.轉(zhuǎn)發(fā)模塊由發(fā)送子模塊和接收子模塊組成.發(fā)送子模塊負(fù)責(zé)接收本端iSCSI命令數(shù)據(jù),在需要轉(zhuǎn)發(fā)的情況下,將命令數(shù)據(jù)通過(guò)PCIe非透明橋(NT)驅(qū)動(dòng)的發(fā)送接口發(fā)送到對(duì)端,接收子模塊負(fù)責(zé)接收對(duì)端發(fā)送來(lái)的命令數(shù)據(jù),并在本端執(zhí)行I/O指令,再將執(zhí)行結(jié)果通過(guò)NT接口發(fā)送回對(duì)端,對(duì)端發(fā)送子模塊將結(jié)果返回給上層,完成一次完整的I/O重定向過(guò)程.
在本文,在LIO子系統(tǒng)中實(shí)現(xiàn)I/O重定向,減少了對(duì)存儲(chǔ)端Linux存儲(chǔ)協(xié)議棧的改動(dòng),降低了實(shí)現(xiàn)難度,也降低了I/O重定向?qū)τ谡麄€(gè)系統(tǒng)帶來(lái)不穩(wěn)定的風(fēng)險(xiǎn).現(xiàn)有的I/O重定向,如iSCSI重定向只能適用于前端是iSCSI協(xié)議的場(chǎng)景,擴(kuò)展性較差.LIO支持將塊設(shè)備通過(guò)多種協(xié)議(如FC、InfiniBand等)映射到主機(jī)端,通過(guò)本方法實(shí)現(xiàn)的I/O重定向,可以有效兼容前端不同的網(wǎng)絡(luò)存儲(chǔ)協(xié)議,提高適用性.另外,本I/O重定向模塊通過(guò)調(diào)用NT驅(qū)動(dòng)接口實(shí)現(xiàn)與對(duì)端控制器之間的數(shù)據(jù)收發(fā),速度更快,更可靠.
根據(jù)本文提出的多路徑存儲(chǔ)子系統(tǒng)模型,采用自主研發(fā)的雙控制器存儲(chǔ)陣列平臺(tái)搭建了多路徑存儲(chǔ)子系統(tǒng)運(yùn)行環(huán)境.針對(duì)多路徑技術(shù)主要實(shí)現(xiàn)故障轉(zhuǎn)移和負(fù)載均衡功能,設(shè)計(jì)了兩種組網(wǎng)方式來(lái)進(jìn)行測(cè)試,并選擇存儲(chǔ)業(yè)界廣泛使用的IOMeter作為I/O測(cè)試工具.測(cè)試硬件由兩臺(tái)應(yīng)用服務(wù)器、一臺(tái)雙控制器存儲(chǔ)陣列和兩臺(tái)萬(wàn)兆交換機(jī)組成,如圖7所示.
組網(wǎng)一僅包括7條路徑(P1-P7),如圖7所示,主機(jī)1訪問(wèn)LUN2時(shí),路徑有P1-P3-P6和P1-P4-P5-P6可選,而且兩路徑的I/O在存儲(chǔ)后端全由控制器A處理.
首先,測(cè)試 I/O 路徑切換.經(jīng)實(shí)測(cè),在上述場(chǎng)景下,I/O指令優(yōu)選P1-P3-P6路徑下發(fā).通過(guò)拔掉網(wǎng)線的方法來(lái)模擬P3出現(xiàn)故障的場(chǎng)景,此時(shí)路徑重定向?yàn)镻1-P4-P5-P6,但存儲(chǔ)設(shè)備并沒(méi)有執(zhí)行 LUN failover.將P3線路插回,再模擬P6出現(xiàn)故障的場(chǎng)景,此時(shí)存儲(chǔ)業(yè)務(wù)轉(zhuǎn)由控制器B處理,I/O重定向到P1-P3-P5-P7路徑,但是沒(méi)有立即執(zhí)行LUN failover.過(guò)了一段時(shí)間,通過(guò)控制器B處理的I/O累計(jì)到了設(shè)定的量級(jí)時(shí),才執(zhí)行了 LUN failover.上述實(shí)驗(yàn)充分說(shuō)明了,此多路徑子系統(tǒng)能夠有效地實(shí)現(xiàn)故障切換功能.
接下來(lái),啟動(dòng)目標(biāo)端,設(shè)置 LUN1、LUN3 為遠(yuǎn)程訪問(wèn)盤,并將其分別通過(guò)HBA1、HBA2的兩個(gè)萬(wàn)兆網(wǎng)口映射出去.針對(duì)主機(jī)1與主機(jī)2,分別啟動(dòng)iSCSI發(fā)起端連接到目標(biāo)端.主機(jī)1登入LUN1,主機(jī)2登入LUN3,如此每個(gè)主機(jī)可得到兩個(gè)相同的遠(yuǎn)程盤,經(jīng)測(cè)試,I/O指令優(yōu)先通過(guò)所屬控制器對(duì)應(yīng)的路徑下發(fā).
隨后,先通過(guò)發(fā)起端測(cè)試單鏈路的性能和系統(tǒng)負(fù)載,再加載多路徑模塊,對(duì)多路讀寫性能和系統(tǒng)負(fù)載進(jìn)行測(cè)試.相應(yīng)的測(cè)試數(shù)據(jù)如圖8所示.其中多路單鏈路是指通過(guò)多路徑模塊訪問(wèn)時(shí),只使用一條有效鏈路傳輸.雙鏈路是指通過(guò)多路徑模塊訪問(wèn)時(shí),采用hikdataselector的負(fù)載平衡算法,兩條鏈路并行傳輸.單鏈路是指不通過(guò)多路徑模塊而進(jìn)行單一鏈路的訪問(wèn).從圖8中可以看出,三者之中雙鏈路的讀寫性能最好.
圖7 測(cè)試場(chǎng)景示意圖
最后,針對(duì)本文提出的方案,在組網(wǎng)二(包括圖7所有路徑)上進(jìn)行如下測(cè)試:在雙控存儲(chǔ)陣列上規(guī)劃創(chuàng)建 20 個(gè)卷,分別模擬不同的用途,比如,郵件服務(wù)器存儲(chǔ)、數(shù)據(jù)庫(kù)存儲(chǔ)、視頻流存儲(chǔ)、FTP存儲(chǔ)等,分別對(duì)應(yīng)小文件隨機(jī)讀寫、均勻順序讀寫、突發(fā)大文件讀寫等,通過(guò)提出的LUN控制器屬主管理方法將其分配到不同的控制器上,并每二十秒測(cè)試一次存儲(chǔ)端網(wǎng)絡(luò)HBA卡的吞吐量,持續(xù)3個(gè)小時(shí),然后求取這些測(cè)試值的均值和變異系數(shù)(CV).在對(duì)照組中,按照傳統(tǒng)做法隨機(jī)分配LUN的所屬控制器,并采用經(jīng)驗(yàn)證效果較好的Service-time選路算法.
將上述流程中不同用途的卷的創(chuàng)建順序打亂,重新分配所屬控制器,進(jìn)行下一次測(cè)試.循環(huán)往復(fù)測(cè)試6次,測(cè)試結(jié)果如表2所示.從測(cè)試數(shù)據(jù)的對(duì)比,可以看出本文提出的方案在四塊HBA卡的速率基本一致,較好地實(shí)現(xiàn)了負(fù)載均衡的要求,并比對(duì)照組有更好的性能.
圖8 多路徑 I/O 性能測(cè)試結(jié)果
表2 多路徑 I/O 吞吐量測(cè)試結(jié)果
在網(wǎng)絡(luò)存儲(chǔ)系統(tǒng)中,在主機(jī)與存儲(chǔ)系統(tǒng)之間利用多路徑技術(shù)進(jìn)行容災(zāi)已成為常例,既能保證數(shù)據(jù)業(yè)務(wù)不因故障而中斷,又可提升系統(tǒng)總體I/O傳輸效率和吞吐量.為此,該技術(shù)得到了業(yè)界的普遍重視,對(duì)它的研究和應(yīng)用越來(lái)越廣泛.但是目前多路徑技術(shù)方面的研究工作大都局限于主機(jī)端多路徑軟件的設(shè)計(jì)開(kāi)發(fā)或特定領(lǐng)域的應(yīng)用,沒(méi)有從系統(tǒng)的角度進(jìn)行考量.
本文提出了一種基于ALUA的多路徑存儲(chǔ)子系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)方案,提出了新的多路徑存儲(chǔ)子系統(tǒng)的體系架構(gòu),并分別在LUN控制器屬主管理、ALUA屬性與路徑選擇策略配置和I/O重定向等模塊進(jìn)行了創(chuàng)新性的設(shè)計(jì)與實(shí)現(xiàn).通過(guò)應(yīng)用效果分析,本方案能夠很好地保證系統(tǒng)的高可用性,在系統(tǒng)容災(zāi)、故障轉(zhuǎn)移及I/O分流等方面具有較好的應(yīng)用效果,并且有效地進(jìn)行了I/O的負(fù)載均衡,優(yōu)化了I/O子系統(tǒng)的整體性能.
1和軍.基于Windows I/O多路徑的網(wǎng)絡(luò)存儲(chǔ)容災(zāi)技術(shù)分析與實(shí)現(xiàn)[碩士學(xué)位論文].成都:電子科技大學(xué),2009.
3焦繁.論軟件SAN存儲(chǔ)多路徑的實(shí)現(xiàn)方法.中國(guó)報(bào)業(yè),2012,(24):30–32.
4郭曉金,王超.一種新的Linux主機(jī)冗余存儲(chǔ)路徑設(shè)計(jì)與實(shí)現(xiàn).電視技術(shù),2012,36(3):70–73.
5胡耀義.一種多路徑環(huán)境下的智能選路算法設(shè)計(jì)與實(shí)現(xiàn).鐵路計(jì)算機(jī)應(yīng)用,2016,25(10):13–15,20.[doi:10.3969/j.issn.1005-8451.2016.10.004]
6蔡斌,謝長(zhǎng)生,任勁.SCSI子系統(tǒng)中間層多啟動(dòng)互連多路徑I/O的存儲(chǔ)方式的研究.小型微型計(jì)算機(jī)系統(tǒng),2005,26(8):1420–1426.
7闞闖,戚瑋瑋.一種新結(jié)構(gòu)的DM-multipath與動(dòng)態(tài)負(fù)載平衡.計(jì)算機(jī)應(yīng)用,2008,28(2):289–291.
8王超.多路徑軟件與不同模式磁盤陣列搭配使用方法研究.電光系統(tǒng),2011,(4):45–49.
9胡耀義,陶宏才.一種基于Hyper-V和WSFC集群的主機(jī)多路徑網(wǎng)絡(luò)存儲(chǔ)架構(gòu)方案.鐵路計(jì)算機(jī)應(yīng)用,2012,21(6):80–82.
10王炎.多路徑I/O技術(shù)在電視臺(tái)SAN存儲(chǔ)網(wǎng)絡(luò)中的應(yīng)用探討.廣播與電視技術(shù),2013,(3):86,88,90,92–93.
11金弟,莊錫進(jìn),曹曉初,等.基于多路徑地震資料處理集群存儲(chǔ)系統(tǒng).計(jì)算機(jī)研究與發(fā)展,2012,49(增刊):42–46.
12金弟,莊錫進(jìn),王啟迪,等.存儲(chǔ)框架模型在地震資料大數(shù)據(jù)中的應(yīng)用.計(jì)算機(jī)系統(tǒng)應(yīng)用,2016,25(2):45–51.
Multi-Path Storage System Based on ALUA
FAN Chang-Jun,HU Zhi-Cheng,YANG Jia-Dong
(CETHIK Group Co.Ltd.,Hangzhou 310013,China)
With the rapid development and wide application of SAN technology,multi-path technology becomes one of the key technologies to achieve disaster tolerance and high performance.Based on the existing techniques,an improved multi-path storage sub-system is presented.And then improvement is made in four modules,i.e.,LUN ownership management,configuration of ALUA,path selection strategy,and I/O forwarding implementation.The test results show that this scheme can be a very good solution to the path failover and load balance problems,greatly enhancing the I/O performance.
multi-path; ALUA attributes; I/O forwarding; load balancing; failover; failback
10.3969/j.issn.1671-7341.2013.18.016]
范長(zhǎng)軍,胡志成,楊佳東.基于ALUA 的多路徑存儲(chǔ)系統(tǒng).計(jì)算機(jī)系統(tǒng)應(yīng)用,2017,26(10):11–19.http://www.c-s-a.org.cn/1003-3254/6026.html
2017-01-16; 采用時(shí)間:2017-02-26