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

Btrfs

Btrfs是下一代的即写即拷文件系统,它支持许多先进的存储技术,非常适合Docker。主线Linux内核中包含了Btrfs。
Docker的btrfs存储驱动程序利用了许多btrfs特性来进行镜像和容器管理。这些特性包括块级操作、精简配置、即写即拷快照和易于管理。可以轻松地将多个物理块设备组合到单个Btrfs文件系统中。

前提条件

  • Docker Engine - Community: 对于社区版,只建议在Ubuntu或Debian上使用btrfs。

  • Docker EE:对于Docker EE和cs引擎,btrfs只支持SLES。

  • 更改存储驱动程序将使已经创建的任何容器在本地系统上无法访问。使用docker save来保存容器,并将现有的镜像推入docker Hub或私有存储库,这样就不需要在以后重新创建。

  • btrfs需要一个专用的块存储设备,如物理磁盘。这个块设备必须针对Btrfs进行格式化,并安装到/var/lib/docker/中。

  • 内核必须支持btrfs。运行以下命令检查:

    cat /proc/filesystems | grep btrfs
    
  • 要在操作系统级别管理BTRFS文件系统,需要使用BTRFS命令。如果没有这个命令,安装btrfsprogs包(SLES)或btrfs-tools包(Ubuntu)。

