阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Docker存储驱动之ZFS简介

99次阅读
没有评论

共计 5363 个字符,预计需要花费 14 分钟才能阅读完成。

ZFS 是下一代的文件系统,支持了很多存储高级特性,如卷管理、快照、和校验、压缩和重复删除技术、拷贝等。
ZFS 由 Sun 公司创建,现属于 Oracle,ZFS 是开源的,并基于 CDDL license。因为 CDDL 和 GPL 不兼容,ZFS 不能加入 Linux kernel 主线。然而,ZFS On Linux(ZoL)项目提供 kernel 模块和用户空间程序,这些都可以单独的安装。
ZFS on Linux(ZoL)是一项成熟的技术,但是,现在却不建议在产品中使用 zfs 存储驱动,当然,除非你对 ZoL 有着丰富的经验。
注意:在 Linux 平台上,有 ZFS 的 FUSE 实现,它可以和 Docker 结合起来使用,但是却不推荐这样使用。原生的 ZFS 驱动(ZoL)被测试得更多,更有效率,也更广泛地被使用。下面的内容也指的是原生的 ZFS 驱动。

镜像分层和共享

Docker 的 zfs 存储驱动使用了 ZFS 驱动的三个组件:
●文件系统
●快照
●克隆
ZFS 系统提供超配特性,通过按需分配操作从 ZFS 池(zpool)分配空间。快照和克隆是 ZFS 系统某个时间点的拷贝,较节省空间。快照是只读的,而克隆是读写的,克隆只能通过快照来创建。下图显示了它们之间这种简单地关系。
Docker 存储驱动之 ZFS 简介
图中的实线显示了创建了克隆的过程。第一步创建了一个文件系统的快照,第二步通过快照创建了一份克隆。虚线显示了克隆、文件系统和快照之间的关系。这三个 ZFS 组件都从同一个下层的 zpool 申请空间。
在 Docker host 上使用 zfs 存储驱动。镜像的基础层就是一个 ZFS 文件系统,每个子层都是底层 ZFS 快照的一个 ZFS 克隆,容器就是一个 ZFS 克隆,它基于其镜像最顶层的 ZFS 快照。所有的 ZFS 组件都从同一个 zpool 分配空间。下图显示了一个基于两层镜像的容器是如何使用这些 ZFS 组件的。
Docker 存储驱动之 ZFS 简介
结合上图,下面的过程解释了镜像是如何分层的,容器是如何创建的。
▶在 Docker host 中,镜像的基础层是一个 ZFS 文件系统。
文件系统从 zpool 中消耗空间。
▶附加的镜像层是其下层镜像的克隆。
图中,“Layer 1”是通过创建基础镜像的 ZFS 快照,然后再通过快照创建克隆来实现的。克隆是可读写的,并且从 zpool 按需分配空间;而快照是只读的。
▶当容器启动时,就会在镜像层上附加一个可读写层。
上图中,制造了一个镜像顶层的快照,然后再基于快照创建了一份克隆,而这份克隆就是容器的可读写层。
如果需要改变容器,那么久会从 zpool 按需分配空间给容器,ZFS 默认会分配 128K 大小的块。
这种从只读快照创建子层和容器的方法,使得镜像作为不可变对象来维护。

容器使用 ZFS 读写

容器从 zfs 存储驱动读数据的过程非常简单。新启动的容器基于 ZFS 克隆,这份克隆从初始化开始就共享它底层的所有数据。这意味着使用 zfs 的读操作非常快,即使正在读的数据并没有拷贝到容器。下图显示了数据块的共享情况。
Docker 存储驱动之 ZFS 简介
写新数据是通过按需分配操作来完成的。每次要向容器的一个新区域写数据时,就会从 zpool 中分配一个新块,也就是说写新数据时容器就会消耗额外的空间。分配给容器的新空间从底层的 zpool 分配。
想更新容器的新数据,就得分配新空间给容器,并将这些改变的信息保存在新的块中。原来的块没有改变,下面的镜像依然是不可变的。

