針對(duì)靜默數(shù)據(jù)錯(cuò)誤,如何采用DIX和DIF保證數(shù)據(jù)一致性?
靜默數(shù)據(jù)破壞問(wèn)題是一直存在存儲(chǔ)系統(tǒng)中最難解決的數(shù)據(jù)一致性問(wèn)題之一,無(wú)論是傳統(tǒng)多控、分布式存儲(chǔ),還是公有云存儲(chǔ)。對(duì)存儲(chǔ)系統(tǒng)設(shè)計(jì)和開(kāi)發(fā)人員來(lái)講,數(shù)據(jù)一致性問(wèn)題解決能否解決決定著存儲(chǔ)系統(tǒng)是否可以商用。到這個(gè)問(wèn)題一直沒(méi)有成為討論的技術(shù)焦點(diǎn),直到最近騰訊云事件持續(xù)熱化以后,“數(shù)據(jù)一致性”問(wèn)題成成為焦點(diǎn)出現(xiàn)在大眾視野。
什么是靜默數(shù)據(jù)破壞?
經(jīng)常跟數(shù)據(jù)打交道的人都應(yīng)該知道,數(shù)據(jù)在存儲(chǔ)系統(tǒng)傳輸中,經(jīng)過(guò)了多個(gè)部件、多種傳輸通道和復(fù)雜的軟件處理過(guò)程,其中任意一個(gè)環(huán)節(jié)發(fā)生錯(cuò)誤都可能會(huì)導(dǎo)致數(shù)據(jù)錯(cuò)誤。但是這種錯(cuò)誤一般無(wú)法被立即檢測(cè)出來(lái),而是后續(xù)通過(guò)應(yīng)用在訪問(wèn)數(shù)據(jù)過(guò)程中,才發(fā)現(xiàn)數(shù)據(jù)已經(jīng)出錯(cuò),這種數(shù)據(jù)很難在數(shù)據(jù)發(fā)生錯(cuò)誤那一刻被檢查出來(lái)的錯(cuò)誤,我們稱為靜默數(shù)據(jù)破壞,即Silent Data Corruption。
靜默數(shù)據(jù)破壞為什么難檢測(cè)?
我們知道硬盤最核心的使命是正確的存入數(shù)據(jù)、正確的讀出數(shù)據(jù),在出錯(cuò)時(shí)及時(shí)拋出異常告警。包括硬件錯(cuò)誤、固件 BUG 或者軟件 BUG、供電問(wèn)題、介質(zhì)損壞等常規(guī)的這些問(wèn)題都能夠正常被捕獲拋出告警或異常,但靜默數(shù)據(jù)破壞表現(xiàn)是數(shù)據(jù)處理都是正常的,直到你使用的時(shí)候才發(fā)現(xiàn)數(shù)據(jù)是錯(cuò)誤的、損壞的。
靜默數(shù)據(jù)破壞產(chǎn)生原因
數(shù)據(jù)產(chǎn)生靜默數(shù)據(jù)破壞的原因有很多種,但大致可以歸結(jié)為以下幾類。
- 硬件錯(cuò)誤:內(nèi)存、CPU、硬盤、數(shù)據(jù)傳輸鏈路等
- Firmware錯(cuò)誤:HBA、硬盤等
- 軟件bug:系統(tǒng)軟件、操作系統(tǒng)、應(yīng)用程序等
- 其他因素:如噪聲、電磁等原因。
數(shù)據(jù)一致性標(biāo)準(zhǔn)和組織
根據(jù)數(shù)據(jù)處理的路徑,數(shù)據(jù)一致性修復(fù)可以在應(yīng)用,中間件,存儲(chǔ)層等來(lái)進(jìn)行修復(fù),目前有大量的介紹應(yīng)用層修復(fù)的文章,請(qǐng)大家搜索參考。今天筆者講從傳統(tǒng)存儲(chǔ)、網(wǎng)絡(luò)和中間件層出發(fā),基于很早分享過(guò)一篇文章,談?wù)劧说蕉说臄?shù)據(jù)一致性解決方案。
在2007年,由Emulex、Oracle、LSI、希捷成立了DII (Data Integrity Initiative),由SNIA建立了DITWG(SNIA Data Integrity Working Group)。他們主要關(guān)注兩個(gè)技術(shù):
- T10 Protection Information—DIF
- Data Integrity Extensions—DIX
T10標(biāo)準(zhǔn)是通過(guò)對(duì)每個(gè)數(shù)據(jù)塊加入保護(hù)信息(PI,Protection Information)作為一致性標(biāo)識(shí),T10曾被稱作數(shù)據(jù)完整性域(DIF,Data Integrity Field)的方法來(lái)保護(hù)數(shù)據(jù)完整性。在每個(gè)邏輯扇區(qū)擴(kuò)充了8字節(jié)的保護(hù)信息用來(lái)保證數(shù)據(jù)一致性,8字節(jié)包括2字節(jié)的Logical Block Guard,2字節(jié)的Logical Block Application Tag和4字節(jié)的Logical Block Reference Tag。
T10 PI只包含了從主機(jī)HBA卡通過(guò)存儲(chǔ)陣列到硬盤的數(shù)據(jù)保護(hù),這就需要另一種機(jī)制來(lái)延伸數(shù)據(jù)保護(hù)范圍。
DIX為了延伸DIF的保護(hù)范圍。將數(shù)據(jù)完整性保護(hù)擴(kuò)充到了應(yīng)用層到HBA。DIX使用和T10 PI一樣的8字節(jié)數(shù)據(jù)完整性信息作為數(shù)據(jù)校驗(yàn)字段。不同的是,DIX中使用了IP Checksum作為L(zhǎng)ogical Block Guard,降低主機(jī)CPU的計(jì)算開(kāi)銷。
DIX+DIF可以實(shí)現(xiàn)從應(yīng)用到硬盤的端到端數(shù)據(jù)保護(hù)。DIX保證應(yīng)用、HBA卡的數(shù)據(jù)完整性,T10 PI(DIF)保證HBA 、陣列和硬盤的數(shù)據(jù)完整性。
DIX和DIF數(shù)據(jù)讀寫流程
數(shù)據(jù)完整性額外添加的8字節(jié)校驗(yàn)數(shù)據(jù)分若干段,在存儲(chǔ)側(cè)叫DIF,后改名為T10 PI;在主機(jī)側(cè)叫DIX。寫數(shù)據(jù)時(shí),主機(jī)HBA總線適配器、陣列目標(biāo)器芯片或者其它組件根據(jù)用戶數(shù)據(jù)生成 8字節(jié)PI,數(shù)據(jù)傳輸過(guò)程中會(huì)經(jīng)過(guò)檢查點(diǎn),校驗(yàn)數(shù)據(jù)和PI是否匹配,如果發(fā)現(xiàn)錯(cuò)誤,向上返回錯(cuò)誤,如果沒(méi)有錯(cuò)誤,則繼續(xù)向下傳輸,最終寫入硬盤。
寫數(shù)據(jù)流程:當(dāng)數(shù)據(jù)寫到主機(jī)內(nèi)存的時(shí)候,Oracle ASM library會(huì)對(duì)每512字節(jié)數(shù)據(jù)增加8字節(jié)DIX校驗(yàn),8字節(jié)校驗(yàn)會(huì)隨IO請(qǐng)求一起,穿過(guò)OS,到達(dá)HBA卡驅(qū)動(dòng);HBA卡進(jìn)行DIX校驗(yàn)檢查后刪除DIX校驗(yàn),并生成8字節(jié)PI校驗(yàn)和數(shù)據(jù)一起發(fā)送給陣列,陣列校驗(yàn)數(shù)據(jù)完整性,并將數(shù)據(jù)發(fā)送到硬盤。
讀數(shù)據(jù)流程:從硬盤讀出數(shù)據(jù)和T10 PI并校驗(yàn)完整性。若發(fā)現(xiàn)錯(cuò)誤,則通過(guò)RAID重建修復(fù)數(shù)據(jù),如果沒(méi)有錯(cuò)誤則繼續(xù)向上傳輸。HBA進(jìn)行T10 PI校驗(yàn)后刪除T10 PI,并生成DIX保護(hù)信息返回主機(jī)。DIX保護(hù)信息會(huì)隨IO請(qǐng)求一起,穿過(guò)OS,返回應(yīng)用層。ASM Library對(duì)數(shù)據(jù)和DIX保護(hù)信息進(jìn)行校驗(yàn)。
支持端到端一致性必要條件
要使用數(shù)據(jù)一致性特性,需要操作系統(tǒng)、中間件、HBA卡和存儲(chǔ)支持相應(yīng)的標(biāo)準(zhǔn)規(guī)范。首先陣列需要支持標(biāo)準(zhǔn)的T10 PI,目前很多存儲(chǔ)設(shè)備都支持該標(biāo)準(zhǔn)。當(dāng)然,即使上層不支持DIX,存儲(chǔ)也可支持并采用T10 PI標(biāo)準(zhǔn),實(shí)現(xiàn)存儲(chǔ)側(cè)數(shù)據(jù)一致性保護(hù)。
目前支持DIX標(biāo)準(zhǔn)的上層組件(數(shù)據(jù)庫(kù)、操作系統(tǒng)和HBA),其配置要求和兼容性如下(兼容性會(huì)不斷更新)。
- 數(shù)據(jù)庫(kù):Oracle 11g級(jí)以上。
- OS:Oracle Linux 5 or 6 running the UEK2-200 kernel。
- HBA:Emulex、Qlogic特定型號(hào)的FC HBA卡
支持DIX的存儲(chǔ)廠商
由于DIX和P10在企業(yè)Oracle數(shù)據(jù)庫(kù)應(yīng)用比較廣泛,基于Oracle在數(shù)據(jù)庫(kù)領(lǐng)域的廣泛應(yīng)用和影響力,目前主流的存儲(chǔ)廠商都支持該特性規(guī)范,目前(不完全統(tǒng)計(jì))具備該規(guī)范的產(chǎn)品包括但不限于如下:
- EMC VNX系列支持自定義T10 PI、VMAX支持標(biāo)準(zhǔn)的T10 PI和DIX
- HDS HUS系列和HDS VSP支持T10 PI
- IBM DS8000和DS5000某些特定型號(hào)支持T10 PI
- HP P10000支持標(biāo)準(zhǔn)的T10 PI
- 華為 OceanStor 18000和V3/V5全系列支持T10 PI。
文件系統(tǒng)是否要DIF
需要提及一點(diǎn)的是,T10 PI需要磁盤提供520扇區(qū)來(lái)支持(512用來(lái)存放數(shù)據(jù),8字節(jié)用來(lái)存儲(chǔ)T10 PI校驗(yàn)數(shù)據(jù)),希捷支持這種磁盤。一般情況下,文件系統(tǒng)不需要DIF,原因是文件系統(tǒng)通過(guò)元數(shù)據(jù)管理數(shù)據(jù),元數(shù)據(jù)不斷變化,容易造成IO的頁(yè)面數(shù)據(jù)布局不斷變化,針對(duì)文件,數(shù)據(jù)庫(kù)和網(wǎng)卡廠商相應(yīng)支持力度不足,并未形成類似規(guī)范和標(biāo)準(zhǔn)。