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