docker系列—聊一聊存储驱动ZFS

ZFS

ZFS是下一代文件系统,它支持许多高级存储技术,例如卷管理,快照,校验和,压缩和重复数据删除,复制等。

它由Sun Microsystems(现为Oracle Corporation)创建,并以CDDL许可证开源。由于CDDL和GPL之间的许可不兼容,因此ZFS不能作为主线Linux内核的一部分提供。但是,Linux上的ZFS(ZoL)项目提供了树外内核模块和用户空间工具,可以分别安装它们。

Linux(ZoL)端口上的ZFS正常且成熟。但是,目前不建议将zfs存储驱动程序用于生产,除非对Linux上的ZFS有丰富的经验

前提条件

  • ZFS需要一个或多个专用块设备,最好是固态驱动器(SSD)。
  • ZFS只支持Docker引擎- Ubuntu 14.04或更高版本的社区,安装了ZFS包(16.04或更高版本)或ZFS -native和Ubuntu - ZFS包(14.04)。
  • Docker EE或CS-Engine或任何其他Linux平台不支持ZFS。
  • /var/lib/docker/目录必须安装在ZFS格式的文件系统上。
  • 更改存储驱动程序将使已经创建的任何容器在本地系统上无法访问。使用docker save来保存容器,并将现有的镜像推入docker Hub或私有存储库。

