Dell Unity 驱动

Unity 驱动自 Ocata 版本以来已集成到 OpenStack 块存储项目中。该驱动构建在块存储框架之上,以及 Dell 分布式 Python 包 storops 之上。

先决条件

软件

版本

Unity OE

4.1.X 或更高版本

storops

1.2.3 或更高版本

支持的操作

  • 创建、删除、附加和分离卷。

  • 创建、删除、附加和分离压缩卷。

  • 创建、列出和删除卷快照。

  • 从快照创建卷。

  • 将镜像复制到卷。

  • 从卷创建镜像。

  • 克隆卷。

  • 扩展卷。

  • 迁移卷。

  • 获取卷统计信息。

  • 高效的非破坏性卷备份。

  • 将卷恢复到快照。

  • 创建厚卷。

  • 使用分层策略创建卷。

  • 创建和删除一致性组。

  • 将卷添加到/从一致性组中添加/删除。

  • 创建和删除一致性组快照。

  • 克隆一致性组。

  • 从快照创建一致性组。

  • 同时将卷附加到多个服务器(多重附加)。

  • 卷复制。

  • 一致性组复制。

驱动程序配置

注意

以下说明应在 cinder-volume 容器上执行。

  1. 从 pypi 安装 storops

    # pip install storops
    
  2. 将以下内容添加到 /etc/cinder/cinder.conf

    [DEFAULT]
    enabled_backends = unity
    
    [unity]
    # Storage protocol
    storage_protocol = iSCSI
    # Unisphere IP
    san_ip = <SAN IP>
    # Unisphere username and password
    san_login = <SAN LOGIN>
    san_password = <SAN PASSWORD>
    # Volume driver name
    volume_driver = cinder.volume.drivers.dell_emc.unity.Driver
    # backend's name
    volume_backend_name = Storage_ISCSI_01
    

    注意

    这些是 Unity 驱动的最小选项,有关更多选项,请参阅 驱动选项

注意

(可选) 如果您需要基于多路径的数据访问,请在块存储和计算节点上执行以下步骤。

  1. 安装 sysfsutilssg3-utilsmultipath-tools

    # apt-get install multipath-tools sg3-utils sysfsutils
    
  2. (如果禁用了 自动分区支持,则 FC 驱动程序需要) 将计算节点的 FC 端口与 Unity FC 目标端口分区。

  3. 启用 Unity 存储优化多路径配置

    将以下内容添加到 /etc/multipath.conf

    blacklist {
        # Skip the files uner /dev that are definitely not FC/iSCSI devices
        # Different system may need different customization
        devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
        devnode "^hd[a-z][0-9]*"
        devnode "^cciss!c[0-9]d[0-9]*[p[0-9]*]"
    
        # Skip LUNZ device from VNX/Unity
        device {
            vendor "DGC"
            product "LUNZ"
        }
    }
    
    defaults {
        user_friendly_names no
        flush_on_last_del yes
    }
    
    devices {
        # Device attributed for EMC CLARiiON and VNX/Unity series ALUA
        device {
            vendor "DGC"
            product ".*"
            product_blacklist "LUNZ"
            path_grouping_policy group_by_prio
            path_selector "round-robin 0"
            path_checker emc_clariion
            features "0"
            no_path_retry 12
            hardware_handler "1 alua"
            prio alua
            failback immediate
        }
    }
    
  4. 重启多路径服务

    # service multipath-tools restart
    
  5. /etc/cinder/cinder.conf 中为每个后端或在 [backend_defaults] 部分作为所有后端的通用配置中启用图像传输的多路径。

    use_multipath_for_image_xfer = True
    

    重启 cinder-volume 服务以加载更改。

  6. /etc/nova/nova.conf 中启用卷附加/分离的多路径。

    [libvirt]
    ...
    volume_use_multipath = True
    ...
    
  7. 重新启动 nova-compute 服务。

驱动程序选项

Unity 配置选项说明

配置选项 = 默认值

描述

remove_empty_host = False

