使用ZFS存储驱动程序(引擎) | Use the ZFS storage driver (Engine)
使用ZFS存储驱动程序
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存储驱动程序配置Docker
- 停止Docker。
管理 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
保存并关闭文件,然后重新启动Docker。
如何zfs存储驱动程序作品
ZFS使用以下对象:
文件系统
:精简配置,zpool
按需分配空间。
创建一个克隆的过程:
- 从文件系统创建只读快照。
文件系统,快照和克隆都从底层分配空间zpool
。
映像和容器层在磁盘上
每个正在运行的容器的统一文件系统都安装在一个安装点上/var/lib/docker/zfs/graph/
。继续阅读以获得关于统一文件系统组成的解释。
图像分层和共享
图像的基础层是ZFS文件系统。每个子图层都是基于ZFS下方图层的ZFS快照。容器是基于ZFS快照的ZFS快照,该ZFS快照是从创建映像的顶层开始的。
下图显示了如何将这与基于双层图像的正在运行的容器放在一起。
当你启动一个容器时,以下步骤按顺序进行:
- 图像的基础层作为ZFS文件系统存在于Docker主机上。
容器读取和写入的工作方式 zfs
读取文件
每个容器的可写层都是一个ZFS克隆,它将其所有数据与其创建的数据集(其父层的快照)共享。即使正在读取的数据来自深层,读操作也是最快的。该图说明了块共享的工作方式:
编写文件
编写一个新文件
:根据需要从底层分配空间zpool
,并将块直接写入容器的可写层。
修改现有文件
:只为已更改的块分配空间,并使用写时复制(CoW)策略将这些块写入容器的可写层。这可以最大限度地减小图层的大小并提高写入性能。
删除文件或目录
:
- 当删除存在于较低层的文件或目录时,即使文件或目录仍然存在于较低的只读层中,ZFS驱动程序也会掩盖该容器可写层中的文件或目录的存在。
ZFS和Docker性能
有几个因素会影响Docker使用zfs
存储驱动程序的性能。
内存
:内存
对ZFS性能有重大影响。ZFS最初设计用于具有大量内存
的大型企业级服务器。
性能最佳实践
使用快速存储
:固态硬盘(SSD)比旋转磁盘提供更快的读取和写入速度。