使用zfs存储驱动程序配置Docker

  1. 停止Docker。

  2. 将/var/lib/docker/的内容复制到/var/lib/docker/。删除/var/lib/docker/的内容。

    cp -au /var/lib/docker /var/lib/docker.bk
    
    rm -rf /var/lib/docker/*
    
  3. 在专用块设备上创建一个或多个新zpool,并将其挂载到/var/lib/docker/中。确保指定了正确的设备,因为这是一个破坏性操作。本例将两个设备添加到池中。

    zpool create -f zpool-docker -m /var/lib/docker /dev/xvdf /dev/xvdg
    

    该命令创建zpool并将其命名为zpool-docker。该名称仅用于显示,可以使用不同的名称。检查使用zfs列表创建和挂载池是否正确。

    zfs list
    
    NAME           USED  AVAIL  REFER  MOUNTPOINT
    zpool-docker    55K  96.4G    19K  /var/lib/docker
    
  4. 配置Docker来使用zfs。编辑/etc/docker/daemon.将存储驱动程序设置为zfs。如果文件之前是空的,它现在应该是这样的:

    {
      "storage-driver": "zfs"
    }
    

    保存并关闭文件。

  5. 启动Docker。使用docker info验证存储驱动程序zfs。
    在这里插入图片描述

管理zfs

增加正在运行的设备上的容量

要增加的大小zpool,需要向Docker主机添加专用的块设备,然后zpool使用以下zpool add命令将其添加到:

zpool add zpool-docker /dev/xvdh

限制容器的可写存储配额

如果要基于每个镜像/数据集实施配额,则可以设置 size存储选项以限制单个容器可用于其可写层的空间量。

编辑/etc/docker/daemon.json并添加以下内容:

{
  "storage-driver": "zfs",
  "storage-opts": ["size=256M"]
}

保存并关闭文件,然后重新启动Docker。

zfs存储驱动程序如何工作

ZFS使用以下对象:

  • 文件系统:精简配置,zpool根据需要分配空间。
  • 快照:文件系统的只读节省空间的时间点副本。
  • 克隆:快照的读写拷贝。用于存储与前一层的差异。

创建克隆的过程
在这里插入图片描述

  1. 从文件系统创建一个只读快照。
  2. 从快照创建可写克隆。这包含与父层的任何差异。

文件系统,快照和克隆都从底层分配空间 zpool。

磁盘上的镜像和容器层

每个正在运行的容器的统一文件系统都挂载在/var/lib/docker/zfs/graph/中的一个挂载点上。请继续阅读,以了解统一文件系统是如何组成的。

镜像分层和共享

镜像的基本层是一个ZFS文件系统。每个子层都是一个ZFS克隆,该克隆基于它下面一层的ZFS快照。容器是一个ZFS克隆,它基于它所创建的镜像的顶层的ZFS快照。

下图显示了如何将它与基于两层镜像的正在运行的容器组合在一起。
在这里插入图片描述
启动容器时,将按顺序执行以下步骤:

  1. 镜像的基础层作为ZFS文件系统存在于Docker主机上。
  2. 其他镜像层是数据集的克隆,这些数据集直接在其下面托管镜像层。
    在该镜像中,通过获取基础层的ZFS快照,然后从该快照创建克隆来添加“第1层”。该克隆是可写的,并从zpool按需消耗空间。快照是只读的,将基本层保持为不变的对象。
  3. 启动容器时,可写层会添加到镜像上方。
    在该镜像中,通过对镜像顶层(第1层)进行快照并从该快照创建克隆来创建容器的读写层。
  4. 当容器修改其可写层的内容时,将为已更改的块分配空间。默认情况下,这些块为128k。

容器如何使用zfs进行读写操作

文件读取

每个容器的可写层都是ZFS克隆,它与从其创建的数据集(其父层的快照)共享所有数据。即使正在读取的数据来自较深的一层,读取操作也很容易。下图说明了块共享的工作方式:
在这里插入图片描述

编写文件

  • 编写一个新文件:根据需要从底层分配空间,zpool 并将这些块直接写入容器的可写层。
  • 修改现有文件:仅为更改的块分配空间,然后使用写时复制(CoW)策略将这些块写入容器的可写层。这样可以最小化层的大小并提高写入性能。
  • 删除文件或目录
  1. 当删除较低层中存在的文件或目录时,即使文件或目录仍存在于较低的只读层中,ZFS驱动程序也会在容器的可写层中屏蔽该文件或目录的存在。
  2. 如果在容器的可写层中创建然后删除文件或目录,则这些块将由回收zpool。

ZFS和Docker性能

有几个因素会影响使用zfs存储驱动程序的Docker性能 。

  • 内存:内存对ZFS性能有重大影响。ZFS最初是为具有大量内存的大型企业级服务器设计的。
  • ZFS功能:ZFS包括重复数据删除功能。使用这个特性可以节省磁盘空间,但是会消耗大量的内存。建议为Docker使用的zpool禁用此功能,除非使用SAN、NAS或其他硬件RAID技术。
  • ZFS缓存:ZFS将磁盘块缓存在称为自适应替换缓存(ARC)的内存结构中。ZFS 的Single Copy ARC功能允许块的多个克隆共享一个块的单个缓存副本。使用此功能,多个运行中的容器可以共享一个缓存块的单个副本。此功能使ZFS成为PaaS和其他高密度用例的理想选择。
  • 碎片:碎片是ZFS等写时复制文件系统的自然副产品。ZFS通过使用128k的小块大小来减轻这种情况。ZFS意向日志(ZIL)和写入(延迟写入)的合并也有助于减少碎片。可以使用监视碎片 zpool status。但是,如果不重新格式化和还原文件系统,就无法对ZFS进行碎片整理。
  • 对Linux使用本地ZFS驱动程序:由于性能不佳,不建议使用ZFS FUSE实现。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker存储驱动是负责管理容器镜像和容器数据卷的组件。在不同的操作系统和文件系统上,Docker 支持不同的存储驱动。以下是常见的 Docker 存储驱动: 1. `aufs`:是 Docker 最早支持的存储驱动,它使用分层文件系统的方式来管理容器镜像和容器数据卷。但是,由于 `aufs` 不支持某些新的内核特性,因此在一些新的操作系统上可能无法使用。 2. `overlay` 和 `overlay2`:是 Docker 的新一代存储驱动,它们使用了 Linux 内核中的 OverlayFS 文件系统来管理容器镜像和容器数据卷。与 `aufs` 相比,`overlay` 和 `overlay2` 在性能、可靠性和兼容性方面都有所提升,因此是目前 Docker 推荐使用的存储驱动。 3. `btrfs`:是一种优秀的分层文件系统,它支持快照、复制、压缩等高级功能。Docker 的 `btrfs` 存储驱动可以利用这些功能来提高容器的性能和可靠性。但是,`btrfs` 的兼容性和稳定性并不是很好,因此在生产环境中并不常用。 4. `devicemapper`:是一种基于块设备的存储驱动,它可以在主机的块设备上创建逻辑卷,并将其用作容器镜像和容器数据卷的存储。虽然 `devicemapper` 支持多种文件系统,但是在性能和可靠性方面仍然不如 `overlay` 和 `overlay2`。 5. `zfs`:是一种高级文件系统,它可以支持快照、复制、压缩等高级功能。Docker 的 `zfs` 存储驱动可以利用这些功能来提高容器的性能和可靠性。但是,由于需要安装额外的软件和配置,因此在使用 `zfs` 存储驱动时需要一定的技术知识和经验。 需要注意的是,不同的存储驱动在不同的操作系统和文件系统上可能有不同的支持程度和使用限制。在选择存储驱动时,需要根据自己的需求和环境来进行评估和选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值