(布尔值) 在最后一个 LUN 从其分离时从 Unity 中删除主机。默认情况下,为 False。

san_api_port = None

(端口(最小值 0,最大值 65535)) 用于访问 SAN API 的端口

san_clustername = <>

(字符串) 用于创建卷的集群名称

san_ip = <>

(字符串) SAN 控制器的 IP 地址

san_is_local = False

(布尔值) 如果卷服务正在 SAN 设备上运行,则通过 SSH 而不是本地执行命令;

san_login = admin

(字符串) SAN 控制器的用户名

san_password = <>

(字符串) SAN 控制器的密码

san_private_key = <>

(字符串) 用于 SSH 身份验证的私钥文件名

san_ssh_port = 22

(端口(最小值 0,最大值 65535)) 与 SAN 配合使用的 SSH 端口

san_thin_provision = True

(布尔值) 是否为 SAN 卷使用稀疏配置?

ssh_conn_timeout = 30

(整数) SSH 连接超时时间,以秒为单位

ssh_max_pool_conn = 5

(整数) 池中的最大 SSH 连接数

ssh_min_pool_conn = 1

(整数) 池中的最小 SSH 连接数

unity_io_ports = []

(字符串列表) 要使用的 iSCSI 或 FC 端口的逗号分隔列表。每个端口可以是 Unix 样式的 glob 表达式。

unity_storage_pool_names = []

(字符串列表) 要使用的存储池名称的逗号分隔列表。

FC 或 iSCSI 端口选项

指定用于执行 IO 的 FC 或 iSCSI 端口列表。支持通配符。对于 iSCSI 端口,请使用以下格式

unity_io_ports = spa_eth2, spb_eth2, *_eth3

对于 FC 端口,请使用以下格式

unity_io_ports = spa_iom_0_fc0, spb_iom_0_fc0, *_iom_0_fc1

使用 uemcli 命令列出端口 ID

$ uemcli /net/port/eth show -output csv
...
"spa_eth2","SP A Ethernet Port 2","spa","file, net, iscsi", ...
"spb_eth2","SP B Ethernet Port 2","spb","file, net, iscsi", ...
...

$ uemcli /net/port/fc show -output csv
...
"spa_iom_0_fc0","SP A I/O Module 0 FC Port 0","spa", ...
"spb_iom_0_fc0","SP B I/O Module 0 FC Port 0","spb", ...
...

实时迁移集成

建议在计算节点上配置多路径,以便在 VM 实例实时迁移场景中实现强大的数据访问。一旦在 /etc/multipath.conf 的 defaults 部分设置了 user_friendly_names no,计算节点将使用 WWID 作为多路径设备的别名。

要在实时迁移中启用多路径

注意

在执行以下步骤之前,请确保执行了 驱动程序配置 步骤。

  1. /etc/nova/nova.conf 中设置多路径

    [libvirt]
    ...
    volume_use_multipath = True
    ...
    

    重启 nova-compute 服务。

  2. /etc/multipath.conf 中设置 user_friendly_names no

    ...
    defaults {
        user_friendly_names no
    }
    ...
    
  3. 重启 multipath-tools 服务。

薄盘和厚盘配置

默认情况下,Unity 驱动程序创建的卷是薄盘配置。运行以下命令创建厚盘卷。

# openstack volume type create --property provisioning:type=thick \
  --property thick_provisioning_support='<is> True' thick_volume_type
# openstack volume create --type thick_volume_type thick_volume

压缩卷支持

Unity 驱动程序支持 compressed volume 创建、修改和删除。为了创建压缩卷,首先需要创建一个启用压缩支持的卷类型

$ openstack volume type create CompressedVolumeType
$ openstack volume type set --property provisioning:type=compressed --property compression_support='<is> True' CompressedVolumeType

然后创建卷并指定新创建的卷类型。

注意

在 Unity 中,只有全闪存池支持压缩卷,对于其他类型的池,在获取池状态时将返回“’compression_support’: False”。

存储辅助卷迁移支持

