1. 程式人生 > >詳談Lustre背後的故事,ZFS前世和今生

詳談Lustre背後的故事,ZFS前世和今生

640?wx_fmt=png

640?wx_fmt=gif

      故事還得從SUN和Solaris說起。曾經有一個伺服器巨頭,它的名字叫SUN(Sun Microsystems),給IT界帶來過無限光明,無論是佔據應用開發半片江山的Java,還是資料庫當家花旦MySQL,以及虛擬化先驅VirtualBox,都是出之其手,更難能可貴的是這些重量級作品都是開源的(Open Source)。

      但在被Oracle收購之後Sun基本從大眾視野中消失了,原來Sun的許多科學家大牛也紛紛奔走他鄉,Sun的許多專案被雪藏的雪藏,閉源的閉源,其中強大的作業系統Solaris(SunOS),Solaris是Unix的衍生版,跟Linux同源,但是Sun在開發Solaris上投入了巨大的研發精力,在二十一世紀初,搭載Solaris的Sun伺服器仍然是業內不少公司的首選。

      Solaris具備有許多當時Linux所沒有的特性,比如ACPI,CPU HotPlug等,還有就是我們要講的主角ZFS檔案系統(Lustre基於ZFS實現儲存管理)。

      ZFS檔案系統(Zettabyte  File System),是由Jeff Bonwick (原Sun的CTO)領導開發的次世代檔案系統,是第一個128位的檔案系統,同時被Sun稱作史上最後一個檔案系統(The Last Word In File Systems), ZFS作為一個革命性全新的檔案系統,全面拋棄傳統File System + Volume Manager + Storage(檔案系統+卷管理+儲存)的架構,所有的儲存裝置是通過ZFS 池進行管理,只要把各種儲存裝置加入同一個ZFS 池,大家就可以輕鬆的在這個ZFS 池管理配置檔案系統, 也就是說ZFS一方面承擔著檔案系統的角色,另一方面還兼顧儲存管理。

      對於Sun而言,當初是ZFS作為私有閉原始檔系統開發,作為Solaris的殺手鐗,想依次搶回部分市場份額,繼而東山再起,但是時運不濟,進入二十一世紀的Sun一直在走下坡路,一直處於虧損狀態,到2005年ZFS釋出時,是作為OpenSolaris的一部分,CDDL(Common Development and Distribution License)開源形式,也正因為此我們現在才有機會自由研究ZFS,雖然Sun已經離我們遠去,但是ZFS憑藉著自身的各種優點,慢慢走進了大眾的視野。

ZFS的主要特性

      不得不說Jeff Bonwick是位偉大的程式設計師,使得ZFS在設計上要超越同時代的作業系統,卷管理,儲存池,分層快取ARC/L2ARC等,下面我們一一細說ZFS的主要特性

1、元資料完整性

      資料完整性在檔案系統中有非常重要性,ZFS檔案系統採用了256位校驗和,當向磁碟寫入資料的時候,校驗和就會被作為元資料與它相關的資料分開儲存。區別於其他檔案系統的是,ZFS這種校驗和可以檢測出錯位寫、誤讀取和誤寫入、DMA奇偶錯誤、驅動器Bug、意外過量寫入以及常見的物理儲存的衰減,上述的這類錯誤我們通常稱為silent data corruption,一般的檔案系統是無法感知的。

2、寫時拷貝COW(Copy-On-Write)

      ZFS檔案系統是使用多項技術來確保資料在磁碟上的連續性,其中就包括寫時拷貝(Copy on Write),也就是當資料發生變更的時候它並不會過量寫入——它總是在指標指向變更資料之前被寫入到一個新塊和校驗和中。舊的資料可能被儲存下來,在發生變更的過程中建立檔案系統的快照。利用ZFS的檔案寫入是交易/事務型的操作——要麼將所有資料寫入到磁碟,要麼什麼都不寫入。

