Dell Unity 驱动¶
Unity 驱动自 Ocata 版本以来已集成到 OpenStack 块存储项目中。该驱动构建在块存储框架之上,以及 Dell 分布式 Python 包 storops 之上。
先决条件¶
软件 |
版本 |
|---|---|
Unity OE |
4.1.X 或更高版本 |
storops |
1.2.3 或更高版本 |
支持的操作¶
创建、删除、附加和分离卷。
创建、删除、附加和分离压缩卷。
创建、列出和删除卷快照。
从快照创建卷。
将镜像复制到卷。
从卷创建镜像。
克隆卷。
扩展卷。
迁移卷。
获取卷统计信息。
高效的非破坏性卷备份。
将卷恢复到快照。
创建厚卷。
使用分层策略创建卷。
创建和删除一致性组。
将卷添加到/从一致性组中添加/删除。
创建和删除一致性组快照。
克隆一致性组。
从快照创建一致性组。
同时将卷附加到多个服务器(多重附加)。
卷复制。
一致性组复制。
驱动程序配置¶
注意
以下说明应在 cinder-volume 容器上执行。
从 pypi 安装 storops
# pip install storops
将以下内容添加到
/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 驱动的最小选项,有关更多选项,请参阅 驱动选项。
注意
(可选) 如果您需要基于多路径的数据访问,请在块存储和计算节点上执行以下步骤。
安装
sysfsutils、sg3-utils和multipath-tools# apt-get install multipath-tools sg3-utils sysfsutils
(如果禁用了 自动分区支持,则 FC 驱动程序需要) 将计算节点的 FC 端口与 Unity FC 目标端口分区。
启用 Unity 存储优化多路径配置
将以下内容添加到
/etc/multipath.confblacklist { # 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 } }重启多路径服务
# service multipath-tools restart
在
/etc/cinder/cinder.conf中为每个后端或在[backend_defaults]部分作为所有后端的通用配置中启用图像传输的多路径。use_multipath_for_image_xfer = True
重启
cinder-volume服务以加载更改。在
/etc/nova/nova.conf中启用卷附加/分离的多路径。[libvirt] ... volume_use_multipath = True ...
重新启动
nova-compute服务。
驱动程序选项¶
配置选项 = 默认值 |
描述 |
|---|---|
|
(布尔值) 在最后一个 LUN 从其分离时从 Unity 中删除主机。默认情况下,为 False。 |
|
(端口(最小值 0,最大值 65535)) 用于访问 SAN API 的端口 |
|
(字符串) 用于创建卷的集群名称 |
|
(字符串) SAN 控制器的 IP 地址 |
|
(布尔值) 如果卷服务正在 SAN 设备上运行,则通过 SSH 而不是本地执行命令; |
|
(字符串) SAN 控制器的用户名 |
|
(字符串) SAN 控制器的密码 |
|
(字符串) 用于 SSH 身份验证的私钥文件名 |
|
(端口(最小值 0,最大值 65535)) 与 SAN 配合使用的 SSH 端口 |
|
(布尔值) 是否为 SAN 卷使用稀疏配置? |
|
(整数) SSH 连接超时时间,以秒为单位 |
|
(整数) 池中的最大 SSH 连接数 |
|
(整数) 池中的最小 SSH 连接数 |
|
(字符串列表) 要使用的 iSCSI 或 FC 端口的逗号分隔列表。每个端口可以是 Unix 样式的 glob 表达式。 |
|
(字符串列表) 要使用的存储池名称的逗号分隔列表。 |
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 作为多路径设备的别名。
要在实时迁移中启用多路径
注意
在执行以下步骤之前,请确保执行了 驱动程序配置 步骤。
在
/etc/nova/nova.conf中设置多路径[libvirt] ... volume_use_multipath = True ...
重启 nova-compute 服务。
在
/etc/multipath.conf中设置user_friendly_names no... defaults { user_friendly_names no } ...重启
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 驱动程序支持后端消费者类型的 maxBWS 和 maxIOPS 规格。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可能的值
StartHighThenAutoAutoHighestAvailableLowestAvailable
默认值:
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 验证已禁用,用户可以通过以下步骤启用它
设置 Unity 阵列证书并将其导入到 Unity,请参阅 安全配置指南 的 存储系统证书 部分。
将 CA 证书导入到运行驱动程序的 Cinder 节点。
在 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 节点
pingUnity 的 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}
有关命令行详细信息,请参阅 通用卷组。
卷复制¶
要启用卷复制,请按照以下步骤操作
在 Unisphere 上,配置远程系统和接口以进行复制。
具体方式取决于复制类型 - 同步或异步。请参阅 Unity 复制白皮书 以获取更多详细信息。
将 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_id、san_ip、san_password 和 max_time_out_of_sync 均受 replication_device 支持,其中 backend_id 和 san_ip 是必需的。
如果省略了 san_password,则将使用主后端的相同密码。
max_time_out_of_sync 是复制不同步的最长时间(分钟)。必须大于或等于 0。0 表示将创建同步复制的卷。请注意,同步复制的远程系统需要在 Unity 上预先创建。60 如果省略,将使用。
创建一个具有属性 replication_enabled=’<is> True’ 的卷类型。
$ openstack volume type create --property replication_enabled='<is> True' type-replication
具有步骤 #3 卷类型的任何卷将在执行 failover_host 后故障转移到辅助后端。
$ cinder failover-host --backend_id unity-secondary stein@unity-primary
稍后,它们可以回滚。
$ cinder failover-host --backend_id default stein@unity-primary
注意
即使卷正在参与复制,也可以删除该卷。在删除 LUN 之前,将从 Unity 删除复制会话。
一致性组复制¶
要启用一致性组复制,请按照以下步骤操作
在 Unisphere 上,配置远程系统和接口以进行复制。
具体方式取决于复制类型 - 同步或异步。请参阅 Unity 复制白皮书 以获取更多详细信息。
将 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_id、san_ip、san_password 和 max_time_out_of_sync 均受 replication_device 支持,其中 backend_id 和 san_ip 是必需的。
如果省略了 san_password,则将使用主后端的相同密码。
max_time_out_of_sync 是复制不同步的最长时间(分钟)。必须大于或等于 0。0 表示将创建同步复制的卷。请注意,同步复制的远程系统需要在 Unity 上预先创建。60 如果省略,将使用。
创建一个具有属性 replication_enabled=’<is> True’ 的卷类型。
$ openstack volume type create --property replication_enabled='<is> True' type-replication
创建一个具有属性 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'
创建一个具有支持复制的卷类型的组类型。
$ cinder --os-volume-api-version 3.38 group-create --name test-cg {type-cg-replication-id} type-replication
在一致性组中创建卷。
$ cinder --os-volume-api-version 3.38 create --volume-type type-replication --group-id {test-cg-id} --name {volume-name} {size}
启用一致性组复制。
$ cinder --os-volume-api-version 3.38 group-enable-replication test-cg
禁用一致性组复制。
$ cinder --os-volume-api-version 3.38 group-disable-replication test-cg
故障转移一致性组复制。
$ cinder --os-volume-api-version 3.38 group-failover-replication test-cg
回滚一致性组复制。
$ cinder --os-volume-api-version 3.38 group-failover-replication test-cg --secondary-backend-id default
注意
仅支持一致性组的组复制,请参阅步骤 4 和 5 以创建支持复制的一致性组。
故障排除¶
为了解决 OpenStack 部署中的故障,最佳方法是启用详细和调试日志,同时利用内置的 将请求 ID 返回给调用者 以跟踪特定的块存储命令日志。
启用详细日志,在
/etc/cinder/cinder.conf中设置以下内容并重启所有块存储服务[DEFAULT] ... debug = True verbose = True ...
如果涉及其它项目(通常是计算),请将 debug 和
verbose设置为True。使用
--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
使用诸如
grep、awk之类的命令查找与块存储操作相关的错误。# grep "req-3a459e0e-871a-49f9-9796-b63cc48b5015" cinder-volume.log