單機(jī)存儲系統(tǒng)可靠性及相關(guān)技術(shù)介紹
一、存儲系統(tǒng)可靠性的影響因素
單機(jī)存儲系統(tǒng)包括存儲硬件和存儲軟件。存儲硬件又包含存儲介質(zhì)、存儲控制器、設(shè)備固件;存儲軟件棧層次則更為復(fù)雜,以Linux為例包括:存儲設(shè)備驅(qū)動層、 塊設(shè)備層(Block Layer)、可選的虛擬塊設(shè)備層(Device Mapper)、文件系統(tǒng)層等。如下圖所示,各個層次可進(jìn)一步細(xì)分,整個存儲棧非常復(fù)雜龐大。存儲系統(tǒng)的可靠性依賴各層硬件和軟件的可用性,另一方面也包括存儲系統(tǒng)中數(shù)據(jù)的可靠性。

圖1 Linux存儲棧層次 [1]
存儲系統(tǒng)硬件和軟件的可用性(Availability)是指其可正常運行、長時間無故障的能力。存儲器件的控制器損壞(如:磁盤磁頭的機(jī)械故障)就屬于不可用的范疇,一些存儲軟件缺陷(如:異常死鎖)也可導(dǎo)致系統(tǒng)不可用。
數(shù)據(jù)的可靠性是指在數(shù)據(jù)的生命周期內(nèi),所有數(shù)據(jù)都是完全的、一致的和準(zhǔn)確的程度。影響數(shù)據(jù)可靠性的原因有很多方面:
存儲介質(zhì)在極端環(huán)境下數(shù)據(jù)保存周期縮短可能導(dǎo)致數(shù)據(jù)丟失,如:1)磁盤在極強(qiáng)的磁場環(huán)境下會消磁導(dǎo)致數(shù)據(jù)丟失,2)NAND閃存在高溫環(huán)境下長時間斷電放置數(shù)據(jù)保存周期會大幅縮短(如圖2所示,斷電狀態(tài)30攝氏度下可保存52周,40攝氏度下僅可保存14周)

圖2 JEDEC標(biāo)準(zhǔn)下NAND閃存在不同環(huán)境溫度下的數(shù)據(jù)保存周期(單位:周)[2]
存儲器件中電子元件的比特翻轉(zhuǎn)(Bit Flip)導(dǎo)致數(shù)據(jù)錯誤,如:寄存器、SRAM、NAND FLASH等因供電電壓不穩(wěn)導(dǎo)致的比特翻轉(zhuǎn),甚至宇宙射線也可能造成比特翻轉(zhuǎn),當(dāng)然這是極小概率的情況
存儲系統(tǒng)外部的不可預(yù)期數(shù)據(jù)破壞,如:1)硬盤上存在多個數(shù)據(jù)分區(qū),裸寫的分區(qū)偏移地址計算錯誤導(dǎo)致其他分區(qū)的數(shù)據(jù)被覆蓋;2)Linux內(nèi)核中某個模塊存在踩內(nèi)存異常,使得頁緩存(Page Cache)中的數(shù)據(jù)被破壞,異常數(shù)據(jù)最終持久化到存儲中
存儲軟硬件的設(shè)計缺陷導(dǎo)致數(shù)據(jù)異常,如:1)固件在異常掉電等特殊情況下存在映射表更新異常,2)文件系統(tǒng)在特殊場景的邏輯異常導(dǎo)致數(shù)據(jù)未能正常更新或被錯誤的覆蓋等
二、存儲可靠性相關(guān)技術(shù)介紹
存儲可靠性相關(guān)的技術(shù)比較多:從單條數(shù)據(jù)粒度可以做數(shù)據(jù)校驗,從設(shè)備層面可以做冗余容錯,從系統(tǒng)層面可以做快照、備份已經(jīng)CDP(連續(xù)數(shù)據(jù)保護(hù)),針對存儲系統(tǒng)中某一個組件、模塊的特點還有一些針對性的保護(hù)方案和技術(shù)。這其中有些技術(shù)是數(shù)據(jù)保護(hù)層面的,有些是同時考慮系統(tǒng)可用性層面和數(shù)據(jù)保護(hù)的。下面我們一一展開介紹。
2.1數(shù)據(jù)校驗
數(shù)據(jù)校驗是為保證數(shù)據(jù)的完整性進(jìn)行的一種驗證操作。通常用一種指定的算法對原始數(shù)據(jù)計算出的一個校驗值,接收方用同樣的算法計算一次校驗值,如果兩次計算得到的檢驗值相同,則說明數(shù)據(jù)是完整的。有些校驗算法還有更近一步的糾錯能力。常用的數(shù)據(jù)校驗算法包括:
奇偶校驗?根據(jù)被傳輸?shù)囊唤M二進(jìn)制代碼的數(shù)位中“1”的個數(shù)是奇數(shù)或偶數(shù)來進(jìn)行校驗。采用奇數(shù)的稱為奇校驗,反之,稱為偶校驗。采用何種校驗是事先規(guī)定好的。如1010001有3個1,奇校驗需保證1的個數(shù)為奇數(shù)在尾部添加校驗位0,即:10100010。對應(yīng)的,偶校驗結(jié)果位:10100011。奇偶校驗可以檢測出一bit錯誤。(參考表1 )
表1 奇偶校驗示例

