如何在 ZFS 上构建 OpenStack 块存储

作者:Cindy Swearingen

本文介绍如何在 Oracle Solaris 11.2 中的 ZFS 上构建高效可靠的 OpenStack 块存储。


2014 年 7 月发布


关于 Oracle Solaris 11 中的 OpenStack

想对本文发表评论吗?请将链接发布在 Facebook 的 OTN Garage 页面上。有类似文章要分享?请将其发布在 Facebook 或 Twitter 上,我们来进行讨论。

OpenStack 是一个提供云管理基础架构的受欢迎的开源项目,已集成到 Oracle Solaris 11.2 中。OpenStack 存储特性包括用于块存储访问的 Cinder(参见图 1)和用于对象存储的 Swift,Swift 还提供冗余和复制。

ZFS 是一个集成了卷管理特性的文件系统,它提供了一个简单的界面来管理大量数据。它有一组强健的数据服务,还支持各种存储协议。

Cinder 为项目(或租户)实例提供 ZFS 块设备,也就是。为每个项目实例都创建和部署一个 Oracle Solaris 内核区域或非全局区域。创建区域的可部署映像并启动区域映像的实例之后,Cinder 将分配一个 ZFS 卷(其中包含实例的映像)作为来宾的 root 设备。

Oracle Solaris 11.2 提供了其他 Cinder 驱动程序来供应以下设备:

  • 来自 Cinder 卷节点上池中的 iSCSI 目标
  • 作为块设备的 FC LUN
  • 来自 Oracle ZFS 存储系统的 iSCSI 目标

但使用这些特性不在本文的讨论范围内。

开始使用 OpenStack 时,最好先运行一个小而全的配置,其中启用所有 OpenStack 服务及同一系统节点上的 Cinder 卷服务,并使用 ZFS 作为后端存储。

ZFS 提供了强健的冗余,无需使用任何特殊软件或硬件阵列提供数据冗余。ZFS 易于配置和管理。

本文介绍在 Oracle Solaris 上部署云基础架构环境以及使用 Cinder 在同一系统上提供块存储设备作为 ZFS 卷的的云存储实践。

本文并不介绍如何安装 OpenStack。有关如何安装 OpenStack 的信息,请参见“Oracle Solaris 11.2 上的 OpenStack 入门”。

图 1. OpenStack Cinder 块存储服务示意图

图 1.OpenStack Cinder 块存储服务示意图

OpenStack 块存储先决条件和部署过程

先决条件要求 Oracle Solaris 11.2 OpenStack 已经在一个 SPARC 或 x86 系统上运行,作为运行主 OpenStack 服务的计算节点,且拥有多个本地或基于 SAN 的设备。

该配置包括以下组件:

  • 计算节点 (Nova):托管租户或项目实例区域的系统节点,但本文所介绍的过程不包括安装区域。Cinder 卷服务也在此节点上运行。
  • 卷服务 (Cinder):Cinder 卷服务为租户或项目实例分配 ZFS 卷的位置,本文中对此进行了定制。
  • 用户授权 (Keystone):管理员和租户用户名和密码必须已经创建并可以提供给身份验证服务 Keystone。

下面的一般步骤介绍如何定制一个系统,使其运行 OpenStack 服务并运行 Cinder 卷服务以部署 ZFS 卷。配置数据冗余,还可以在此配置中添加 ZFS 压缩和加密。

本文的其余部分将详细介绍这些步骤。

创建 ZFS 组件

Oracle Solaris 在通常称为 rpool 的 ZFS 存储池上运行。这种池通常较小,不是托管云基础架构的理想环境,因为它包含运行系统的 Oracle Solaris 组件。

一般来说,建议您保持较小的根池 (rpool),将应用、用户和云数据托管在一个单独的池中。镜像池配置可以让大多数负载实现最佳性能。

以下步骤介绍了如何配置图 2 所示组件:镜像 ZFS 存储池 (tank)、主文件系统 (cinder) 和 ZFS 卷,其中将包含租户(或项目)云实例。

图 2. 含文件系统组件的镜像 ZFS 存储池

