淺談存儲重刪壓縮技術(一)

淺談重刪壓縮技術(一)

th (1).jpg

 


作爲一個做企業存儲市場的存儲人,最近兩年我不斷被重刪壓縮撩撥着。對於重刪壓縮這個技術的好壞,真實需求還是僞需求大家看法不一。今天我就只能談談我個人的看法。

更多內容,請關注公衆號“new_storage”

重刪壓縮是什麼?

重刪和壓縮時完全不同的兩種技術,解決不同的問題。       

重刪:就是說有很多分相同的數據,我只存儲其中一份,其他的重複數據塊我保留一個地址引用到這個唯一存儲的塊即可。

壓縮:將一個大字符串中的子串用一個很簡短的數字來標記,然後檢索該字符串出現的位置,用個簡單的字符來替代。從而來減少數據表達所需要的空間,帶來空間節省。

比如說用1代表“AB”,用2代表“CD”,然後用255 來代表“hanfute”。1255只需要8bit,而“AB”“CD”或者“hanfute”則需要很多的空間,這樣多次掃描替代之後,就可以快速的將數據縮減。

D_and_C_Image_5.jpg

用通俗的話說:重刪就是講相同的東西只存儲一次,而壓縮則是改造數據排布用一種算法來統計數據的排布模式,從而達到減少數據存儲的模式。

重刪的實現

重刪的實現技術比較簡單,最簡單的使用就比如我們的郵件服務器,我轉發一份郵件給100個人,大家收到我的郵件後就會產生100個一樣的文件,假設大家的數據盤使用的共享存儲,存儲只需要在每個人存入文件的時候查詢一下這個文件本地有沒有,有我就不再存儲。這樣在存儲上就只存儲了一個文件。這是一個最樸素的理解。

data-matching-deduplication.png

這裏面涉及到幾個問題:

1,  存儲怎麼知道這個文件自己已經存儲了?

2,  如果不是存文件,而是塊存儲該怎麼辦?

 

存儲怎麼知道這個文件自己已經有了呢?

在計算機裏面有個技術名字叫做指紋”,非常的形象生動,就好像每個人的指紋肯定不一樣,那麼我們是不是可以用一個很小的數據來標記一個文件的唯一信息。

         這裏有很多的算法可以快速的得到一個唯一值,比如說MD5算法、Sha算法。

l  Sha算法是一種不可逆的數據加密算法,只能算指紋出來,但是無法通過指紋反推出來內容。

l  他可以經一個小於2^64的數據轉化成一個160位的不重複的指紋,最關鍵的是他的計算還很快。

l  所以比較兩個數據是否相同,就可以通過計算他的指紋,然後去對比指紋,而不是進行數據的逐字節比對。效率要高得多。

這個指紋有沒有可能重複,比如說兩個人的指紋相同?

按照sha256算法,在4.8*10^29個數據中出現兩個數據指紋重複的概率大概小於10^-18.10^-18就是我們所說的169的可靠性。

    1513604585(1).jpg

轉化成存儲語言我們來討論一下。假如說我們的存儲每秒鐘寫入的10萬個文件,按照存儲7*24*365天工作,那麼每年寫入的數據爲365*24*3,600*10,000=3.15*10^12個文件。如果想讓存儲出現哈希碰撞而導致重刪丟數據(概率大於10^-18),那麼需要運行1.52*10^17年,可能會遇到一次。

1513604541.png

其實我們主流存儲設備的可靠性一般爲99.9999%也就是我們常說的69,是遠遠不如哈希值可靠的。這也是很多人擔心的重刪會不會把我的數據刪除沒有了,導致我的數據損壞呢,其實不用這個擔心。

但是還是有人會擔心,怎麼辦呢?還有另外一種方法,那就是遇到一個新數據,我就用兩種算法,存儲兩個hash值,遇到了重複數據進行兩重hash比對。

但是有人還是對hash算法有擔心,也簡單,對於重複數據我們再進行一次逐字節比對嘛,不過就是會稍微影響性能。

如果不是文件,塊存儲該怎麼處理?