配置Docker以使用btrfs存储驱动器

  1. 停止Docker。
  2. 将/var/lib/docker/的内容复制到备份位置,然后清空/var/lib/docker/的内容:
    cp -au /var/lib/docker /var/lib/docker.bk
    rm -rf /var/lib/docker/*
    
  3. 将专用块设备或设备格式化为Btrfs文件系统。
    mkfs.btrfs -f /dev/xvdf /dev/xvdg
    
  4. 在/var/lib/docker/挂载点上挂载新的Btrfs文件系统。不要忘记通过向/etc/ fstabb添加一个条目来使更改在重新引导时保持永久性。
     mount -t btrfs /dev/xvdf /var/lib/docker
    
  5. 将/var/lib/docker.bk的内容复制到/var/lib/docker/。
    cp -au /var/lib/docker.bk/* /var/lib/docker/
    
  6. 配置Docker以使用btrfs存储驱动程序。即使/var/lib/docker/现在正在使用Btrfs文件系统,这也是必需的。编辑或创建文件/etc/docker/daemon.json。如果是新文件,请添加以下内容。如果它是现有文件,则仅添加键和值,如果不是结束大括号(})之前的最后一行,请小心以逗号结束。
    {
      "storage-driver": "btrfs"
    }
    
  7. 通过docker info验证
    在这里插入图片描述

管理Btrfs卷

Btrfs的优点之一是易于管理Btrfs文件系统,而无需卸载文件系统或重新启动Docker。

当空间不足时,Btrfs会自动以大约1 GB的块扩展卷。

要将块设备添加到Btrfs卷,使用btrfs device add和 btrfs filesystem balance命令。

btrfs device add /dev/svdh /var/lib/docker

btrfs filesystem balance /var/lib/docker

btrfs存储驱动程序如何工作

btrfs存储驱动程序与设备映射程序或其他存储驱动程序的工作方式不同,因为整个/var/lib/docker/目录都存储在btrfs卷中。

磁盘上的镜像和容器层

关于镜像层和可写容器层的信息存储在/var/lib/docker/btrfs/subvolumes/中。此子目录包含每个镜像或容器层的一个目录,由一个层及其所有父层构建的统一文件系统。子卷是原生的即写即拷,并从底层存储池按需为它们分配空间。它们也可以嵌套和抓拍。下图显示了4个子卷。“Subvolume 2”和“Subvolume 3”是嵌套的,而“Subvolume 4”则显示它自己的内部目录树。
在这里插入图片描述
仅镜像的基础层存储为真实的子体积。所有其他层都存储为快照,其中仅包含该层中引入的差异。可以如下图所示创建快照的快照。
在这里插入图片描述
在磁盘上,快照的外观和感觉就像子卷一样,但实际上它们更小且更节省空间。写入时复制用于最大化存储效率和最小化层大小,并且在块级别管理容器可写层中的写入。下图显示了一个子卷及其快照共享数据。
在这里插入图片描述
为了获得最大的效率,当一个容器需要更多空间时,将以大约1 GB的块为单位进行分配 。

Docker的btrfs存储驱动程序将每个镜像层和容器存储在它自己的btrfs子卷或快照中。镜像的基本层存储为子卷,而子镜像层和容器存储为快照。如下图所示。
在这里插入图片描述
在运行btrfs驱动程序的Docker主机上创建镜像和容器的高级过程如下:

  1. 镜像的基础层存储在/var/lib/docker/btrfs/subvolume下的Btrfs子卷中。
  2. 后续的镜像层存储为父层的子卷或快照的Btrfs快照,但是这一层引入了更改。这些差异存储在块级别。
  3. 容器的可写层是最终镜像层的Btrfs快照,不同之处在于运行的容器。这些差异存储在块级别。

容器如何使用btrfs读写数据

读取文件

  • 容器是镜像的节省空间的快照。快照中的元数据指向存储池中的实际数据块。这与子卷相同。因此,对快照执行的读操作本质上与对子卷执行的读操作相同。

修改文件

  • 写入新文件:将新文件写入容器会调用按需分配操作,以将新数据块分配给容器的快照。然后将文件写入此新空间。按需分配操作是使用Btrfs进行的所有写入所固有的,并且与将新数据写入子卷相同。结果,将新文件写入容器的快照以本机Btrfs速度运行。
  • 修改现有文件:更新容器中的现有文件是写时复制操作(写时重定向是Btrfs术语)。从文件当前所在的层读取原始数据,并且仅将修改后的块写入容器的可写层。接下来,Btrfs驱动程序更新快照中的文件系统元数据以指向此新数据。此行为产生很少的开销。
  • 删除文件或目录:如果容器删除了下层中存在的文件或目录,则Btrfs会掩盖下层中文件或目录的存在。如果容器创建一个文件然后将其删除,则此操作在Btrfs文件系统本身中执行,并回收空间。

使用Btrfs,编写和更新大量小文件会导致性能下降。

Btrfs和Docker性能

在btrfs 存储驱动程序下,有几个因素会影响Docker的性能。

**注意**:通过使用Docker卷处理大量写工作负载,而不是依赖于将数据存储在容器的可写层,可以减轻许多这些因素。但是,在Btrfs的情况下,Docker卷仍然受到这些回调的影响,除非/var/lib/docker/volumes/没有得到Btrfs的支持。

  • 页面缓存。Btrfs不支持页面缓存共享。这意味着访问同一文件的每个进程都会将该文件复制到Docker主机的内存中。结果,btrfs驱动程序可能不是诸如PaaS之类的高密度用例的最佳选择。

  • 小写。容器执行大量小写操作(此使用模式与在短时间内启动和停止许多容器时发生的情况相同)也会导致Btrfs块的使用不佳。这可能会过早填充Btrfs文件系统,并导致Docker主机空间不足。使用btrfs filesys show必须密切监控增加了Btrfs设备上的可用空间量。

  • 顺序写入。Btrfs在写入磁盘时使用日记技术。这可能会影响顺序写入的性能,从而使性能降低多达50%。

  • 碎片化。碎片是Btrfs等写时复制文件系统的自然副产品。许多小的随机写入可能会使此问题复杂化。使用SSD时,碎片可能表现为CPU峰值,而使用旋转磁盘时,则表现为磁头抖动。这些问题中的任何一个都可能损害性能。
    如果Linux内核版本是3.9或更高版本,则autodefrag 在安装Btrfs卷时可以启用该功能。在将该功能部署到生产环境之前,请先对工作负载进行测试,因为某些测试显示了对性能的负面影响。

  • SSD性能:Btrfs包括针对SSD介质的本机优化。要启用这些功能,请使用-o ssdmount选项安装Btrfs文件系统。这些优化通过避免优化(例如不适用于固态介质的寻道优化)来增强SSD的写入性能。

  • 经常平衡Btrfs文件系统:cron在非高峰时段,使用操作系统实用程序(例如 作业)定期平衡Btrfs文件系统。这样可以回收未分配的块,并有助于防止文件系统不必要地填满。除非向文件系统添加其他物理块设备,否则无法重新平衡完全完整的Btrfs文件系统。

  • 使用快速存储:固态驱动器(SSD)提供比旋转磁盘更快的读写速度。

  • 将卷用于繁重的写工作负载:卷可为繁重的写工作负载提供最佳和最可预测的性能。这是因为它们绕过了存储驱动程序,并且不会产生任何精简配置和写时复制所带来的潜在开销。卷还有其他好处,例如,允许在容器之间共享数据,并且即使没有运行中的容器正在使用它们也可以持久保存数据。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值