ECC校驗?全稱為Error Checking and Correcting, 顧名思義它不僅可以發(fā)現(xiàn)錯誤還可以糾正錯誤。ECC校驗廣泛應(yīng)用于DRAM和NAND閃存等設(shè)備中。ECC碼將信息進(jìn)行8比特位的編碼,下表是一個8字節(jié)信息的ECC編碼示例,校驗信息分為行校驗和列校驗。其中列校驗CP0是對所有8個字節(jié)的Bit 0,2,4,6的所有位做異或得到,CP1是對Bit 1,3,5,7采用同樣方式做校驗。CP2是針對Bit 0,1,4,5校驗,CP3是針對Bit 2,3,6,7。CP4是針對Bit 0,1,2,3校驗,CP5是針對Bit 4,5,6,7。行校驗的RP0 - RP5同理。在檢測時對數(shù)據(jù)做同樣的校驗,經(jīng)過對比原校驗值即可判斷數(shù)據(jù)是否出錯及出錯位置。ECC校驗?zāi)芗m正1 Bit錯誤,檢測2 Bit錯誤。
表2 ECC校驗說明

CRC校驗?全稱為Cyclic Redundancy Check,循環(huán)冗余校驗。一些文件系統(tǒng)的元數(shù)據(jù)校驗中會使用CRC。CRC具備檢錯和糾錯的能力(其由信息碼n位和校驗碼k位構(gòu)成),其校驗可以理解為一種二進(jìn)制模2算法,它是一定能被生成多項式整除的,如果除不盡,那就說明傳輸出現(xiàn)了錯誤。這里舉例說明:
先假定一個多項式,用于計算校驗碼,設(shè)多項式為G(x)=x^2+x+1(G(x)是一個k+1位的二進(jìn)制數(shù)),其二進(jìn)制表示為111,共3位,其中k=2;
假設(shè)要發(fā)送數(shù)據(jù)序列的二進(jìn)制為10111(即f(x)),共5位;
多項式的位數(shù)為3,則在要發(fā)送的數(shù)據(jù)后面加上3-1個位的0(生成f(x)*(x^k)),二進(jìn)制表示為1011100,共7位;
用生成多項式的二進(jìn)制表示111去除乘積1011100,按模2算法求得余數(shù)序列為01(注意余數(shù)一定是k位的,如果位數(shù)不夠,需要在高位補(bǔ)0;模2算法是不向上借位的,相當(dāng)于異或);
將余數(shù)添加到要發(fā)送的數(shù)據(jù)后面,得到真正要發(fā)送的數(shù)據(jù)的比特流:1011101,其中前5位為原始數(shù)據(jù),后2位為CRC校驗碼;
接收端在接收到帶CRC校驗碼的數(shù)據(jù)后,如果數(shù)據(jù)在傳輸過程中沒有出錯,將一定能夠被相同的生成多項式G(x)除盡,如果數(shù)據(jù)在傳輸中出現(xiàn)錯誤,生成多項式G(x)去除后得到的結(jié)果肯定不為0。
2.2磁盤冗余陣列(RAID)
全稱是Redundant Array of Independent Disks,廣泛應(yīng)用于存儲服務(wù)器上,SSD閃存內(nèi)部的多個閃存顆粒(die)上也采用了RAID技術(shù)容錯。RAID有一系列的陣列配置用于實現(xiàn)不同的性能和可靠性需求。常用的配置有:
RAID0 亦稱為數(shù)據(jù)條帶化(data striping)。它將兩個以上的磁盤并聯(lián)起來,成為一個大容量的磁盤。數(shù)據(jù)分段后分散存儲在這些磁盤中,讀寫可并行處理。在所有的RAID級別中,RAID 0速度最快但不具備容錯能力。
RAID1 由兩組以上的N個磁盤相互作鏡像,在一些多線程操作系統(tǒng)中能有很好的讀取速度,理論上讀取速度等于硬盤數(shù)量的倍數(shù),與RAID 0相同。另外寫入速度有微小的降低。只要一個磁盤正常即可維持運作,可靠性最高,磁盤利用率最低。
RAID5 把數(shù)據(jù)和相對應(yīng)的奇偶校驗信息存儲于不同的磁盤上。當(dāng)RAID 5的一個磁盤數(shù)據(jù)發(fā)生損壞后,可以利用剩下的數(shù)據(jù)和相應(yīng)的奇偶校驗信息去恢復(fù)被損壞的數(shù)據(jù)。RAID 5可以理解為是RAID 0和RAID 1的折衷方案。
RAID6 與RAID 5相比,增加了第二個獨立的奇偶校驗信息塊。兩個獨立的奇偶系統(tǒng)使用不同的算法,數(shù)據(jù)的可靠性非常高,任意兩塊磁盤同時失效時不會影響數(shù)據(jù)完整性。更換新磁盤后,資料將會重新算出并寫入新的磁盤中。



