©
本文档使用
php.cn手册 发布
Btrfs是下一代的写时复制文件系统,支持许多先进的存储技术,使其非常适合Docker。Btrfs包含在主线Linux内核中。
Docker的btrfs
存储驱动程序利用了许多用于映像和容器管理的Btrfs功能。其中包括块级操作,精简配置,写入时复制快照以及易于管理。您可以轻松地将多个物理块设备组合到一个Btrfs文件系统中。
本文将Docker的Btrfs存储驱动程序称为btrfs
Btrfs文件系统,并将其作为Btrfs。
注意:
btrfs
存储驱动程序仅在Ubuntu或Debian上的Docker CE和SLES上的Docker EE/CS引擎上受支持。
如果您满足以下先决条件,则支持btrfs
:
Docker CE:对于Docker CE,btrfs
仅在Ubuntu或Debian上推荐。
Docker EE:对于Docker EE和CS-Engine,btrfs
仅在SLES上受支持。有关商业支持的Docker的所有支持配置,请参阅产品兼容性表。
更改存储驱动程序将使您已创建的任何容器在本地系统上都不可访问。使用docker save
保存的容器,并推动现有图像多克尔集线器或私人仓库,让你不必后重新创建它们。
btrfs
需要专用的块存储设备,如物理磁盘。该块设备必须格式化为Btrfs并装入/var/lib/docker/
。以下配置说明会引导您完成此过程。默认情况下,SLES /
文件系统使用BTRFS格式化,因此对于SLES,不需要使用单独的块设备,但出于性能方面的考虑,您可以选择这样做。
btrfs
支持必须存在于你的内核中。要检查这一点,运行以下命令:$ sudo cat/proc/filesystems | grep btrfs btrfs
要在操作系统级别管理BTRFS文件系统,您需要该btrfs
命令。如果您没有此命令,请安装btrfsprogs
软件包(SLES)或btrfs-tools
软件包(Ubuntu)。
此过程在SLES和Ubuntu上基本相同。
停止Docker。
2. 将/var/lib/docker/
内容复制到备份位置,然后清空以下内容/var/lib/docker/
:
$sudo cp-au/var/lib/docker/var/lib/docker.bk$sudo rm/var/lib/docker/%2A
3. 将您的专用块设备或设备格式化为Btrfs文件系统。这个例子假定你正在使用两个叫做/dev/xvdf
and的块设备/dev/xvdg
。仔细检查块设备名称,因为这是一种破坏性操作。$ sudo mkfs.btrfs -f /dev/xvdf /dev/xvdg Btrfs还有很多选项,包括striping和RAID。请参阅Btrfs文档。
4. 将新的Btrfs文件系统/var/lib/docker/
挂载到挂载点上。您可以指定用于创建Btrfs文件系统的任何块设备。
$ sudo mount -t btrfs /dev/xvdf /var/lib/docker
不要忘记在重新启动时通过添加/etc/fstab
条目来使永久更改。
5. 将内容复制/var/lib/docker.bk
到/var/lib/docker/
。$ sudo cp -au /var/lib/docker.bk/* / var / lib / docker /
6. 配置Docker以使用btrfs
存储驱动程序。即使/var/lib/docker/
现在使用Btrfs文件系统,这也是必需的。编辑或创建文件/etc/docker/daemon.json
。如果它是新文件,请添加以下内容。如果它是现有文件,则仅添加键和值,如果它不是结束括号(}
)前的最后一行,请仔细用逗号结束该行。
{ "storage-driver": "btrfs" }
查看每个存储驱动程序的所有存储选项:
- [Stable](../../../reference/commandline/dockerd/index#storage-driver-options)- [Edge](https://docs.docker.com/edge/engine/reference/commandline/dockerd/#storage-driver-options)
启动Docker。运行后,验证btrfs
是否正在用作存储驱动程序。$ docker info Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 17.03.1-ce 存储驱动程序:btrfs 生成版本:Btrfs v4.4 库文件版本:101 <output truncated>
2. 准备好后,请删除/var/lib/docker.bk
目录。
Btrfs的好处之一是可以轻松地管理Btrfs文件系统,而无需卸载文件系统或重新启动Docker。
当空间不足时,Btrfs会自动扩展容量大约1 GB的数据块。
要将块设备添加到Btrfs卷,请使用btrfs device add
和btrfs filesystem balance
命令。
$ sudo btrfs device add /dev/svdh /var/lib/docker $ sudo btrfs filesystem balance /var/lib/docker
注意:虽然可以在Docker运行时执行这些操作,但性能会受到影响。计划停机窗口以平衡Btrfs文件系统可能是最好的。
btrfs
存储驱动程序作品btrfs
存储驱动器从工作方式不同devicemapper
在您的整个或其他存储驱动程序/var/lib/docker/
目录存储在增加了Btrfs卷上。
有关图像图层和可写容器图层的信息存储在/var/lib/docker/btrfs/subvolumes/
。该子目录包含每个图像或容器层的一个目录,统一文件系统是从一个图层加上所有其父图层构建的。子卷本质上是写入时复制,并具有从底层存储池按需分配的空间。它们也可以嵌套和快照。下图显示了4个子卷。'Subvolume 2'和'Subvolume 3'是嵌套的,而'Subvolume 4'则显示它自己的内部目录树。
只有图像的基础层被存储为真正的子卷。所有其他图层都存储为快照,只包含该图层中引入的差异。您可以创建快照快照,如下图所示。
在磁盘上,快照的外观与子卷相似,但实际上它们更小巧,更节省空间。写时复制用于最大限度地提高存储效率并最小化层大小,并且容器的可写层中的写入在块级进行管理。下图显示了一个子卷及其快照共享数据。
为了获得最大效率,当容器需要更多空间时,它将以大小约1 GB的块分配。
Docker的btrfs
存储驱动程序将每个图像层和容器存储在其自己的Btrfs子卷或快照中。图像的基础层存储为子卷,而子图像层和容器存储为快照。这在下图中显示。
在运行btrfs
驱动程序的Docker主机上创建映像和容器的高级过程如下所示:
图像的基础层存储在Btrfs 子卷下/var/lib/docker/btrfs/subvolumes
。
2. 随后的图像层被存储为增加了Btrfs 快照父层的子体积或快照的,但与此层中引入的变化。这些差异存储在块级别。
3. 容器的可写图层是最终图像层的Btrfs快照,运行容器引入了差异。这些差异存储在块级别。容器如何读取和写入btrfs
阅读文件的工作容器是图像的空间高效快照。快照中的元数据指向存储池中的实际数据块。这与子卷相同。因此,针对快照执行的读取基本上与针对子卷执行的读取相同。
编写新文件:将新文件写入容器会调用按需分配操作以将新数据块分配给容器的快照。该文件然后被写入这个新的空间。按需分配操作对于使用Btrfs进行的所有写入都是原生的,并且与将新数据写入子卷相同。因此,将新文件写入容器的快照以本地Btrfs速度运行。
修改现有文件:更新容器中的现有文件是写时复制操作(redirect-on-write是Btrfs术语)。原始数据是从文件当前存在的层读取的,只有修改后的块才写入容器的可写层。接下来,Btrfs驱动程序更新快照中的文件系统元数据以指向这个新数据。这种行为的开销很小。
删除文件或目录:如果容器删除存在于较低层的文件或目录,则Btrfs会掩盖较低层中文件或目录的存在。如果一个容器创建一个文件然后将其删除,则此操作在Btrfs文件系统中执行,并且空间被回收。
使用Btrfs时,编写和更新大量小文件可能会导致性能下降。
影响Docker在btrfs
存储驱动程序下的性能有几个因素。
注意:通过将Docker卷用于写入繁重的工作负载,而不是依赖将数据存储在容器的可写层中,可以缓解这些因素中的许多因素。然而,在增加了Btrfs的情况下,多克尔量仍将从这些画中后卫吃亏,除非
/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 ssd
安装选项安装Btrfs文件系统。这些优化包括通过避免优化(例如不适用于固态介质的搜索优化)来增强SSD写入性能。
平衡Btrfs文件系统经常:使用操作系统实用程序(如cron
作业)在非高峰时段定期平衡Btrfs文件系统。这回收未分配的块,并有助于防止文件系统不必要的填满。除非将其他物理块设备添加到文件系统,否则无法重新平衡完全完整的Btrfs文件系统。查看BTRFS Wiki。
使用快速存储:固态硬盘(SSD)比旋转磁盘提供更快的读取和写入速度。
将卷用于写入繁重的工作负载:卷为写入繁重的工作负载提供最佳和最可预测的性能。这是因为它们绕过了存储驱动程序,并且不会产生精简配置和写入时复制引入的任何潜在开销。卷还有其他好处,例如允许您在容器之间共享数据,并且即使在没有正在运行的容器正在使用它们时也会持久存在。
了解图像,容器和存储驱动程序
选择存储驱动程序
AUFS存储驱动程序在实践中
设备Mapper存储驱动程序在实践中的应用