星期二, 10月 30, 2012

zfs檔案系統內建的重複資料消除技術

重複資料消除?
Deduplication 一般常翻為重複資料刪除,總覺得這個翻譯不好,畢竟資料還是在的,沒有資料會因為重複而被刪除,其實刪除改為消除也不完全貼切,曾經想翻為"資料反重複",但是連自己唸起來都覺得怪,最後還是決定用 "重複資料消除"。
重複資料消除是目前高階儲存設備常見的功能,它運用數學演算法將資料編碼,遇到編碼相同的資料就認為是重複資料,這時就不需要再重複儲存相同資料,只要多一筆資料紀錄就好。
很明顯這樣作的好處是可以節省硬碟空間,某些情況甚至能節省數倍的空間,而且在CPU及記憶體效能充足的情況下,也有可能發揮 "以運算效能換取儲存效能" 的作用,增進儲存效能。

重複資料類別?
重複資料可以依 files(檔案), blocks(區塊)或 bytes為級別作為消除重複資料之單位。

File-level︰依整個檔案為重複資料單位,CPU負擔最小,缺點是當檔案異動時,原本相同的重複檔案就變成不同的檔案,適合用在不會異動的照片檔或影片檔。
Block-level︰適合作為虛擬主機的虛擬磁碟,因為虛擬主機的作業系統大部分檔案都是同樣的只有少數檔案不同。這也是ZFS採用的類別。
Byte-level︰以Byte為單位對於CPU的負擔最大,適合用於郵件伺服器的資料檔。

即時消除或批次消除?
重複資料消除的時間點可以是檔案儲存的同時,或另行排定系統較閒的時間批次作業。ZFS採用的是即時消除的作法。

使用方式?

zfs set dedup=on tank

該不該用,如何取捨?

重複資料消除是以CPU和記憶體的運算效能換取儲存空間和效能的一種技術,如果重複資料不多就會白白浪費許多運算效能。ZFS檔案系統的好處是檔案系統繼承了儲存池的設定後仍然可以針對個別檔案系統設定,因此可以依不同檔案系統的資料特性設定。
zfs set dedup=off tank/home
zfs set dedup=on tank/vm
zfs set dedup=on tank/src

Trust 或 verify?
zfs判別重複資料的預設演算法採用 SHA256,它的碰撞機率(不同資料但是編碼相同的機率)是 2的256次方之1,雖然這個機率很小,但是還是擔心它發生的話,只要付出額外的運算效能就能加以避免。
zfs set dedup=verify tank

選擇演算法

如果啟用驗證(verify)功能,可以搭配比較單的fletcher4演算法以減輕CPU負擔。
zfs set dedup=fletcher4,verify tank

規模和效能

重複資料消除的檔案系統愈大就必需使用愈多記憶體,DDTs (dedup tables) 必需存在記憶體中才會有比較好的效能,如果記憶體不足ZFS系統會將部分table資料壓縮存到 L2ARC,如果壓縮後還是不足才會存到磁碟中。

本文節錄自
https://blogs.oracle.com/bonwick/entry/zfs_dedup