Docker 中配置 ZFS 存储驱动

只有在 /var/lib/docker 被映射在一个 ZFS 文件系统上时,才能在 docker host 上使用 zfs 存储驱动。本节将介绍如何在 Ubuntu 上安装原生的 ZFS on Linux(ZoL)。

准备

如果你已经在 Docker host 上使用过 Docker daemon,并且有一些想保存的镜像,那么在执行下面的步骤之前,你需要将这些镜像保存到 Docker Hub 或者你的私有 Docker 镜像仓库中。
停止 Docker daemon。另外,确保你在 /dev/xvdb(这个设备名可能根据你的 OS 环境而不同,你需要换成适合你自己的设备名)上有一个空闲块设备。

在 Ubuntu16.04 LTS 上安装 ZFS

1) 停止 Docker daemon。

$ sudo systemctl stop docker.service

2) 安装 zfs 包。

 $ sudo apt-get install -y zfs

 Reading package lists... Done
 Building dependency tree
 <output truncated>

3) 确认你的 zfs 模块成功安装并加载。

$ lsmod | grep zfs

 zfs                  2813952  3
 zunicode              331776  1 zfs
 zcommon                57344  1 zfs
 znvpair                90112  2 zfs,zcommon
 spl                   102400  3 zfs,zcommon,znvpair
 zavl                   16384  1 zfs

在 Ubuntu 14.04 LTS 上安装 ZFS

1) 停止 Docker daemon。

$ sudo systemctl stop docker.service

2) 安装 software-properties-common 包。

$ sudo apt-get install -y software-properties-common

Reading package lists... Done
Building dependency tree
<output truncated>

3) 添加 zfs-native 包。

$ sudo add-apt-repository ppa:zfs-native/stable

The native ZFS filesystem for Linux. Install the ubuntu-zfs package.
<output truncated>
gpg: key F6B0FC61: public key "Launchpad PPA for Native ZFS for Linux" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
OK

4) 获取最新包的列表。

 $ sudo apt-get update

 Ign http://us-west-2.ec2.archive.ubuntu.com trusty InRelease
 Get:1 http://us-west-2.ec2.archive.ubuntu.com trusty-updates InRelease [64.4 kB]
 <output truncated>
 Fetched 10.3 MB in 4s (2,370 kB/s)
 Reading package lists... Done

5) 安装 ubuntu-zfs 包。

$ sudo apt-get install -y ubuntu-zfs

Reading package lists... Done
Building dependency tree
<output truncated>

6) 加载 zfs 模块。

$ sudo modprobe zfs

7) 确认模块是否正确加载。

$ lsmod | grep zfs

zfs                  2768247  0
zunicode              331170  1 zfs
zcommon                55411  1 zfs
znvpair                89086  2 zfs,zcommon
spl                    96378  3 zfs,zcommon,znvpair
zavl                   15236  1 zfs

在 Docker 中配置 ZFS

一旦安装和加载了 ZFS,就可以在 Docker 中配置 ZFS 了。
1) 创建一个新的 zpool。

$ sudo zpool create -f zpool-docker /dev/xvdb

上面命令创建了一个名为“zpool-docker”的 zpool。这个名称是随意的。
2) 检查 zpool 是否存在。

$ sudo zfs list

NAME            USED  AVAIL    REFER  MOUNTPOINT
zpool-docker    55K   3.84G    19K    /zpool-docker

3) 在 /var/lib/docker 上创建和映射一个新的 ZFS 文件系统。

$ sudo zfs create -o mountpoint=/var/lib/docker zpool-docker/docker

4) 检查前面的步骤是否正常工作。

$ sudo zfs list -t all

NAME                 USED  AVAIL  REFER  MOUNTPOINT
zpool-docker         93.K  3.4G    9K  /zpool-docker
zpool-docker/docker  9K    3.4G    9K  /var/lib/docker

