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)提供比旋转磁盘更快的读写速度。

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

内容概要:本文档详细介绍了在三台CentOS 7服务器(IP地址分别为192.168.0.157、192.168.0.158和192.168.0.159)上安装和配置Hadoop、Flink及其他大数据组件(如Hive、MySQL、Sqoop、Kafka、Zookeeper、HBase、Spark、Scala)的具体步骤。首先,文档说明了环境准备,包括配置主机名映射、SSH免密登录、JDK安装等。接着,详细描述了Hadoop集群的安装配置,包括SSH免密登录、JDK配置、Hadoop环境变量设置、HDFS和YARN配置文件修改、集群启动与测试。随后,依次介绍了MySQL、Hive、Sqoop、Kafka、Zookeeper、HBase、Spark、Scala和Flink的安装配置过程,包括解压、环境变量配置、配置文件修改、服务启动等关键步骤。最后,文档提供了每个组件的基本测试方法,确保安装成功。 适合人群:具备一定Linux基础和大数据组件基础知识的运维人员、大数据开发工程师以及系统管理员。 使用场景及目标:①为大数据平台建提供详细的安装指南,确保各组件能够顺利安装和配置;②帮助技术人员快速掌握Hadoop、Flink等大数据组件的安装与配置,提升工作效率;③适用于企业级大数据平台的建与维护,确保集群稳定运行。 其他说明:本文档不仅提供了详细的安装步骤,还涵盖了常见的配置项解释和故障排查建议。建议读者在安装过程中仔细阅读每一步骤,并根据实际情况调整配置参数。此外,文档中的命令和配置文件路径均为示例,实际操作时需根据具体环境进行适当修改。
在无线通信领域,天线阵列设计对于信号传播方向和覆盖范围的优化至关重要。本题要求设计一个广播电台的天线布局,形成特定的水平面波瓣图,即在东北方向实现最大辐射强度,在正东到正北的90°范围内辐射衰减最小且无零点;而在其余270°范围内允许出现零点,且正西和西南方向必须为零。为此,设计了一个由4个铅垂铁塔组成的阵列,各铁塔上的电流幅度相等,相位关系可自由调整,几何布置和间距不受限制。设计过程如下: 第一步:构建初级波瓣图 选取南北方向上的两个点源,间距为0.2λ(λ为电磁波波长),形成一个端射阵。通过调整相位差,使正南方向的辐射为零,计算得到初始相位差δ=252°。为了满足西南方向零辐射的要求,整体相位再偏移45°,得到初级波瓣图的表达式为E1=cos(36°cos(φ+45°)+126°)。 第二步:构建次级波瓣图 再选取一个点源位于正北方向,另一个点源位于西南方向,间距为0.4λ。调整相位差使西南方向的辐射为零,计算得到相位差δ=280°。同样整体偏移45°,得到次级波瓣图的表达式为E2=cos(72°cos(φ+45°)+140°)。 最终组合: 将初级波瓣图E1和次级波瓣图E2相乘,得到总阵的波瓣图E=E1×E2=cos(36°cos(φ+45°)+126°)×cos(72°cos(φ+45°)+140°)。通过编程实现计算并绘制波瓣图,可以看到三个阶段的波瓣图分别对应初级波瓣、次级波瓣和总波瓣,最终得到满足广播电台需求的总波瓣图。实验代码使用MATLAB编写,利用polar函数在极坐标下绘制波瓣图,并通过subplot分块显示不同阶段的波瓣图。这种设计方法体现了天线阵列设计的基本原理,即通过调整天线间的相对位置和相位关系,控制电磁波的辐射方向和强度,以满足特定的覆盖需求。这种设计在雷达、卫星通信和移动通信基站等无线通信系统中得到了广泛应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值