重複數據刪除技術在塊存儲的實現比較多樣化。

最簡單最基本的方式就是直接定長重刪。所以寫入的數據按照固定長度進行切片,切片後進行hash計算,然後進行寫入處理,非重複數據就單獨寫入,重複數據就寫入引用即可。

120208vr_maxwell04.jpg

         但是這種處理方式重刪率是比較低的,比如說一個文件,我們只在文件上添加一個字符,然重新寫入,這個文件採用定長方式切片後就無法找到和以前相同的塊,導致無法被重刪掉數據。因此業界也有很多的邊長重刪的算法。

         但是變長重刪對性能和算法要求都比較高,同時對於CPU內存消耗也大,影響了數據的實時處理效率。畢竟存儲主要還是處理主機的IO讀寫響應的。只有在備份歸檔領域用的比較多,因爲這個場景節省空間比快速響應要求高的多。

以下面這個圖片爲例,變長重刪效率可能達到10:1,而定長重刪只有3:1.

StorageReview-Exablox-Dedpue.jpg

因此,對於全閃存存儲這種響應要求高的,建議定長重刪,速度快。對於歸檔、備份這種冷存儲建議變長重刪,重刪率高節省成本。

 

 

重刪總結

其實重刪這個功能在全閃存市場用處並不大,因爲很多時候定長重刪的效果很有限,比較典型的比如數據庫場景,重刪率只有可憐的1.051幾乎可以忽略不計。

         對於全閃存來說壓縮更有效,下面我們來看看壓縮技術。

 

壓縮技術的實現

壓縮技術由來已久,分爲無損壓縮和有損壓縮。

LOSSY.GIF

有損壓縮主要用於圖像處理領域,比如說我微信發一個照片,明明本地10M的高清圖片傳輸到朋友手機裏面就有300K的圖片。這主要爲了節省網絡傳輸的流量以及微信存儲空間節省。

存儲系統領域用的壓縮都是無損壓縮。藉助於算法的普及,業界主流存儲廠商的壓縮實現幾乎都沒有算法上的區別,只是在於壓縮的實現選擇上,主要考慮兼顧性能和數據縮減率。

那麼壓縮對存儲的性能影響有多大?

壓縮對存儲的性能影響有多大

基於EMC Unity Sizer的性能評估工具,我們大概可以看到開啓壓縮相對於不開啓壓縮,IOPS20萬左右降低到了12萬,存儲性能下降大概是40%

 

         圖片1.png

其實我們最新的intel CPU裏面已經集成了壓縮算法,我上次私下裏和我們測試經理進行了數據的瞭解,在開啓壓縮,滿負載的進行存儲性能壓力測試,存儲CPU利用率75%的時候,其中用於壓縮所消耗的CPU資源不到3%。爲什麼存儲性能下降了這麼多???

實現壓縮帶來的ROW架構性效率下降

我們傳統的存儲,不需要壓縮的時候,我們每個數據都是由自己在硬盤上的固定地址的。比如說LUN1LBA00xx64~00x128 存儲在5號磁盤的低8個扇區的第X位開始的連續64bit地址上。如果我以8KB爲存儲的最小塊大小,那麼每個8KB都是存儲在一個固定的8KB的物理盤片的具體物理地址上。在我第一次寫入的時候被我所獨佔。

th.jpg

以後這個8KB不管怎麼改寫讀取,都是8KB。記錄這些數據存儲的位置的方式非常簡單。假如說一個LUN一共1TB,那麼我就記錄這麼1TB分佈在幾個盤裏面,用一個很簡單的算法將他分佈在那個盤的那個物理地址輕鬆地就算了出來。我只需要記錄一共由幾塊盤,一共組成了幾個RAID組,每個RAID條帶深度是多少,起始地址是多少,就能在內存中快速的用這些基本數據算出數據對應的物理地址是多少。

這種基本的寫入模式叫做COWcopy on write,就是說寫前拷貝。

Copy-On-Write_3_new.png

傳統的RAID模式註定了 我們只要改寫一個位,就需要將原有數據和校驗數據同時讀取,然後在內存中計算後再寫進去。讀取的原因是爲了方式寫入失敗我可以恢復回去.