Unity 驱动程序支持存储辅助卷迁移,当用户使用 cinder migrate --force-host-copy False <volume_id> <host>cinder migrate <volume_id> <host> 启动迁移时,cinder 将尝试利用 Unity 的本机卷迁移功能。如果 Unity 迁移卷失败,将触发主机辅助迁移。

在以下情况下,将不会触发 Unity 存储辅助卷迁移。而是会触发主机辅助卷迁移

  • 卷将在后端之间迁移。

  • 克隆卷的迁移。例如,如果 vol_2 是从 vol_1 克隆的,则 vol_2 的存储辅助卷迁移将不会被触发。

重定型卷支持

Unity 驱动程序支持在创建后更改卷的类型。

$ cinder retype [--migration-policy <never|on-demand>] <volume> <volume-type>

默认情况下,–migration-policy 未启用。某些重定型操作将需要基于后端支持的迁移。在这些情况下,无论 –migration-policy 如何,都将触发存储辅助迁移。例如:在“thin”和“thick”之间重定型,在“thick”和“compressed”之间重定型,重定型到当前主机不支持的类型。

QoS 支持

Unity 驱动程序支持后端消费者类型的 maxBWSmaxIOPS 规格。maxBWS 表示 Unity 中 Maximum Bandwidth (KBPS) 绝对限制,maxIOPS 表示 Unity 中 Maximum IO/S 绝对限制。

存储分层支持

Unity 支持完全自动化的存储分层,这需要 Unity 上激活 FAST VP 许可证。OpenStack 管理员可以使用额外的规格键 storagetype:tiering 设置卷的分层策略,并使用键 fast_support='<is> True' 让块存储调度程序找到管理已激活 FAST VP 许可证的 Unity 的卷后端。

  • key: storagetype:tiering

  • 可能的值

    • StartHighThenAuto

    • Auto

    • HighestAvailable

    • LowestAvailable

  • 默认值: StartHighThenAuto

运行以下命令创建具有分层策略的卷类型

$ openstack volume type create VolumeOnAutoTier
$ openstack volume type set --property storagetype:tiering=Auto --property fast_support='<is> True' VolumeOnAutoTier

自动分区支持

Unity 卷驱动程序支持自动分区,并与其它厂商共享相同的配置指南。有关详细配置步骤,请参阅 光纤通道区域管理器

LUNZ 设备解决方案

EMC 主机团队发现所有主机上都有 LUNZ,EMC 最佳实践是呈现一个带有 HLU 0 的 LUN 以清除任何 LUNZ 设备,因为它们可能会导致主机出现问题。请参阅 KB LUNZ 设备

为了解决此问题,Unity 驱动程序会创建一个 虚拟 LUN(如果不存在),并在卷附加期间将其添加到每个主机以占用 HLU 0

注意

虚拟 LUN 在连接到 Unity 的所有主机之间共享。

高效的非破坏性卷备份

块存储中非破坏性卷备份的默认实现效率不高,因为在备份期间会创建一个克隆卷。

一种有效的方法是为卷创建快照,并将此快照连接到块存储主机以进行卷备份。

SSL 支持

管理员能够启用针对 Unity REST API 的任何通信的 SSL 验证。

默认情况下,SSL 验证已禁用,用户可以通过以下步骤启用它

  1. 设置 Unity 阵列证书并将其导入到 Unity,请参阅 安全配置指南存储系统证书 部分。

  2. 将 CA 证书导入到运行驱动程序的 Cinder 节点。

  3. 在 Cinder 节点上启用更改并重启 Cinder 服务。

[unity]
...
driver_ssl_cert_verify = True
driver_ssl_cert_path = <path to the CA>
...

如果省略了 driver_ssl_cert_path,系统默认 CA 将用于 CA 验证。

IPv6 支持

此驱动程序可以支持基于 IPv6 的控制路径和数据路径。

