Stein 中的存储可用区改进¶
https://blueprints.launchpad.net/manila/+spec/per-backend-availability-zones
https://blueprints.launchpad.net/manila/+spec/export-locations-az
https://blueprints.launchpad.net/manila/+spec/share-type-supported-azs
Manila 支持存储可用区 (AZ) 的概念(配置选项:storage_availability_zone)。存储 AZ 是一个字符串,它提供了一种松散、灵活且概念化的表示,用于共享故障方面的物理存储资源。Manila 提供了一个 API 来发现已配置哪些 AZ。用户可以请求将其共享计划到特定的 AZ。共享也可以在 AZ 之间复制。
可用区也用于其他 OpenStack 服务,例如 nova 和 cinder,作为在 OpenStack 部署中逻辑划分资源的一种方式。在 Nova 中,这种划分可能是因为这些资源旨在用于特定的任务,或者因为它们位于同一位置。然而,最常见的标准是这些资源与共同的故障点相关联,例如连接到公共电源。在 OpenStack 的 Mitaka 版本中,neutron 添加了对可用区的支持。有了这个,用户实际上可以将网络资源分配到 AZ 以实现高可用性。
随着 OpenStack 用例的不断发展,存储可用区概念对于构建相关功能变得越来越重要。OpenStack 在边缘计算中的使用是基于跨多个“区域”的 Stretch OpenStack 集群和分割控制平面的概念,这些“区域”位于单个“区域”中 [1]。Manila 明确定义其可用区结构非常重要,以便可以在所有用例中以可扩展的方式使用它。
问题描述¶
本规范强调了现有存储 AZ 支持的三个问题
服务可用性和存储可用性之间的耦合¶
Manila 期望 storage_availability_zone 配置选项在配置文件中共享管理器服务的 [DEFAULT] 部分中指定。在服务启动时,在同一配置文件中配置的所有后端都使用指定的 AZ 进行注册。以下两种情况不希望出现这种情况
服务可用性并不总是与存储可用性相同。manila-share 管理器进程可以直接在专用的“存储”节点上运行,这种模式通常在云本地存储(例如 LVM、ZFSOnLinux 或 cinder 后端块存储(通用驱动程序))中使用时可以看到。在这种情况下,期望服务 AZ 与存储 AZ 相同。
然而,在许多部署中,manila 的控制平面并不与它管理的存储位于相同的故障域中。例如,考虑一个具有 3 个“控制器”节点的 OpenStack 云,manila 的控制平面(api、scheduler、share-manager 和数据进程)在所有三个控制器节点上运行。这个云可以拥有第三方存储系统,作为 manila 后端,该系统位于云外部。在这种模型中,share-manager 进程及其存储后端位于不同的故障域中。通常,为了实现控制平面的高可用性,云管理员运行多个 manila share-manager 服务副本(例如,在每个 OpenStack 控制器节点上),并通过 Pacemaker/Corosync 或通过配置每个服务侦听相同的服务消息队列通道/主题(配置选项:host)在 manila 外部编排高可用性。
第二个限制在于多后端情况下的不灵活性。考虑一个同时使用云本地存储和第三方外部存储,由同一个 share-manager 服务管理的部署。share-manager 服务为每个后端创建一个单独的进程。但是,由于父服务消耗单个配置文件,管理员只能为两个后端指定一个 storage_availability_zone,即使实际上并非如此。
发现要使用的正确导出¶
此问题特定于复制共享的用户体验。有时可能存在跨 AZ 的数据路径连接。但是,通常情况下,高带宽数据网络(共享导出在其中导出的网络)是本地的且与 AZ 不同的。无论如何,用户必须能够发现在使用复制共享时应使用哪个导出路径。
用例¶
云管理员必须能够为每个后端配置
storage_availability_zone用户必须能够发现给定可用区的导出位置
用户必须能够发现给定可用区内可用的共享类型以及给定共享类型支持的可用区
提议的变更¶
允许为每个后端配置 AZ
我们将把配置选项 storage_availability_zone 从 [DEFAULT] 部分移动到特定于驱动程序的部分。在 [DEFAULT] 部分配置 storage_availability_zone 将被弃用,但不会不受支持,考虑到部署者的升级影响。请参阅此处对应的 cinder 更改:[2]
导出位置更改
导出位置 API (GET shares/{share_id}/export_locations) 将被修改为仅呈现共享的 active 副本的导出位置。此 API 更改将进行微版本控制。这意味着当在非复制共享上调用 API 时,它将呈现共享的所有导出位置。复制共享的用户可以通过新的 API 查询副本的导出位置。新的 API 将呈现导出位置、现有的驱动程序驱动的“元数据”以及相关的副本信息(副本 ID、副本状态、可用区),以确定哪些导出适合使用。这些 API 更改使 API 更精简,但 UI 将被设计为在必要时从不同的 API 汇总信息以一起呈现相关信息。
共享类型更改
将创建一个新的可选用户/租户可见的 extra-spec,称为“availability_zones”。如果未指定,此 extra-spec 的默认值为“*”,并且该值会显示给用户和管理员。云管理员可以使用逗号分隔的可用区列表覆盖此默认值,该列表是共享类型支持的可用区。可以使用逗号分隔的可用区列表通过 availability_zones 过滤共享类型。
注意
共享类型是可变的。与共享类型关联的 extra-spec 的任何更改都不会影响该类型现有的共享。云管理员可以随时更新 availability_zones extra-spec 的值,但他们必须意识到修改租户可见的 extra-spec(而不修改受影响的现有共享的属性)可能会让最终用户感到困惑。
AZ 调度更改
如果用户未选择 AZ 来创建新的共享,则可用区调度器过滤器 (manila.scheduler.filters.availability_zone .AvailabilityZoneFilter) 将考虑 availability_zones extra-spec 以过滤后端以调度共享。
受影响的工作流程¶
检索共享类型
共享类型 API 将被修改为支持 availability_zones 作为用户可见的“可选”extra-spec。如果未设置,其值为“*”,表示支持所有可用区。可以使用一个或多个可用区过滤此字段。还可以通过 availability_zones=* 过滤共享类型,这将检索仅支持所有可用区的共享类型。在 UI 上,如果选择了共享类型,将仅显示受支持的可用区列表,反之亦然。
创建共享
共享 API 将验证共享类型是否支持可用区,如果请求在可用区内创建共享。如果共享类型不支持请求的可用区,则 API 将返回 HTTP 400。在使用 CLI 时,用户通常会列出共享类型和可用区,并选择一个共享类型和可用区来调用 manila create 命令。有了此更改,manila share-type-list 命令将显示 availability_zones extra-spec,以便他们做出明智的选择。为了防止性能下降,CLI 方面不会对共享类型和 AZ 进行验证,API 将提供一个明确的错误消息,这应该足够了。
检索导出位置
用户将无法使用导出位置 API 检索副本的导出位置。共享实例导出位置 API 将不会被更改,因此该 API 的使用者不会受到影响。可以使用共享副本导出位置 API 来检索给定共享的所有副本导出位置的详细信息,或检索共享特定副本的导出位置或特定导出的详细导出位置信息。
创建共享组
可以在指定的可用区内创建共享组。共享组 API 将检查可用区是否在使用的共享类型中受支持。在 UI 上,如果选择可用区来调度共享组,则将根据对该可用区的支持过滤共享类型列表。
备选方案¶
当前,当管理员想要配置多个可用区时,他们会配置多个 manila share-manager 服务,每个服务都有自己的配置文件。这需要部署方工具,并重复了 share-manager 服务本身生成进程来管理其多个后端的工作。
用户当前有一些 hacky/非文档化的方法来确定导出位置是否针对特定 AZ 进行了优化(甚至是否有效)。一种方法是依赖于导出位置包含共享“实例”ID 作为子字符串的可能性。但是,这种方法不适用于非复制共享,因为用户(由于默认策略)无法列出共享实例。他们只能看到共享的副本的 ID(在底层是共享实例)。另一种方法是尝试使用列表中的每个导出位置挂载共享,并坚持连接或最快的那个(由用户驱动的测试确定)。
当前共享类型在特定 AZ 中不可用会导致异步失败,可以通过用户消息进行诊断。我们可以接受这种用户体验。
数据模型影响¶
没有提出数据库模式更改。因此,不会提交任何数据库迁移。
REST API 影响¶
请注意我们 API 参考 中这些 API 的当前状态。
列出共享类型:
GET /v2/{tenant_id}/types?availability_zones=az1
响应
Code: 200 OK
{
"volume_types": [
..
],
"share_types": [
{
"required_extra_specs": {
"driver_handles_share_servers": "True"
},
"share_type_access:is_public": true,
"extra_specs": {
"driver_handles_share_servers": "True",
"mount_snapshot_support": "False",
"revert_to_snapshot_support": "False",
"create_share_from_snapshot_support": "True",
"snapshot_support": "True",
"availability_zones": "az1,az4"
},
"id": "7fa1342b-de9d-4d89-bdc8-af67795c0e52",
"name": "testing",
"is_default": false,
"description": "share type description"
}
]
}
获取共享类型:
GET /v2/{tenant_id}/types/{share_type_id}
响应
Code: 200 OK
{
"share_type": {
"required_extra_specs": {
"driver_handles_share_servers": "True"
},
"share_type_access:is_public": true,
"extra_specs": {
"driver_handles_share_servers": "True",
"mount_snapshot_support": "False",
"revert_to_snapshot_support": "False",
"create_share_from_snapshot_support": "True",
"snapshot_support": "True",
"availability_zones": "*"
},
"id": "2780fc88-526b-464a-a72c-ecb83f0e3929",
"name": "default-share-type",
"is_default": true,
"description": "default share type"
},
"volume_type": {
..
}
}
将对以下 API 进行类似的模式更改
GET /v2/{tenant_id}/types/default
GET /v2/{tenant_id}/types/{share_type_id}/extra_specs
POST /v2/{tenant_id}/types
列出共享导出位置:
对此 API 的更改是从响应模式中删除非活动副本位置
GET /v2/{tenant_id}/shares/{share_id}/export_locations
响应
Code: 200 OK
{
"export_locations": [
{
"path": "10.254.0.3:/shares/share-e1c2d35e-fe67-4028-ad7a-45f668732b1d",
"id": "b6bd76ce-12a2-42a9-a30a-8a43b503867d",
"preferred": false,
},
{
"path": "[db9f:6954::7766]:/shares/share-e1c2d35e-fe67-4028-ad7a-45f668732b1d",
"id": "a16ef0be-9181-40af-a61c-7764816bc08d",
"preferred": true,
}
]
}
共享副本的导出位置:
GET /v2/{tenant_id}/share-replicas/{share_replica_id}/export_locations
响应
Code: 200 OK
{
"export_locations": [
{
"path": "10.254.0.3:/shares/share-8acb2fc3-7139-434f-8637-1ad7f49ee881",
"share_replica_id": "8acb2fc3-7139-434f-8637-1ad7f49ee881",
"replica_state": "in_sync",
"id": "8da0a189-8365-4c28-919b-9f07c4f06c65",
"preferred": false,
"availability_zone": "northYVZ"
},
{
"path": "[db9f:6954::7766]:/shares/share-e1c2d35e-fe67-4028-ad7a-45f668732b1d",
"share_replica_id": "e1c2d35e-fe67-4028-ad7a-45f668732b1d",
"replica_state": "in_sync",
"id": "ad19597c-4d04-4869-af5f-c8173c2bcd51",
"preferred": true,
"availability_zone": "northYVZ"
}
]
}
共享副本导出位置
GET /v2/{tenant_id}/share-replicas/{share_replica_id}/export_locations/{export_location_id}
响应
Code: 200 OK
{
"export_location": {
"path": "10.254.0.3:/shares/share-8acb2fc3-7139-434f-8637-1ad7f49ee881",
"share_replica_id": "8acb2fc3-7139-434f-8637-1ad7f49ee881",
"replica_state": "in_sync",
"id": "8da0a189-8365-4c28-919b-9f07c4f06c65",
"preferred": false,
"availability_zone": "northYVZ",
"created_at": 2018-11-27T22:54:32.000000,
"updated_at": 2018-11-27T22:54:38.000000
}
}
安全影响¶
无
通知影响¶
无
其他最终用户影响¶
如果管理员未配置 availability_zones extra-spec,则最终用户不会观察到任何 API 更改。CLI 和 UI 的影响如下
manilaclient 和 CLI:
manila show和manila share-export-location-list将不再显示给定共享的非活动副本的导出位置。将添加一个新命令manila share-replica-export-location-list,该命令将接受副本 ID 作为参数以检索副本导出位置。用户还可以使用manila share-replica-export-location-show命令以及副本 ID 和导出位置 ID 来检索特定副本导出位置的详细信息。这些命令将具有相应的 manilaclient 实现,允许 python 包的用户检索共享副本导出位置。manila UI:用户仅会在共享详细信息页面上看到活动副本导出位置。UI 将使用新创建的客户端集成来调用共享副本导出位置 API 以检索导出位置并在共享副本详细信息页面上显示它们。这种方法将解决 LP 1787016 [5]。
性能影响¶
预计从导出位置 API 中过滤掉非活动副本会增加轻微/可忽略的性能下降,因为我们将执行导出位置及其关联的共享实例的连接加载。
其他部署者影响¶
storage_availability_zone将从[DEFAULT]组中弃用。
开发人员影响¶
API 微版本将增加以公开新功能。将严格维护向后兼容性。
驱动程序影响¶
预计不会进行第三方驱动程序更改。可用区配置更改将在基本的共享驱动程序中以通用方式进行。所有其他提出的更改不会直接影响共享驱动程序。
实现¶
负责人¶
- 主要负责人
- gouthamr
工作项¶
将配置选项
storage_availability_zone移动到驱动程序/后端部分修改导出位置 API 并引入共享副本导出位置 API。
添加支持在共享类型中配置
availability_zones在共享和共享组创建阶段,根据可用区过滤 UI 中的共享类型,反之亦然。
依赖项¶
无
测试¶
将添加/维护单元测试覆盖率,如社区标准所述。将修改/添加 Tempest 测试以涵盖新的 API 更改。允许在单个多后端风格的配置文件中使用多个 AZ 将简化测试环境设置。DevStack 插件已经支持多后端,无需对插件或调用它的脚本进行重大更改即可支持多 AZ。
将修改虚拟驱动程序和 LVM 驱动程序作业配置在网关上以支持单个 share-manager 服务上的多个可用区。
文档影响¶
以下 OpenStack 文档将更新以反映此更改
用户指南:记录导出位置 API、CLI 和 GUI 的变更,以及共享类型的变更
管理员指南:记录支持每个共享管理器服务多个可用区背后的理论。
API 参考:所有 API 变更都将被记录
Manila 开发人员参考:此功能的底层实现考虑和设计将被记录。