作為一個做企業存儲市場的存儲人,最近兩年我不斷被重刪壓縮撩撥著。對于重刪壓縮這個技術的好壞,真實需求還是偽需求大家看法不一。今天我就只能談談我個人的看法。更多觀點請關注“圍爐煮酒論IT”公眾號
重刪壓縮是什么?
重刪和壓縮時完全不同的兩種技術,解決不同的問題。
重刪:就是說有很多分相同的數據,我只存儲其中一份,其他的重復數據塊我保留一個地址引用到這個唯一存儲的塊即可。
壓縮:將一個大字符串中的子串用一個很簡短的數字來標記,然后檢索該字符串出現的位置,用個簡單的字符來替代。從而來減少數據表達所需要的空間,帶來空間節省。
比如說用1代表“AB”,用2代表“CD”,然后用255 來代表“hanfute”。1到255只需要8個bit,而“AB”“CD”或者“hanfute”則需要很多的空間,這樣多次掃描替代之后,就可以快速的將數據縮減。
用通俗的話說:重刪就是講相同的東西只存儲一次,而壓縮則是改造數據排布用一種算法來統計數據的排布模式,從而達到減少數據存儲的模式。
重刪的實現
重刪的實現技術比較簡單,最簡單的使用就比如我們的郵件服務器,我轉發一份郵件給100個人,大家收到我的郵件后就會產生100個一樣的文件,假設大家的數據盤使用的共享存儲,存儲只需要在每個人存入文件的時候查詢一下這個文件本地有沒有,有我就不再存儲。這樣在存儲上就只存儲了一個文件。這是一個最樸素的理解。
這里面涉及到幾個問題:
1、存儲怎么知道這個文件自己已經存儲了?
2、如果不是存文件,而是塊存儲該怎么辦?
存儲怎么知道這個文件自己已經有了呢?
在計算機里面有個技術名字叫做”指紋”,非常的形象生動,就好像每個人的指紋肯定不一樣,那么我們是不是可以用一個很小的數據來標記一個文件的唯一信息。
這里有很多的算法可以快速的得到一個唯一值,比如說MD5算法、Sha算法。
-
Sha算法是一種不可逆的數據加密算法,只能算指紋出來,但是無法通過指紋反推出來內容。
-
他可以經一個小于2^64的數據轉化成一個160位的不重復的指紋,最關鍵的是他的計算還很快。
-
所以比較兩個數據是否相同,就可以通過計算他的指紋,然后去對比指紋,而不是進行數據的逐字節比對。效率要高得多。
這個指紋有沒有可能重復,比如說兩個人的指紋相同?
按照sha256算法,在4.8*10^29個數據中出現兩個數據指紋重復的概率大概小于10^-18.10^-18就是我們所說的16個9的可靠性。
轉化成存儲語言我們來討論一下。假如說我們的存儲每秒鐘寫入的10萬個文件,按照存儲7*24*365天工作,那么每年寫入的數據為365*24*3,600*10,000=3.15*10^12個文件。如果想讓存儲出現哈希碰撞而導致重刪丟數據(概率大于10^-18),那么需要運行1.52*10^17年,可能會遇到一次。
其實我們主流存儲設備的可靠性一般為99.9999%也就是我們常說的6個9,是遠遠不如哈希值可靠的。這也是很多人擔心的重刪會不會把我的數據刪除沒有了,導致我的數據損壞呢,其實不用這個擔心。
但是還是有人會擔心,怎么辦呢?還有另外一種方法,那就是遇到一個新數據,我就用兩種算法,存儲兩個hash值,遇到了重復數據進行兩重hash比對。但是有人還是對hash算法有擔心,也簡單,對于重復數據我們再進行一次逐字節比對嘛,不過就是會稍微影響性能。
如果不是文件,塊存儲該怎么處理?
重復數據刪除技術在塊存儲的實現比較多樣化。
最簡單最基本的方式就是直接定長重刪。所以寫入的數據按照固定長度進行切片,切片后進行hash計算,然后進行寫入處理,非重復數據就單獨寫入,重復數據就寫入引用即可。
但是這種處理方式重刪率是比較低的,比如說一個文件,我們只在文件上添加一個字符,然重新寫入,這個文件采用定長方式切片后就無法找到和以前相同的塊,導致無法被重刪掉數據。因此業界也有很多的邊長重刪的算法。
但是變長重刪對性能和算法要求都比較高,同時對于CPU內存消耗也大,影響了數據的實時處理效率。畢竟存儲主要還是處理主機的IO讀寫響應的。只有在備份歸檔領域用的比較多,因為這個場景節省空間比快速響應要求高的多。
以下面這個圖片為例,變長重刪效率可能達到10:1,而定長重刪只有3:1.
因此,對于全閃存存儲這種響應要求高的,建議定長重刪,速度快。對于歸檔、備份這種冷存儲建議變長重刪,重刪率高節省成本。
重刪總結
其實重刪這個功能在全閃存市場用處并不大,因為很多時候定長重刪的效果很有限,比較典型的比如數據庫場景,重刪率只有可憐的1.05:1幾乎可以忽略不計。
對于全閃存來說壓縮更有效,下面我們來看看壓縮技術。
壓縮技術的實現
壓縮技術由來已久,分為無損壓縮和有損壓縮。
有損壓縮主要用于圖像處理領域,比如說我微信發一個照片,明明本地10M的高清圖片傳輸到朋友手機里面就有300K的圖片。這主要為了節省網絡傳輸的流量以及微信存儲空間節省。
存儲系統領域用的壓縮都是無損壓縮。借助于算法的普及,業界主流存儲廠商的壓縮實現幾乎都沒有算法上的區別,只是在于壓縮的實現選擇上,主要考慮兼顧性能和數據縮減率。
那么壓縮對存儲的性能影響有多大?
壓縮對存儲的性能影響有多大
基于EMC Unity Sizer的性能評估工具,我們大概可以看到開啟壓縮相對于不開啟壓縮,IOPS從20萬左右降低到了12萬,存儲性能下降大概是40%。
其實我們最新的intel CPU里面已經集成了壓縮算法,我上次私下里和我們測試經理進行了數據的了解,在開啟壓縮,滿負載的進行存儲性能壓力測試,存儲CPU利用率75%的時候,其中用于壓縮所消耗的CPU資源不到3%。為什么存儲性能下降了這么多???
實現壓縮帶來的ROW架構性效率下降
我們傳統的存儲,不需要壓縮的時候,我們每個數據都是由自己在硬盤上的固定地址的。比如說LUN1的LBA00xx64~00x128 存儲在5號磁盤的低8個扇區的第X位開始的連續64bit地址上。如果我以8KB為存儲的最小塊大小,那么每個8KB都是存儲在一個固定的8KB的物理盤片的具體物理地址上。在我第一次寫入的時候被我所獨占。
以后這個8KB不管怎么改寫讀取,都是8KB。記錄這些數據存儲的位置的方式非常簡單。假如說一個LUN一共1TB,那么我就記錄這么1TB分布在幾個盤里面,用一個很簡單的算法將他分布在那個盤的那個物理地址輕松地就算了出來。我只需要記錄一共由幾塊盤,一共組成了幾個RAID組,每個RAID條帶深度是多少,起始地址是多少,就能在內存中快速的用這些基本數據算出數據對應的物理地址是多少。
這種基本的寫入模式叫做COW(copy on write),就是說寫前拷貝。
傳統的RAID模式注定了 我們只要改寫一個位,就需要將原有數據和校驗數據同時讀取,然后在內存中計算后再寫進去。讀取的原因是為了方式寫入失敗我可以恢復回去.
而寫前拷貝并不是指的這個問題,而是指在有數據快照的情況下如何寫入,這個時候我們不能破壞快照的數據,就只能將原有位置的數據拷貝到一個專門的快照存儲區域。這稱之為COW,他是相對于ROW(redirect on write)而發明的一個詞。
國內很多人對于COW叫做“靠”架構。
由于壓縮后一個8KB的數據有可能變成了1Kb、2KB、3KB也可能是8KB,那么我的數據就是一個可變的長度,如果還采用物理地址和邏輯地址一一對應的方式我就達不到節省空間的效果了。我將一個8KB的塊壓縮成了1KB,結果你還是給我分配了8KB物理空間來存儲,這簡直就是不合適。因此在壓縮的實現上,存儲一般都采用ROW架構來實現。
ROW帶來了那些性能下降
1、由于ROW架構每個塊都需要單獨存儲一次地址的映射關系,所以容量越大,產生的元數據量也越大,所以ROW架構一般容量越大,性能越差。
為了更好的處理數據,肯定想元數據全部在內存中緩存是效率最好的,所以ROW架構存儲對內存的訴求很大。
2、由于ROW架構每次寫入都需要記錄地址元數據,處于可靠性考慮,我們肯定需要持久化,每次都要元數據下盤,這樣一次寫入就會產生兩次的操作,寫入元數據,寫入數據。
3、由于ROW架構的數據寫入采用了新找地址寫入,這樣原來邏輯上連續的數據會被不斷的離散化,最終連續IO也會變成隨機IO,對性能影響較大
4、ROW帶來了另一個問題,以上圖為例,我們如果沒有快照,那么C這個數據塊就是一個無效的數據,但是我們并不會在寫入的時候立即的刪除這個數據,因為會影響性能。我們就需要在沒有連續空間或者業務空閑的時候專門來處理這些失效的塊。這個也就是我們經常所說的垃圾回收,垃圾回收對性能影響很大,很多廠商干脆就不回收,而采用直接填空寫入的方式。不管哪種方式對于垃圾空間的重復利用是對性能影響極大的一個操作。
這些問題在傳統硬盤場景影響更為明顯,這也是以前Netapp在HDD時代性能被詬病的一個原因。
而SSD盤內部的數據處理也是類似,SSD中開啟垃圾回收導致的性能下降被稱之為“寫懸崖”
壓縮總結:
壓縮對于存儲性能帶來的沖擊,根本不是來自與壓縮本身,而是由于實現壓縮的架構而帶來的影響。
按照當前業界主流存儲廠商的軟件架構和效率來評估,一般ROW架構的存儲相對于COW架構在性能上大概要下降35%左右,而壓縮本身帶來的性能損失一般在5%以內,所以對于整個存儲系統來說,開啟壓縮性能下降幅度大概在40%左右
在ROW架構上實現重刪還有有哪些沖擊呢
相對于壓縮在內存中計算完成后就直接寫入,重刪的影響更大:
1、需要有單獨的空間來存儲指紋(帶來了內存可支持存儲空間越來越小)
2、每次寫入都需要進行指紋比對(讀寫時延增加)
3、對于一個新數據塊的寫入產生了大幅的放大(指紋庫記錄一次、數據塊寫入一次、元數據記錄映射一次),所以很多時候重刪帶來的性能主要在時延。
極端情況:一個典型的極端情況,如果是HDD存儲環境,我們假設我們ROW系統的定長塊大小是8KB,如果我寫入一個128KB的數據,會被切片成16個數據片,進行16*3次數據下盤操作,最終的時延可以達到HDD本身的48倍,假設一個HDD響應是5ms,那么這個整個IO的響應時延達到了200ms以上,對于SAN存儲來說這幾乎是不可接受。
如何實現高效的重刪壓縮
重刪壓縮對性能的影響大家都知道,如何降低存儲壓縮帶來的性能影響,我們在下一篇文章來詳細的介紹。
核心關注:拓步ERP系統平臺是覆蓋了眾多的業務領域、行業應用,蘊涵了豐富的ERP管理思想,集成了ERP軟件業務管理理念,功能涉及供應鏈、成本、制造、CRM、HR等眾多業務領域的管理,全面涵蓋了企業關注ERP管理系統的核心領域,是眾多中小企業信息化建設首選的ERP管理軟件信賴品牌。
轉載請注明出處:拓步ERP資訊網http://www.guhuozai8.cn/
本文標題:淺談存儲重刪壓縮技術
本文網址:http://www.guhuozai8.cn/html/consultation/10839624469.html