图 2.含文件系统组件的镜像 ZFS 存储池

  1. 创建一个单独的镜像 ZFS 存储池,它提供数据冗余并配置两个备用磁盘。

    以下示例创建一个名为 tank 的镜像存储池,其中包含两对镜像磁盘和两个备用磁盘:

    # zpool create tank mirror c0t5000C500335F4C7Fd0 \
    c0t5000C500335F7DABd0 mirror c0t5000C500335FC6F3d0 \
    c0t5000C500336084C3d0 spare c0t5000C500335E2F03d0 \
    c0t50015179594B6F52d0
    

    根据您估计的云数据需求调整镜像存储池的大小。如果需要更多空间,您随时可以将其他的镜像设备对添加到镜像 ZFS 存储池。

    有关 ZFS 管理语法的更多信息,请参见管理 Oracle Solaris 11.2 中的 ZFS 文件系统

    查看池的当前状态:

    # zpool status tank
    

    确定池的原始可用空间:

    # zpool list tank
    
  2. 创建 ZFS 文件系统:

    :如果您要使用加密保护云数据,必须在创建 ZFS 文件系统时启用加密(如下所述)。有关 ZFS 加密和除提示输入密码短语之外的其他加密密钥方法的更多信息,请参见管理 Oracle Solaris 11.2 中的 ZFS 文件系统

    # zfs create tank/cinder
    

    检查可用于文件系统的实际可用空间:

    # zfs list -r tank/cinder
    

    通过监视 USED 空间和 AVAIL 空间,经常查看您的 ZFS 卷的可用空间。

    如果要节省磁盘空间,请在 tank/cinder 文件系统上启用压缩。将自动压缩为项目实例分配的 ZFS 卷。

    # zfs set compression=on tank/cinder
    

    如果要保护云数据,请考虑启用加密。

    # zfs create -o encryption=on tank/cinder
    Enter passphrase for 'tank/cinder': xxxxxxxx
    Enter again: xxxxxxxx
    

定制 Cinder 存储位置

  1. 修改 /etc/cinder/cinder.conf 中的 zfs_volume_base 参数,标识备用 pool/file-system

    例如,将以下行:

    # zfs_volume_base = rpool/cinder 
    

    更改为:

    # zfs_volume_base = tank/cinder
    
  2. 刷新 Cinder 卷服务:

    # svcadm restart svc:/application/openstack/cinder/cinder-volume:setup
    # svcadm restart svc:/application/openstack/cinder/cinder-volume:default
    

测试 Cinder 配置

  1. 设置身份验证环境变量:

    Cinder 希望以下 Keystone 授权参数在命令行上以选项形式出现,您也可以将其设置为环境变量。

    # export OS_AUTH_URL=http://localhost:5000/v2.0 
    # export OS_USERNAME=admin-user-name 
    # export OS_PASSWORD=password 
    # export OS_TENANT_NAME=tenant-user-name 
    
  2. 创建一个 1-GB 测试卷:

    # cinder create --display_name test 1
    +---------------------+--------------------------------------+
    |       Property      |                Value                 |
    +---------------------+--------------------------------------+
    |     attachments     |                  []                  |
    |  availability_zone  |                 nova                 |
    |       bootable      |                false                 |
    |      created_at     |      2014-07-17T20:19:33.423744      |
    | display_description |                 None                 |
    |     display_name    |                 test                 |
    |          id         | 258d80e9-2ef3-eab8-fbea-96a4d176360d |
    |       metadata      |                  {}                  |
    |         size        |                  1                   |
    |     snapshot_id     |                 None                 |
    |     source_volid    |                 None                 |
    |        status       |               creating               |
    |     volume_type     |                 None                 |
    +---------------------+--------------------------------------+
    
  3. 创建 Cinder 卷之后,确认该卷已创建并开始使用空间:

    # zfs list -r tank/cinder
    NAME                             USED  AVAIL REFER MOUNTPOINT
    tank/cinder                      1.03G 547G  31K  /tank/cinder
    tank/cinder/volume-258d80e9-...  1.03G  546G 16K  -
    

    还可以确认该卷在 OpenStack 的 Horizon 界面上可见。通过 Horizon 启动项目实例时,将自动创建一个新的 Cinder 卷,因此您可以从 Horizon->volume 菜单使用 Delete Volume 特性删除测试卷。

(可选)执行其他 Cinder 配置定制

下面是您可以执行的其他定制:

  • 通过设置 smtp-notify 警报通知监视 ZFS 池的磁盘故障。
  • 使用 ZFS 快照复制 ZFS 卷。
  • 创建单独的存档池并启用 ZFS 压缩以减少存档租户数据时占用的存储空间。

更多信息,请参见管理 Oracle Solaris 11.2 中的 ZFS 文件系统

总结

为 OpenStack 提供 Cinder 卷服务的冗余 ZFS 存储池可以托管在任何本地或 SAN 存储上,为云数据提供保护。您还可以对云存储应用强健的数据服务,如通过加密确保数据安全或通过压缩来减少数据。

另请参见

ZFS 博客

另请参见以下资源:

关于作者

Cindy Swearingen 是 Oracle Solaris 产品经理,擅长 ZFS 和存储特性。

修订版 1.0,2014 年 7 月 23 日

关注我们:
博客 | Facebook | Twitter | YouTube