©
本文档使用
php.cn手册 发布
ZFS是下一代文件系统,支持许多高级存储技术,如卷管理,快照,校验和,压缩和重复数据删除,复制等。
它由Sun Microsystems(现在是Oracle Corporation)创建,并且根据CDDL许可证开源。由于CDDL和GPL之间的许可不兼容,ZFS不能作为主线Linux内核的一部分发货。但是,ZFS On Linux(ZoL)项目提供了可以单独安装的树外内核模块和用户空间工具。
Linux(ZoL)端口上的ZFS健康且成熟。但是,目前不推荐使用zfs
Docker存储驱动程序进行生产使用,除非您在Linux上拥有丰富的ZFS经验。
注意:在Linux平台上还有一个ZFS的FUSE实现。这不被推荐。本地ZFS驱动程序(ZoL)经过更多测试,性能更高,使用更广泛。本文档的其余部分涉及本地ZoL端口。
ZFS需要一个或多个专用块设备,最好是固态驱动器(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格式的文件系统上。
更改存储驱动程序将使您已创建的任何容器在本地系统上都不可访问。使用docker save
保存的容器,并推动现有图像多克尔集线器或私人仓库,让你不必后重新创建它们。
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
在您的专用块设备或设备上创建一个新的,并将其安装到/var/lib/docker/
。确保你已经指定了正确的设备,因为这是一个破坏性的操作。此示例将两个设备添加到池中。$ sudo zpool create -f zpool-docker -m /var/lib/docker /dev/xvdf /dev/xvdg该命令创建zpool
并命名它zpool-docker
。该名称仅用于显示目的,您可以使用不同的名称。检查池是否使用正确创建和安装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
按需分配空间。
快照:文件系统的只读空间有效时间点拷贝。
克隆:快照的读写副本。用于存储与上一层的差异。
创建一个克隆的过程:
从文件系统创建只读快照。
从快照创建可写克隆。这包含与父层的任何差异。
文件系统,快照和克隆都从底层分配空间zpool
。
每个正在运行的容器的统一文件系统都安装在一个安装点上/var/lib/docker/zfs/graph/
。继续阅读以获得关于统一文件系统组成的解释。
图像的基础层是ZFS文件系统。每个子图层都是基于ZFS下方图层的ZFS快照。容器是基于ZFS快照的ZFS快照,该ZFS快照是从创建映像的顶层开始的。
下图显示了如何将这与基于双层图像的正在运行的容器放在一起。
当你启动一个容器时,以下步骤按顺序进行:
图像的基础层作为ZFS文件系统存在于Docker主机上。
其他图像层是直接位于其下方的图像层的数据集的克隆。在该图中,通过获取基础层的ZFS快照并从该快照创建克隆来添加“第1层”。该克隆是可写的,并从zpool消耗按需空间。快照是只读的,将基本层保持为不可变对象。
当容器启动时,图像上方会添加一个可写图层。在该图中,容器的读写层是通过制作图像顶层(第1层)的快照并从该快照创建克隆来创建的。
当容器修改其可写层的内容时,将为已更改的块分配空间。默认情况下,这些块是128k。
zfs
每个容器的可写层都是一个ZFS克隆,它将其所有数据与其创建的数据集(其父层的快照)共享。即使正在读取的数据来自深层,读操作也是最快的。
编写一个新文件:根据需要从底层分配空间zpool
,并将块直接写入容器的可写层。
修改现有文件:只为已更改的块分配空间,并使用写时复制(CoW)策略将这些块写入容器的可写层。这可以最大限度地减小图层的大小并提高写入性能。
删除文件或目录:
当删除存在于较低层的文件或目录时,即使文件或目录仍然存在于较低的只读层中,ZFS驱动程序也会掩盖该容器可写层中的文件或目录的存在。
如果您创建并删除容器可写层中的文件或目录,则块将被回收zpool
。
有几个因素会影响Docker使用zfs
存储驱动程序的性能。
内存:内存对ZFS性能有重大影响。ZFS最初设计用于具有大量内存的大型企业级服务器。
ZFS特性:ZFS包含重复数据删除功能。使用此功能可能会节省磁盘空间,但会占用大量内存。建议您停用zpool
Docker使用的此功能,除非您使用SAN,NAS或其他硬件RAID技术。
ZFS缓存:ZFS将磁盘块缓存在称为自适应替换缓存(ARC)的内存结构中。ZFS 的Single Copy ARC功能允许一个块的单个缓存副本由a的多个克隆共享使用此功能,多个运行中的容器可以共享一个缓存块的单个副本。此功能使ZFS成为PaaS和其他高密度用例的理想选择。
碎片:碎片是ZFS等写入时复制文件系统的自然副产品。ZFS通过使用128k的小块来缓解这种情况。ZFS意向日志(ZIL)和写入合并(延迟写入)也有助于减少碎片。您可以使用监视碎片zfs status
。但是,如果不重新格式化和恢复文件系统,则无法对ZFS进行碎片整理。
使用适用于Linux的本机ZFS驱动程序:由于性能较差,不建议使用ZFS FUSE实施。
使用快速存储:固态硬盘(SSD)比旋转磁盘提供更快的读取和写入速度。
将卷用于写入繁重的工作负载:卷为写入繁重的工作负载提供最佳和最可预测的性能。这是因为它们绕过了存储驱动程序,并且不会产生精简配置和写入时复制引入的任何潜在开销。卷还有其他好处,例如允许您在容器之间共享数据,并且即使在没有正在运行的容器正在使用它们时也会持久存在。