可以看到,在 /var/lib/docker 上���射了一个 ZFS 文件系统,daemon 启动后会自动加载 zfs 存储驱动。
5) 启动 Docker daemon。

$ sudo service docker start

docker start/running, process 2315

6) 确认 daemon 正在使用 zfs 存储驱动。

$ sudo docker info

Containers: 0
Images: 0
Storage Driver: zfs
    Zpool: zpool-docker
    Zpool Health: ONLINE
    Parent Dataset: zpool-docker/docker
    Space Used By Parent: 27648
    Space Available: 4128139776
    Parent Quota: no
    Compression: off
    Execution Driver: native-0.2
[...]

Docker 中的 ZFS 性能

有以下一些因素会影响 zfs 存储驱动在 Docker 中的性能。
●内存。内存对 ZFS 性能影响很大,因为 ZFS 最初被设计成在拥有大量内存的 Sun Solaris 服务器上使用的。
●ZFS 特性。使用 ZFS 特性,如重复删除技术,会增加 ZFS 的内存使用。就内存使用和效率原因而言,建议关闭 FS 的重复删除特性。
●ZFS 缓存。ZFS 将磁盘块缓存在被称作 adaptive replacement cache(ARC)内存结构体中。ZFS 的 ARC 单拷贝特性使得块的单个缓存拷贝可以被多个文件系统的克隆共享,也就是说多个运行着的容器可以共享缓存块的单个拷贝。这意味着对于 PaaS 或其他高密度用例来说,ZFS 是一个不错的选择。
●存储碎片。碎片是诸如 ZFS 这种 copy-on-write 文件系统的副产品。不过,ZFS 写 128K 的块时,会分配 slab(多个 128K 的块)来进行 CoW 操作,从而尝试减少存储碎片。ZFS intent log(ZIL)和 coalescing of writes(delayed writes)也可以帮忙减少碎片。
●使用原生的 Linux ZFS 驱动。虽然 Docker zfs 存储驱动支持 ZFS FUSE 实现,但在高性能场景下不建议使用 ZFS FUSE。原生的 ZFS Linux 驱动有着更好的性能。
●使用 SSD。为了更好的性能,可以使用更快的存储介质(如 SSD)。不过,如果你的 SSD 存储很有限,那么建议你关闭 SSD 上的 ZIL 特性。

限制容器写的存储配额

如果你像实现对每个镜像的存储配额,那么你可以使用 –storage-opt 选项。

--storage-opt size=256M

它会限制容器可以写 / 修改的空间大小(需要 ZFS 使能特性 available)。也就是说,如果你有一个 256MB 大小的镜像,并且使用了前面的参数选项,那么你对应的容器就有 512MB 的大小,其中有 256MB 是可用的。

更多 Docker 相关教程见以下内容

Docker 安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm

Ubuntu 14.04 安装 Docker  http://www.linuxidc.com/linux/2014-08/105656.htm

Ubuntu 使用 VNC 运行基于 Docker 的桌面系统  http://www.linuxidc.com/Linux/2015-08/121170.htm

阿里云 CentOS 6.5 模板上安装 Docker http://www.linuxidc.com/Linux/2014-11/109107.htm

Ubuntu 15.04 下安装 Docker  http://www.linuxidc.com/Linux/2015-07/120444.htm

在 Ubuntu Trusty 14.04 (LTS) (64-bit)安装 Docker http://www.linuxidc.com/Linux/2014-10/108184.htm

在 Ubuntu 15.04 上如何安装 Docker 及基本用法 http://www.linuxidc.com/Linux/2015-09/122885.htm

Ubuntu 16.04 上 Docker 使用手记 http://www.linuxidc.com/Linux/2016-12/138490.htm

Docker 的详细介绍:请点这里
Docker 的下载地址:请点这里

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-04/142521.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计5363字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中