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

淺談重刪壓縮技術(一)

th (1).jpg

 


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

更多內容,請關注公衆號「new_storage」數據庫

重刪壓縮是什麼?

重刪和壓縮時徹底不一樣的兩種技術,解決不一樣的問題。       緩存

重刪:就是說有不少分相同的數據,我只存儲其中一份,其餘的重複數據塊我保留一個地址引用到這個惟一存儲的塊便可。服務器

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

好比說用1表明「AB」,用2表明「CD」,而後用255 來表明「hanfute」。1255只須要8bit,而「AB」「CD」或者「hanfute」則須要不少的空間,這樣屢次掃描替代以後,就能夠快速的將數據縮減。網絡

D_and_C_Image_5.jpg

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

重刪的實現

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

data-matching-deduplication.png

這裏面涉及到幾個問題:ide

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存儲來講這幾乎是不可接受。

如何實現高效的重刪壓縮

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

相關文章
相關標籤/搜索