3、快照Snapshot和克隆Clone

      有了COW,支援快照是理所當然的事了,快照是檔案系統或卷的只讀副本。快照幾乎可以即時建立,而且最初不佔用池中的其他磁碟空間。但是,當活動資料集中的資料發生更改時,快照通過繼續引用舊資料佔用磁碟空間,從而阻止釋放該空間。ZFS 快照具有以下特徵:

  • 可在系統重新引導後存留下來。

  • 理論最大快照數是 264。

  • 不使用單獨的後備儲存。快照直接佔用儲存池(從中建立這些快照的檔案系統所在的儲存池)中的磁碟空間。

  • 遞迴快照可作為一個原子操作快速建立。要麼一起建立快照(一次建立所有快照),要麼不建立任何快照。原子快照操作的優點是始終在一個一致的時間捕獲快照資料,即使跨後代檔案系統也是如此。

      克隆(Clone),也稱為可寫快照,同樣是基於COW,克隆是產生兩個獨立的檔案系統,但是跟原系統共享同一組資料塊,當任何一方發生資料變化,就分配新的儲存塊,未改變的資料任然互相共享。

4、儲存池

      儲存池因起良好的可擴充套件性,近來越來業界越受青睞,不論是Libvirt/Qemu,還是OpenStack都引入了儲存池的概念。ZFS利用可用的儲存驅動器將他們聚合成為一個被稱為zpool的儲存池。這個儲存池可以使針對容量、I/O效能 或者冗餘性進行優化和擴充套件,如果需要更多儲存的話,只需要向zpool中新增更多儲存就行了——ZFS檢測到新新增的容量並開始自動使用、均衡I/O和最大限度提高吞吐量。

5、內建RAID-Z和RAID-Z2

      眾所周知,RAID5有一個重大缺陷——Write Hole,傳統Raid5在寫資料的時候,是分為兩步的,首先將資料寫到磁碟陣列上,然後將該stripe上資料的校驗碼記錄到陣列上,如果在剛寫完資料的時候,系統斷電,那麼該資料對應的校驗碼就沒有機會再恢復了。如果接下來磁碟發生故障,RAID重建流程就會出現錯誤資料。唯一的解決方案就是,如果整個stripe發生過量寫入,那麼就會生成一個正確的奇偶塊。

      RAIDZ通過使用一個不同寬度的條帶來解決這個問題,這樣每次寫入實際上是一個完全的條帶寫入。再加上ZFS的寫入時拷貝特性,這些就完全消除了RAID5的Write Hole缺陷。RAIDZ2也是同理,但是可以使用雙奇偶允許陣列中丟失兩個磁碟。

6、分級快取ARC和L2ARC

      快取機制是提升I/O效能,降低延時方面價效比最高的方式,不論是硬體CPU,核心,還是使用者態應用,在設計上都會引入快取的概念。ZFS有兩層快取:

  • 第一層快取,沿用IBM的叫法ARC,位於記憶體中,ZFS總是儘量多的用空閒的記憶體去做ARC,以提高效能,ZFS的ARC演算法在IBM經典ARC演算法的基礎上又做了擴充套件,使之更適用於ZFS

  • 第二層快取,即Level2 ARC(L2ARC),唯一高速儲存裝置上,通常是Flash裝置,SSD,Nvme等,通過預熱講慢速裝置上熱點資料讀取到高速裝置上以提高效能

7、前瞻性的容量支援

      ZFS是128位的檔案系統,也就是說理論上它可以儲存256千萬億ZB(1ZB=10億TB)。實際中,它的容量遠遠超過所需範圍,至少在可預見未來,完全不用擔心過載的問題。

  • 2^48: 單目錄下包含所有物件(檔案,目錄,子目錄等)的數目

  • 16 exbibytes (2^64 bytes): 單個檔案最大大小

  • 256 quadrillion zebibytes (2^128 bytes): Zpool儲存池的最大大小

  • 2^48: 單個目錄下的最大檔案數目

  • 2^64: Zpool支援的最大裝置數目

  • 2^64: 系統中Zpool最大數目

  • 2^64: 單個Zpool上可建立檔案系統的個數

