《固態盤到底該怎么做Raid?》要點:
本文介紹了固態盤到底該怎么做Raid?,希望對您有用。如果有疑問,可以聯系我們。
NVMe固態盤已經開始逐漸普及,但是,有個嚴峻的問題擺在眼前,那就是如何對NVMe盤做Raid,NVMe固態盤雖好,但是如果缺乏了Raid的冗余性保護,那么不少人其實是有顧慮的,從而阻礙NVMe固態盤的普及.我們知道,做Raid目前最廣泛的方式,是采用硬Raid卡,先將硬盤接入到Raid控制器上,Raid控制器再接入到系統PCIE總線上,這是SAS/SATA盤的標準做法.
得益于數據塊條帶化以及Raid卡上的數據緩存以及超級電容的備電,讀寫IO速度被進一步加快,同時還能夠防止單盤或者雙盤同時故障導致的數據丟失.Raid卡在服務器上被廣泛應用.
那么,對于PCIE接口的、NVMe訪問協議的固態盤,目前的Raid卡是無能為力的,因為目前的Raid卡只提供了SAS/SATA接口接入硬盤,要想把NVMe固態盤接入,就得對現有Raid控制器進行改造,在芯片中加入PCIE主控制器和PCIe Switch,NVMe固態盤接入集成在Raid主控里的Switch(或者兩個獨立的die芯片,封裝在一起),依然采用Raid主控來做Raid.這種做法會增加成本,因為為了同時支持SAS/SATA和PCIE,多引入了PCIE Switch部分,而SAS兼容SATA,卻不兼容NVMe.
既然ATA和SCSI都可以over SAS,那么為什么不能把NVMe協議也Over到SAS呢?其實理論上是完全可以的.SAS Expander中每個端口都有個叫做STP bridge的橋接電路,就是這個電路負責生成SATA鏈路對應的信號,從而才可以與SATA盤通信,而如果在SAS Expander中增加一個PCIe的主控端,負責生成PCIe信號,由SAS Expander固件負責對PCIe固態盤進行初始化配置.但是冬瓜哥認為這樣做理論上可以,但是復雜度并不亞于前一種方案.
SAS和SATA盤可以通過SAS Expander匯總接入到SAS控制器上,PCIe接口的NVMe SSD也可以通過PICeSwitch芯片匯總接入到CPU上的PCIe主控制器上.那么是否可以在PCIe Switch上做Raid呢?理論上沒有什么不可以.但是利用芯片做Raid需要滿足幾個條件:性能不用很強但也不能太孱弱的嵌入式通用CPU,專用XOR硬加速電路,起碼2GB的數據緩存,用于掉電保護的超級電容和Flash.如果把一片PCIe Switch芯片中嵌入這幾樣東西,那么還不如說其已經變成了將后端接口從原來的SAS換為PCIe 主控+PCIeSwitch的傳統Raid控制器了,也就是接下來的選項之三.
該選項應該說是比較正統的想法,之前的兩個選項稍顯奇葩.但是這種方法帶來的一個問題則是Raid控制器的成本會非常高,同時其性能還不見得好.NVMe協議+PCIe為何能夠發揮出固態盤的性能?主要是兩個方面:協議棧的精簡加上CPU到PCIe設備鏈路層一跳直達充分降低了時延,再就是加大的隊列數量和隊列深度,充分提升了并發度從而極大提升了吞吐量.而如果采用外部硬Raid控制器來做Raid,結果將是:由于Raid控制器屬于帶內虛擬化設備,其會終結掉前端的協議和IO請求,將數據拷貝到內部緩沖,然后進行Raid處理,再重新向后端SSD發起IO請求,這便讓NVMe協議對IO時延的降低蕩然無存.
其次,由于硬件電路資源的限制,硬Raid控制器內部不會有太高的并發度,因為無法做太多的硬寄存器隊列進去.
第三點,如果硬Raid控制器同時支持SAS/SATA/NMe硬件接入的話,那么勢必會產生快慢盤效應,也就是NVMe固態盤的性能會進一步被SAS/SATA接口的盤拖慢,因為后者響應慢,其對芯片內部資源遲遲得不到釋放,從而導致快盤性能受牽連.
第四點,在運維方面,會帶來不便,比如,無法利用一些工具直接在主機端查看NVMe SSD內部的狀態,因為Raid控制器完全屏蔽了NVMe盤,主機端OS根本看不到它,無法對其直接操作,想要細化的功能,就必須在Raid控制器固件中開發對應的工具,取回對應的信息,然后利用Raid控制器提供的工具來查看,這個非常不方便,完全將NVMe固態盤的運維排除在外.
第五點,硬Raid控制器固件里很難實現對固態盤的特殊優化,比如全局磨損均衡,動態負載優化等等專門針對固態介質而考慮的特性,Raid控制器廠商對固態盤的管理是不在行的,而且受限于內部運行資源的限制,不可能在短小精悍的固件中做很復雜的功能.
冬瓜哥看來,利用傳統硬Raid控制器做Raid的最大一個優點是能夠維持傳統的使用習慣,而其他則全是缺點.
噗~~.有人會不以為然了,軟raid?別搞笑了.軟的怎么會比硬的更強呢?在十幾年前,這么說似乎沒什么問題,但是放到現在,事情變了.十幾年前是CPU不夠用的,再讓他計算軟Raid,當然力不從心;而現在是CPU核心數量暴增,頻率不能說是暴增但也上去了,已經性能過剩了,尤其是核心數量方面.再加上Linux自帶的軟Raid模塊是沒有經過優化的.經過優化的軟Raid,在性能上完爆硬Raid.這一點可以看看目前的傳統SAN存儲系統,其利用單路CPU就可以達到遠高于Raid卡的性能,其內部都是軟Raid的方式.
硬Raid控制器內的嵌入式CPU的頻率一般在1GHz左右,核心數量一般在2~3核,不管是頻率、核心數量,還是其內部的執行性能,都遠遠比不上Xeon服務器CPU.若不是為了維持傳統的使用習慣,硬Raid控制器的地位恐怕早已今非昔比了.對于機械盤Raid,硬Raid綽綽有余,但是對于NVMe固態盤做Raid,我們必然首選利用服務器本地的CPU加上經過優化的軟Raid模塊來做Raid,這樣可以保證:IO數據依然一跳直達,從host主存直接拷貝到SSD保證時延降低不是太多、有充足的RAM資源可以容納更多的隊列保證吞吐量、host可以直接控制NVMe固態盤獲取對應的信息方便運維、基于開放平臺Linux開發方便容易增加更多功能比如針對固態盤的特殊優化、host端資源充足且固態盤與機械盤走不同的協議棧所以不會有快慢盤效應.
這樣一說,軟Raid全是優點了?只要經過充分的優化,全是優點.唯有一點需要注意,突然故障宕機時如何保證數據一致性的問題,軟Raid不能采用write back模式的緩存,否則將丟數據,但是可以用一些手段規避這個問題,比如就用write through,或者利用NVDIMM/NVRAM來承載數據緩存.
有人針對實際測試,使用Linux內核自帶的mdraid模塊,將4塊Intel 750的NVMe SSD做Raid5,寫性能只能到70K IOPS左右,可見其效率之低下.當前Linux自帶的軟Raid是無論如何也無法滿足固態存儲場景下的基本需求的.
另外,目前的內核自帶軟Raid也并沒有在其他方面對固態盤場景做感知和優化,比如壽命問題,SSD的壽命是可預知的,很有可能同一個Raid組中的多塊固態盤短時間內同時達到壽命終點從而引起多盤失效而丟失數據;再比如Raid組的初始化過程,是個完全浪費時間和沒有必要的過程,只會白白浪費固態盤壽命;無法感知邏輯數據對象(比如邏輯盤),只能整盤重構,白白浪費壽命.
Memblaze(憶恒創源)作為國內知名固態存儲提供商,曾經推出過國內第一塊NVMe SSDPblaze4,能夠達到將近800K的IOPS.
為了持續建設NVMe生態,開發一款能夠發揮出NVMe固態盤性能的軟Raid模塊的這個設想,很早就引起了公司內部的重視.終于,在2016年的6月份,Memblaze將隆重正式發布這款產品——FlashRaidTM.先來看看其是否強勁:
FlashRaid性能如此強悍的關鍵原因在于無鎖隊列技術.FlashRaid模塊在達到百萬IOPS時對CPU耗費也就是30%左右,Xeon 2640雙路,30核心.FlashRaid的開發負責人吳忠杰表示,mdraid模塊內部對多線程的優化太差,存在大量鎖,效率非常低,尤其是處理寫IO的時候.而FlashRaid團隊的專家們經過反復思考,最終找到了能夠實現基于無鎖隊列的生產者消費者模型的辦法,并申請了專利.無鎖隊列的好處就是總體性能能夠能夠隨著線程數的增多而呈現更好的線性增長特性.IO根據目標LBA地址范圍被Hash然后均衡的下發到多個隊列中.
除了性能方面的優化,FlashRaid在架構、固態存儲感知優化等方面大量采用及創造業界前沿技術,可以說是一場技術盛宴!
整體架構上,FlashRaid采用Raid2.0思想實現.一組物理盤首先被邏輯分割為chunk,多個chunk形成storagepool(可創建多個池),池內的chunk與chunk之間做成各種類型的Raid組從而組成一個條帶,也就是container,然后多個container再組成邏輯卷.Chunk的大小是可調節的.Container的chunk該如何在眾多chunk中分配,由Resource Allocator根據多方面因素優化決定.
Raid2.0架構的好處就在于能夠極大加快重構速度,以及智能重構,只重構被數據塊占用的區域.
假設某個存儲池內有兩塊硬盤損壞,某個Raid6類型的container中恰好有兩個chunk分別屬于這兩塊硬盤;同時,另一個Raid6類型的container中只有一個chunk落入了這兩塊硬盤中的任意一塊中,此時,前者這個chunk的處境更加危險,因為其已經沒有冗余性了,而后者這個chunk依然能允許一塊盤故障,此時FlashRaid會智能判斷該場景并且優先重構第一個container.該技術的確為業界創新技術,冬瓜哥之前沒有看到過任何其他產品實現該技術.同理,在一塊盤故障之后,受影響的Raid5類型的container總是優先于受影響的Raid6類型的container得到重構.
如果遇到某個數據塊發生不可恢復錯誤,那么系統會動態實時的對該塊進行重構,而無需等到整個盤故障后才重構.
初始時,用戶選擇使用4D+1P方式的條帶/container,但是可能池中的某個SSD容量不夠了,系統此時會在后臺動態的將4D+1P條帶改變為3D+1P,該過程為透明后臺執行,不會影響前端應用的IO訪問.
當某塊SSD的壽命剩余較多時,會擁有最高的被分配權重,這樣可以均衡壽命,而當池中的所有SSD的壽命均耗費殆盡的時候,為了方式壽命過于均衡可能導致的同時多盤失效,此時系統啟動逆均衡措施,強行選擇壽命即將耗盡的SSD,增加其數據寫入權重,這樣,其就會有更大幾率先于其他盤壞掉,然后系統發起重構恢復冗余性.
除了上述特色之外,FlashRaid還專門對運維方面做了一些增強,比如對鏈路閃斷進行處理,對磁盤熱插拔進行處理等等.另外,FlashRaid具備良好的可移植性,并且對SPDK做了適配,可以遷移到用戶態空間運行.
FlashRaid絕非僅僅是一款普通的Raid管理模塊,FlashRaid的最終形態會是一款具備強大功能的存儲系統平臺了,得益于其對固態存儲優秀的優化,其被廣泛用于分布式塊存儲系統底層的那一天,很快就會到來!
文/冬瓜哥
原文出處——大話存儲微信公眾號
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/4511.html