对于控制路径,请按照以下步骤操作

  • 启用 Unity 的 Unipshere IPv6 地址。

  • 配置 IPv6 网络,以确保 cinder 节点可以通过 IPv6 地址访问 Unishpere。

  • 更改 Cinder 配置文件 /etc/cinder/cinder.conf。将 san_ip 设置为 Unisphere IPv6 地址。例如,san_ip = [fd99:f17b:37d0::100]

  • 重启 Cinder 服务以使新的配置生效。

注意:控制路径上的 IPv6 支持取决于 cpython bug 32185 的修复。请确保您的 Python 版本包含此 bug 的修复。

对于数据路径,请按照以下步骤操作

  • 在 Unity 上,创建带有 IPv6 地址的 iSCSI 接口。

  • 配置 IPv6 网络,以确保您可以从 Cinder 节点 ping Unity 的 iSCSI IPv6 地址。

  • 如果您使用 Cinder 创建卷并将其附加到 VM,则 VM 与卷之间的连接将是基于 IPv6 的 iSCSI。

强制从所有主机分离卷

用户可以使用 os-force_detach 操作从其所有附加主机分离卷。有关详细信息,请参阅 https://docs.openstack.org/api-ref/block-storage/v3/?expanded=force-detach-a-volume-detail#force-detach-a-volume

一致性组支持

为了支持一致性组快照的组,相应组类型中的组规格应具有以下条目

{'consistent_group_snapshot_enabled': <is> True}

同样,为了使卷位于支持一致性组快照的组中,卷类型额外的规格也应具有以下条目

{'consistent_group_snapshot_enabled': <is> True}

有关命令行详细信息,请参阅 通用卷组

卷复制

要启用卷复制,请按照以下步骤操作

  1. 在 Unisphere 上,配置远程系统和接口以进行复制。

具体方式取决于复制类型 - 同步或异步。请参阅 Unity 复制白皮书 以获取更多详细信息。

  1. replication_device 添加到 cinder.conf 中的存储后端设置,然后重启 Cinder Volume 服务。

    卷复制的 cinder.conf 示例

    [unity-primary]
    san_ip = xxx.xxx.xxx.xxx
    ...
    replication_device = backend_id:unity-secondary,san_ip:yyy.yyy.yyy.yyy,san_login:username,san_password:****,max_time_out_of_sync:60
    
    • 每个主后端只能配置一个 replication_device

    • backend_idsan_ipsan_passwordmax_time_out_of_sync 均受 replication_device 支持,其中 backend_idsan_ip 是必需的。

    • 如果省略了 san_password,则将使用主后端的相同密码。

    • max_time_out_of_sync 是复制不同步的最长时间(分钟)。必须大于或等于 00 表示将创建同步复制的卷。请注意,同步复制的远程系统需要在 Unity 上预先创建。60 如果省略,将使用。

  2. 创建一个具有属性 replication_enabled=’<is> True’ 的卷类型。

    $ openstack volume type create --property replication_enabled='<is> True' type-replication
    
  3. 具有步骤 #3 卷类型的任何卷将在执行 failover_host 后故障转移到辅助后端。

    $ cinder failover-host --backend_id unity-secondary stein@unity-primary
    
  4. 稍后,它们可以回滚。

    $ cinder failover-host --backend_id default stein@unity-primary
    

注意

即使卷正在参与复制,也可以删除该卷。在删除 LUN 之前,将从 Unity 删除复制会话。

一致性组复制

要启用一致性组复制,请按照以下步骤操作

  1. 在 Unisphere 上,配置远程系统和接口以进行复制。