圖3 RAID常用配置實現(xiàn) [3]
此外,還有RAID01、RAID10、RAID50、RAID60等靈活組合方式。RAID01是指RAID0為基礎(chǔ)陣列配置,多個RAID0陣列組合成RAID1,其他組合同理。各個配置的RAID特點對比詳見表3。RAID6引入多個校驗塊并分散化的配置本質(zhì)上是RS糾刪碼(Erasure Coding)[4]的一個特例。RS糾刪碼是基于數(shù)學(xué)模型實現(xiàn)校驗塊生成并最優(yōu)化數(shù)據(jù)塊和校驗塊分布,目前廣泛應(yīng)用于分布式存儲中。
表3 RAID特點對比 [3]

2.3存儲快照
主要是實現(xiàn)數(shù)據(jù)的邏輯保護(hù),即在出現(xiàn)誤刪除或者其他軟硬件缺陷等原因?qū)е聰?shù)據(jù)破壞時,通過快照技術(shù)可將數(shù)據(jù)恢復(fù)到之前的某一個時間點??梢詫⒋鎯ο到y(tǒng)抽象為數(shù)據(jù)塊的集合,快照相當(dāng)于在指定時間點給所有數(shù)據(jù)塊拍了一張照片??煺湛梢栽谖募到y(tǒng)或者塊設(shè)備層面實現(xiàn),重點考慮的是原始數(shù)據(jù)更新后快照數(shù)據(jù)的保留和管理。可以在存儲系統(tǒng)的元數(shù)據(jù)中通過位圖等機(jī)制對數(shù)據(jù)塊進(jìn)行管理和標(biāo)記,當(dāng)有更新發(fā)生時,將原始數(shù)據(jù)塊拷貝到新位置,將快照的位圖指向新地址。如下圖所示,這種方法稱為COW(Copy-On-Write)。另一種方式是ROW(Redirect-On-Write),更新時并不在原始位置寫入數(shù)據(jù),而是分配新位置。對于日志結(jié)構(gòu)文件系統(tǒng)等異地更新的設(shè)計使用ROW實現(xiàn)快照較為常見??煺蘸驮袛?shù)據(jù)存儲共享數(shù)據(jù)塊,當(dāng)原始存儲文件刪除時,快照對原始數(shù)據(jù)塊的引用依然存在,數(shù)據(jù)塊不會被刪除。
圖4 COW存儲快照示意圖
除了快照,備份也是常用的數(shù)據(jù)保護(hù)技術(shù)。數(shù)據(jù)備份是獨立于原始數(shù)據(jù)的,消耗存儲資源較多。快照相對輕量級,但在原始數(shù)據(jù)被破壞的情況下無法恢復(fù)出正確數(shù)據(jù)。此外,還有更為強(qiáng)大的CDP(Continuous Data Protection)技術(shù)。如果說快照是給存儲系統(tǒng)拍一張照片的化,CDP就是一個錄像機(jī)。它可以恢復(fù)到系統(tǒng)任意時間點的狀態(tài),同時不像快照為了保證一致性需要一個時間窗口暫停業(yè)務(wù)運行。具體技術(shù)實現(xiàn)這里不再展開,有興趣可參考[5]。
2.4其他針對性技術(shù)
在前述可靠性相關(guān)技術(shù)之外,針對邏輯缺陷和器件特性還有一些專門的數(shù)據(jù)保護(hù)方案,例如:
NetAPP的WAFL(Write Anywhere File Layout)[6] 開發(fā)了增量校驗機(jī)制用于識別文件系統(tǒng)之外的數(shù)據(jù)破壞,確保元數(shù)據(jù)塊在內(nèi)存和存儲上受到端到端的保護(hù)。同時還實現(xiàn)了事務(wù)審計模塊,利用元數(shù)據(jù)之間的一致性關(guān)系識別出異常、邏輯錯誤等情況。這些一致性關(guān)系可以總結(jié)為一致性等式,比如:
a .每個inode維護(hù)一個自己使用的數(shù)據(jù)塊數(shù)量,文件系統(tǒng)也維護(hù)一個已分配數(shù)據(jù)塊數(shù)量,這兩個數(shù)量應(yīng)該一致。
b .文件系統(tǒng)塊分配的位圖中有記錄每個數(shù)據(jù)塊的分配狀態(tài),可以計算得出空閑數(shù)據(jù)塊的數(shù)量。這同文件系統(tǒng)中維護(hù)的空閑數(shù)據(jù)塊數(shù)量應(yīng)該一致。
此外,WAFL還增加了增量校驗內(nèi)存頁保護(hù)機(jī)制,通過在不更新時將頁表項設(shè)為只讀在被外部修改時觸發(fā)異常。這可以用于發(fā)現(xiàn)存儲系統(tǒng)外部引發(fā)的數(shù)據(jù)錯誤。出于性能考慮,內(nèi)存頁保護(hù)技術(shù)一般只應(yīng)用于內(nèi)部測試版本。
針對NAND閃存中的存儲單元在內(nèi)外部環(huán)境變化下出現(xiàn)的電壓平移,SSD設(shè)計了數(shù)據(jù)重讀機(jī)制??赏ㄟ^不斷改變參考電壓嘗試讀取數(shù)據(jù),直到數(shù)據(jù)校驗正確即可恢復(fù)數(shù)據(jù)。為了防患于未然,避免發(fā)生ECC不可恢復(fù)的情況。SSD還有掃描重寫機(jī)制,讀取數(shù)據(jù)并在比特翻轉(zhuǎn)情況過一定閾值時重寫數(shù)據(jù)。
三、總結(jié)
以上就是對單機(jī)存儲系統(tǒng)可靠性及相關(guān)技術(shù)的一個簡單介紹,可靠性是存儲系統(tǒng)最重要的基礎(chǔ)能力。智能終端設(shè)備相比服務(wù)器有較安全穩(wěn)定的使用環(huán)境,在可靠性能力的構(gòu)建上可側(cè)重于增加數(shù)據(jù)可靠性??墒┬械臄?shù)據(jù)保護(hù)技術(shù)包括但不限于:數(shù)據(jù)校驗、快照備份、文件系統(tǒng)事務(wù)審計、應(yīng)用行為監(jiān)控等。
參考文獻(xiàn):
[1] Linux Storage Stack Diagram, https://www.thomas-krenn.com/en/wiki/Linux_Storage_Stack_Diagram
[2] ?固態(tài)硬盤一年不通電,數(shù)據(jù)會自動消失?, https://zhuanlan.zhihu.com/p/39916936
[3] RAID, https://en.wikipedia.org/wiki/RAID
[4] Reed–Solomon error correction, https://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_correction
[5] Continuous Data Protection, https://en.wikipedia.org/wiki/Continuous_Data_Protection
[6] Kumar et.al, High Performance Metadata Integrity Protection in the WAFL Copy-on-Write File System, FAST 17