8、自檢和修復(Resilvering and scrub)

      FSCK是Linux檔案系統的標配,但是ZFS沒有,ZFS是依靠內建的Scrub功能來完成自檢和修復的。ZFS可以清理一個儲存池中的所有資料,根據相應的校驗和檢查每個資料來驗證其完整性,檢測任何潛在的資料損毀,修復可能存在的任何錯誤。

      當資料被冗餘儲存起來的時候——儲存在映象或者RAID型陣列中——它可以修復檢測出任何潛在的損壞資料,而且無需管理員的干預。因為資料損壞是被記錄下來的,所以ZFS可以通過導致資料不恰當儲存在硬碟中的記憶體模組(或者其他硬體)檢測出來。資料清理的I/O優先順序是很低的,因為這個流程對系統性能的影響非常小。

9、原生的資料壓縮和去重

      鑑於資料壓縮和去重在節省儲存空間和降低網路開銷方面的絕對優勢,這一特性慢慢成為檔案系統,尤其是網路檔案系統的標配。ZFS作為整合了儲存管理的檔案系統,自然也提供了壓縮和去重的功能。按照粒度劃分,通常分為檔案級,塊級和頁級,顯然粒度越小空間利用越高,但是隨之的開銷(記憶體和cpu)越高,鑑於ZFS是基於資料塊做儲存管理的,因此ZFS的壓縮以及去重都是資料塊級的,並提供了多種可選壓縮和去重演算法

10、豐富的可配置性(Highly tunable)

      ZFS在設計之初就奔著高度可配置化而去的,開放了非常多的內部引數(總計有近百個),不論是對於ZFS檔案系統,zpool還是Volume,都可以使用使用者態工具直接進行引數設定,極大的方(累)便(壞)性(運)能(維)調(人)優(員)。

ZFS的各衍生版及現狀

        OpenSolaris/ZFS開源時採用的是CDDL協議,跟kernel的GPL協議不完全相容,所以zfs進kernel upstream就無望了,這樣使用zfs只有兩種可能,其一就是隻使用zfs二進位制模組,其二就是重新做backport適配kernel。

1. ZFS on FUSE

      基於linux的fuse,backport zfs的程式碼到上面,檔案系統執行在使用者態,此方案實現上簡單,耦合性低,但是fuse的致命弱點就是它跑著userspace,效能無法與原生核心態的檔案系統相比,此方案作為一種嘗試,沒能善終,最終被拋棄了。

2. Native ZFS on Linux (zfsonlinux)

      zfsonlinux是由勞倫斯利弗莫爾國家實驗室(LLNL)主導開發,backport到linux kernel的原生zfs版本,其引入了一個層介面層,基於kernel的api實現一套累solaris的介面,使得對openzfs的backport實現保留原生的形態,降低耦合性,目前已經發布0.7.5的release,基本上覆蓋了openZFS的全部特性,雖然穩定性目前有待加強,但瑕不掩瑜,效能較前期版本有非常大的改進,特別是對元資料及隨機寫的效能有非常大的改觀。lustre的osd-zfs正是採用的此zfs衍生版,目前已HPC領域廣泛使用。

3. ZFS port by KQ InfoTech

      基於早期LLNL實現的zvol,KQ Infotech也實現了一套原生的zfs backport,最初是直接port到FreeBSD,後來再一直到linux,但是隨著LLNL實現的zfsonlinux越來越完善,KQ 最終還是將自己的版本合併到了zfsonlinux。

4. ZFS.ko by Unbuntu

      針對CDDL與GPL不相容的現狀,Ubuntu打了一個擦邊球,Ubuntu 16.04 LTS ("Xenial Xerus"),在起倉庫中提供了自包含的ZFS模組,允許使用者直接從倉庫安裝zfs模組,目前來看Oracle方面並沒有出現官方的反對聲音,如果ubuntu此舉成功,那其他發行版廠商可能也會繼而效仿,直接在發行版倉庫提供二進位制模組的安裝,屆時使用者救無需再通過編譯原始碼來嘗試ZFS,對ZFS的推廣頗有裨益。

      分享內容到此為止,前期將HPC行業趨勢、產品和技術的分析梳理成“高效能運算(HPC)技術、方案和行業全面解析電子書,點選原文連結獲取資料詳細資訊。

640?wx_fmt=jpeg

熱文閱讀

溫馨提示:

請搜尋“ICT_Architect”“掃一掃”二維碼關注公眾號,點選原文連結獲取更多技術資料

640?wx_fmt=png

Stay hungry, Stay foolish

640?wx_fmt=gif