?
This document uses PHP Chinese website manual Release
ZFS是下一代文件系統,支持許多高級存儲技術,如卷管理,快照,校驗和,壓縮和重復數據刪除,復制等。
它由Sun Microsystems(現在是Oracle Corporation)創(chuàng)建,并且根據CDDL許可證開源。由于CDDL和GPL之間的許可不兼容,ZFS不能作為主線Linux內核的一部分發(fā)貨。但是,ZFS On Linux(ZoL)項目提供了可以單獨安裝的樹外內核模塊和用戶空間工具。
Linux(ZoL)端口上的ZFS健康且成熟。但是,目前不推薦使用zfs
Docker存儲驅動程序進行生產使用,除非您在Linux上擁有豐富的ZFS經驗。
注意:在Linux平臺上還有一個ZFS的FUSE實現。這不被推薦。本地ZFS驅動程序(ZoL)經過更多測試,性能更高,使用更廣泛。本文檔的其余部分涉及本地ZoL端口。
ZFS需要一個或多個專用塊設備,最好是固態(tài)驅動器(SSD)。
ZFS僅支持泊塢CE與Ubuntu 14.04或更高版本,與zfs
包(16.04及更高版本)或zfs-native
與ubuntu-zfs
已安裝的軟件包(14.04)。
對于Ubuntu 14.04,您需要先啟用補充軟件包存儲庫,ppa:zfs-native/stable
然后才能安裝軟件包。有關說明,請參閱https://launchpad.net/~zfs-native/+archive/ubuntu/stable。
Docker EE或CS-Engine或任何其他Linux平臺不支持ZFS。
該/var/lib/docker/
目錄必須安裝在ZFS格式的文件系統上。
更改存儲驅動程序將使您已創(chuàng)建的任何容器在本地系統上都不可訪問。使用docker save
保存的容器,并推動現有圖像多克爾集線器或私人倉庫,讓你不必后重新創(chuàng)建它們。
zfs
存儲驅動程序配置Docker停止Docker。
將內容復制/var/lib/docker/
到/var/lib/docker.bk
并刪除內容/var/lib/docker/
。$ sudo cp -au /var/lib/docker /var/lib/docker.bk $ sudo rm -rf /var/lib/docker/*
zpool
在您的專用塊設備或設備上創(chuàng)建一個新的,并將其安裝到/var/lib/docker/
。確保你已經指定了正確的設備,因為這是一個破壞性的操作。此示例將兩個設備添加到池中。$ sudo zpool create -f zpool-docker -m /var/lib/docker /dev/xvdf /dev/xvdg該命令創(chuàng)建zpool
并命名它zpool-docker
。該名稱僅用于顯示目的,您可以使用不同的名稱。檢查池是否使用正確創(chuàng)建和安裝zfs list
。$ sudo zfs list NAME USED AVAIL REFER MOUNTPOINT zpool-docker 55K 96.4G 19K /var/lib/docker
配置Docker以使用zfs
。編輯/etc/docker/daemon.json
并設置storage-driver
為zfs
。如果該文件之前為空,它現在應該如下所示:{“storage-driver”:“zfs”}保存并關閉文件。
啟動Docker。使用docker info
驗證存儲驅動程序zfs
。$ sudo docker信息容器:0正在運行:0已暫停:0已停止:0圖像:0服務器版本:17.03.1-ce存儲驅動程序:zfs Zpool:zpool-docker Zpool運行狀況:ONLINE父數據集:zpool-docker父級使用的空間:249856可用空間:103498395648父配額:否壓縮:關閉<output truncated>
zfs
要增加大小zpool
,您需要將專用塊設備添加到Docker主機,然后將其添加到zpool
使用zpool add
命令:
$ sudo zpool add zpool-docker /dev/xvdh
如果要基于每個image?dataset集實現配額,可以設置size
存儲選項以限制單個容器可用于其可寫層的空間量。
編輯/etc/docker/daemon.json
并添加以下內容:
{ "storage-driver": "zfs", "storage-opts": ["size=256M"]}
查看每個存儲驅動程序的所有存儲選項:
Stable
Edge
保存并關閉文件,然后重新啟動Docker。
zfs
存儲驅動程序作品ZFS使用以下對象:
文件系統:精簡配置,zpool
按需分配空間。
快照:文件系統的只讀空間有效時間點拷貝。
克隆:快照的讀寫副本。用于存儲與上一層的差異。
創(chuàng)建一個克隆的過程:
從文件系統創(chuàng)建只讀快照。
從快照創(chuàng)建可寫克隆。這包含與父層的任何差異。
文件系統,快照和克隆都從底層分配空間zpool
。
每個正在運行的容器的統一文件系統都安裝在一個安裝點上/var/lib/docker/zfs/graph/
。繼續(xù)閱讀以獲得關于統一文件系統組成的解釋。
圖像的基礎層是ZFS文件系統。每個子圖層都是基于ZFS下方圖層的ZFS快照。容器是基于ZFS快照的ZFS快照,該ZFS快照是從創(chuàng)建映像的頂層開始的。
下圖顯示了如何將這與基于雙層圖像的正在運行的容器放在一起。
當你啟動一個容器時,以下步驟按順序進行:
圖像的基礎層作為ZFS文件系統存在于Docker主機上。
其他圖像層是直接位于其下方的圖像層的數據集的克隆。在該圖中,通過獲取基礎層的ZFS快照并從該快照創(chuàng)建克隆來添加“第1層”。該克隆是可寫的,并從zpool消耗按需空間。快照是只讀的,將基本層保持為不可變對象。
當容器啟動時,圖像上方會添加一個可寫圖層。在該圖中,容器的讀寫層是通過制作圖像頂層(第1層)的快照并從該快照創(chuàng)建克隆來創(chuàng)建的。
當容器修改其可寫層的內容時,將為已更改的塊分配空間。默認情況下,這些塊是128k。
zfs
每個容器的可寫層都是一個ZFS克隆,它將其所有數據與其創(chuàng)建的數據集(其父層的快照)共享。即使正在讀取的數據來自深層,讀操作也是最快的。
編寫一個新文件:根據需要從底層分配空間zpool
,并將塊直接寫入容器的可寫層。
修改現有文件:只為已更改的塊分配空間,并使用寫時復制(CoW)策略將這些塊寫入容器的可寫層。這可以最大限度地減小圖層的大小并提高寫入性能。
刪除文件或目錄:
當刪除存在于較低層的文件或目錄時,即使文件或目錄仍然存在于較低的只讀層中,ZFS驅動程序也會掩蓋該容器可寫層中的文件或目錄的存在。
如果您創(chuàng)建并刪除容器可寫層中的文件或目錄,則塊將被回收zpool
。
有幾個因素會影響Docker使用zfs
存儲驅動程序的性能。
內存:內存對ZFS性能有重大影響。ZFS最初設計用于具有大量內存的大型企業(yè)級服務器。
ZFS特性:ZFS包含重復數據刪除功能。使用此功能可能會節(jié)省磁盤空間,但會占用大量內存。建議您停用zpool
Docker使用的此功能,除非您使用SAN,NAS或其他硬件RAID技術。
ZFS緩存:ZFS將磁盤塊緩存在稱為自適應替換緩存(ARC)的內存結構中。ZFS 的Single Copy ARC功能允許一個塊的單個緩存副本由a的多個克隆共享使用此功能,多個運行中的容器可以共享一個緩存塊的單個副本。此功能使ZFS成為PaaS和其他高密度用例的理想選擇。
碎片:碎片是ZFS等寫入時復制文件系統的自然副產品。ZFS通過使用128k的小塊來緩解這種情況。ZFS意向日志(ZIL)和寫入合并(延遲寫入)也有助于減少碎片。您可以使用監(jiān)視碎片zfs status
。但是,如果不重新格式化和恢復文件系統,則無法對ZFS進行碎片整理。
使用適用于Linux的本機ZFS驅動程序:由于性能較差,不建議使用ZFS FUSE實施。
使用快速存儲:固態(tài)硬盤(SSD)比旋轉磁盤提供更快的讀取和寫入速度。
將卷用于寫入繁重的工作負載:卷為寫入繁重的工作負載提供最佳和最可預測的性能。這是因為它們繞過了存儲驅動程序,并且不會產生精簡配置和寫入時復制引入的任何潛在開銷。卷還有其他好處,例如允許您在容器之間共享數據,并且即使在沒有正在運行的容器正在使用它們時也會持久存在。