具体方式取决于复制类型 - 同步或异步。请参阅 Unity 复制白皮书 以获取更多详细信息。

  1. replication_device 添加到 cinder.conf 中的存储后端设置,然后重启 Cinder Volume 服务。

    卷复制的 cinder.conf 示例

    [unity-primary]
    san_ip = xxx.xxx.xxx.xxx
    ...
    replication_device = backend_id:unity-secondary,san_ip:yyy.yyy.yyy.yyy,san_login:username,san_password:****,max_time_out_of_sync:60
    
    • 每个主后端只能配置一个 replication_device

    • backend_idsan_ipsan_passwordmax_time_out_of_sync 均受 replication_device 支持,其中 backend_idsan_ip 是必需的。

    • 如果省略了 san_password,则将使用主后端的相同密码。

    • max_time_out_of_sync 是复制不同步的最长时间(分钟)。必须大于或等于 00 表示将创建同步复制的卷。请注意,同步复制的远程系统需要在 Unity 上预先创建。60 如果省略,将使用。

  2. 创建一个具有属性 replication_enabled=’<is> True’ 的卷类型。

    $ openstack volume type create --property replication_enabled='<is> True' type-replication
    
  3. 创建一个具有属性 consistent_group_snapshot_enabled=’<is> True’consistent_group_replication_enabled=’<is> True’ 的一致性组类型。

    $ cinder --os-volume-api-version 3.38 group-type-create type-cg-replication
    $ cinder --os-volume-api-version 3.38 group-type-key type-cg-replication set
    consistent_group_snapshot_enabled='<is> True' consistent_group_replication_enabled='<is> True'
    
  4. 创建一个具有支持复制的卷类型的组类型。

    $ cinder --os-volume-api-version 3.38 group-create --name test-cg {type-cg-replication-id} type-replication
    
  5. 在一致性组中创建卷。

    $ cinder --os-volume-api-version 3.38 create --volume-type type-replication --group-id {test-cg-id}
    --name {volume-name} {size}
    
  6. 启用一致性组复制。

    $ cinder --os-volume-api-version 3.38 group-enable-replication test-cg
    
  7. 禁用一致性组复制。

    $ cinder --os-volume-api-version 3.38 group-disable-replication test-cg
    
  8. 故障转移一致性组复制。

    $ cinder --os-volume-api-version 3.38 group-failover-replication test-cg
    
  9. 回滚一致性组复制。

    $ cinder --os-volume-api-version 3.38 group-failover-replication test-cg --secondary-backend-id default
    

注意

仅支持一致性组的组复制,请参阅步骤 4 和 5 以创建支持复制的一致性组。

故障排除

为了解决 OpenStack 部署中的故障,最佳方法是启用详细和调试日志,同时利用内置的 将请求 ID 返回给调用者 以跟踪特定的块存储命令日志。

  1. 启用详细日志,在 /etc/cinder/cinder.conf 中设置以下内容并重启所有块存储服务

    [DEFAULT]
    
    ...
    
    debug = True
    verbose = True
    
    ...
    

    如果涉及其它项目(通常是计算),请将 debugverbose 设置为 True

  2. 使用 --debug 触发任何有问题块存储操作

    # cinder --debug create --name unity_vol1 100
    

    您将从控制台看到请求 ID,例如

    DEBUG:keystoneauth:REQ: curl -g -i -X POST
    http://192.168.1.9:8776/v2/e50d22bdb5a34078a8bfe7be89324078/volumes -H
    "User-Agent: python-cinderclient" -H "Content-Type: application/json" -H
    "Accept: application/json" -H "X-Auth-Token:
    {SHA1}bf4a85ad64302b67a39ad7c6f695a9630f39ab0e" -d '{"volume": {"status":
    "creating", "user_id": null, "name": "unity_vol1", "imageRef": null,
    "availability_zone": null, "description": null, "multiattach": false,
    "attach_status": "detached", "volume_type": null, "metadata": {},
    "consistencygroup_id": null, "source_volid": null, "snapshot_id": null,
    "project_id": null, "source_replica": null, "size": 10}}'
    DEBUG:keystoneauth:RESP: [202] X-Compute-Request-Id:
    req-3a459e0e-871a-49f9-9796-b63cc48b5015 Content-Type: application/json
    Content-Length: 804 X-Openstack-Request-Id:
    req-3a459e0e-871a-49f9-9796-b63cc48b5015 Date: Mon, 12 Dec 2016 09:31:44 GMT
    Connection: keep-alive
    
  3. 使用诸如 grepawk 之类的命令查找与块存储操作相关的错误。

    # grep "req-3a459e0e-871a-49f9-9796-b63cc48b5015" cinder-volume.log