而寫前拷貝並不是指的這個問題,而是指在有數據快照的情況下如何寫入,這個時候我們不能破壞快照的數據,就只能將原有位置的數據拷貝到一個專門的快照存儲區域。這稱之爲COW,他是相對於ROWredirect on write)而發明的一個詞。

國內很多人對於COW叫做“靠”架構。

由於壓縮後一個8KB的數據有可能變成了1Kb2KB3KB也可能是8KB,那麼我的數據就是一個可變的長度,如果還採用物理地址和邏輯地址一一對應的方式我就達不到節省空間的效果了。我將一個8KB的塊壓縮成了1KB,結果你還是給我分配了8KB物理空間來存儲,這簡直就是不合適。因此在壓縮的實現上,存儲一般都採用ROW架構來實現。

row.jpg

ROW帶來了那些性能下降

1,              由於ROW架構每個塊都需要單獨存儲一次地址的映射關係,所以容量越大,產生的元數據量也越大,所以ROW架構一般容量越大,性能越差。

爲了更好的處理數據,肯定想元數據全部在內存中緩存是效率最好的,所以ROW架構存儲對內存的訴求很大。

2,              由於ROW架構每次寫入都需要記錄地址元數據,處於可靠性考慮,我們肯定需要持久化,每次都要元數據下盤,這樣一次寫入就會產生兩次的操作,寫入元數據,寫入數據。

3,              由於ROW架構的數據寫入採用了新找地址寫入,這樣原來邏輯上連續的數據會被不斷的離散化,最終連續IO也會變成隨機IO,對性能影響較大

4,              ROW帶來了另一個問題,以上圖爲例,我們如果沒有快照,那麼C這個數據塊就是一個無效的數據,但是我們並不會在寫入的時候立即的刪除這個數據,因爲會影響性能。我們就需要在沒有連續空間或者業務空閒的時候專門來處理這些失效的塊。這個也就是我們經常所說的垃圾回收,垃圾回收對性能影響很大,很多廠商乾脆就不回收,而採用直接填空寫入的方式。不管哪種方式對於垃圾空間的重複利用是對性能影響極大的一個操作。

這些問題在傳統硬盤場景影響更爲明顯,這也是以前NetappHDD時代性能被詬病的一個原因。

SSD盤內部的數據處理也是類似,SSD中開啓垃圾回收導致的性能下降被稱之爲“寫懸崖”

圖片1.jpg

壓縮總結:

壓縮對於存儲性能帶來的衝擊,根本不是來自與壓縮本身,而是由於實現壓縮的架構而帶來的影響。

按照當前業界主流存儲廠商的軟件架構和效率來評估,一般ROW架構的存儲相對於COW架構在性能上大概要下降35%左右,而壓縮本身帶來的性能損失一般在5%以內,所以對於整個存儲系統來說,開啓壓縮性能下降幅度大概在40%左右

 

ROW架構上實現重刪還有有哪些衝擊呢

相對於壓縮在內存中計算完成後就直接寫入,重刪的影響更大:

1,  需要有單獨的空間來存儲指紋(帶來了內存可支持存儲空間越來越小)

2,  每次寫入都需要進行指紋比對(讀寫時延增加)

3,  對於一個新數據塊的寫入產生了大幅的放大(指紋庫記錄一次、數據塊寫入一次、元數據記錄映射一次),所以很多時候重刪帶來的性能主要在時延。

 

極端情況:一個典型的極端情況,如果是HDD存儲環境,我們假設我們ROW系統的定長塊大小是8KB,如果我寫入一個128KB的數據,會被切片成16個數據片,進行16*3次數據下盤操作,最終的時延可以達到HDD本身的48倍,假設一個HDD響應是5ms,那麼這個整個IO的響應時延達到了200ms以上,對於SAN存儲來說這幾乎是不可接受。

如何實現高效的重刪壓縮

重刪壓縮對性能的影響大家都知道,如何降低存儲壓縮帶來的性能影響,我們在下一篇文章來詳細的介紹。敬請期待



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章