从另一个池或后端创建快照¶
https://blueprints.launchpad.net/manila/+spec/create-share-from-snapshot-in-another-pool-or-backend
目前大多数 Manila 驱动程序存在的一个限制是无法从源共享池以外的池中的快照创建新的共享。
考虑到某些存储后端具有将共享从快照快速克隆到另一个池或后端的能力,在 Manila 中实现此功能将大大改善用户体验。
本规范建议更改当前从快照创建新共享的设计。我们将引入一个新的调度器能力并改进现有 API 参数的行为。通过允许用户选择期望的可用区,并允许管理员优化其位置,我们可以改进我们的调度器,以实现更好的负载均衡和空间效率,同时防止错误行为。
所提改进的结果之一是,驱动程序将能够依赖于适当的调度机制,以确保从快照创建的新共享可以降落在兼容的目的地。
问题描述¶
Manila 具有调度器的配置选项 use_scheduler_creating_share_from_snapshot,该选项控制调度器是否应考虑所有可用池或仅将源池作为调度从快照创建的新共享的候选池。默认情况下禁用此选项,对于无法在源池以外的任何位置创建共享的驱动程序来说,必须以这种方式设置此选项至关重要。启用此选项后,它将允许不同的结果
新的共享快照可能降落在同一个池中。这适用于所有驱动程序。
新的共享快照可能降落在同一后端中的另一个池中。这适用于通用驱动程序,并且可能适用于其他驱动程序(我们不知道哪些)。如果不起作用,将导致驱动程序中出现错误。
新的共享快照可能降落在另一个兼容的后端中。这适用于通用驱动程序,并且不太可能适用于其他驱动程序(我们不知道哪些)。如果不起作用,将导致目标池的驱动程序中出现错误。
新的共享快照可能降落在另一个不兼容的后端中。对于 manila 中的任何驱动程序来说,这肯定行不通。
启用此选项的主要好处是,即使源共享的后端有足够的空间来处理它,调度器也可以选择不同的兼容后端来放置新的共享。为了使其正常工作,我们需要解决以下问题
保证只有兼容的后端才会收到请求;
保证当有多个兼容的后端可用时,调度器将选择最合适的后端;
在禁用该选项时,不会插入任何回归到当前行为。
用例¶
考虑到存在支持(或可能希望支持)从快照在与源共享不同的池或后端中高效创建新共享的存储后端,云管理员可能希望启用此功能,以便平衡环境中多个配置的不同兼容后端之间的空间使用情况。
此外,如果可以将在源共享的后端之外放置从快照创建的新共享,那么它也可以放置在不同的可用区中。由于可用区是面向用户的,并且已经作为 Create share API 中的一个参数包含在内,用户可以从这方面受益,以便在更靠近其应用程序的可用区中创建共享的独立副本。
从用户的角度来看,有两种不同的方式来请求从快照创建的新共享
用户未提供目标可用区。 用户未指定放置从快照创建的新共享的可用区。调度器将不会根据特定的可用区过滤后端,只会过滤掉与源共享池不兼容的后端。兼容的后端列表将根据配置的称重类进行加权。
用户提供了目标可用区。 调度器将过滤掉所有不属于用户指定的可用区的后端,以及所有与源共享池不兼容的后端。兼容的后端列表将根据配置的称重类进行加权。
提议的变更¶
如果启用了选项 use_scheduler_creating_share_from_snapshot,则提出的更改只会影响现有行为。否则,API 将跳过调度器的处理,新共享将在相同的源共享池中创建。即便如此,如果用户在禁用调度器处理的情况下指定了放置快照共享的目标可用区,API 将向用户返回有关参数错误使用的错误。
本规范提出更改,以便使此功能按预期工作
1. 更改 API 处理可用区参数的方式,当前在从快照创建新共享时会忽略该参数;
2. 创建一个新的调度器过滤器 CreateFromSnapshotFilter,以识别兼容的后端;
3. 创建一个新的称重器,以改进调度器对最佳目标池的选择;
4. 更新 Share Manager 在请求从快照创建共享时的工作流程。对于需要异步操作的情况,create_share_from_snapshot 的驱动程序接口将被更新为返回一个模型更新。
5. 创建一个新的周期性任务来跟踪和更新从快照创建的共享的状态。
为该功能提供适当的配置和指南。
所需的更改在以下子部分中详细说明。
API 语义¶
当前,在从快照创建新共享的情况下,AZ 参数会被忽略(可能是一个错误,因为它应该返回一个错误,说明不应指定不同的可用区)。启用选项 use_scheduler_creating_share_from_snapshot 后,API 需要将 AZ 参数转发到发送到调度器的请求中,否则请求将失败,并且会通知用户失败的原因。
调度器改进¶
调度器应该能够区分支持在与源共享不同的池或后端中创建新共享的驱动程序。将通过现有过滤器和已经实现属性 replication_domain 来解决此能力。
复制功能与在另一个池中创建共享的能力密切相关。如果两个或多个后端为了复制而连接,它们通常在彼此之间具有快速数据链路,一些存储供应商可以使用它在后端之间移动、复制和复制数据。
本规范建议创建一个新的过滤器 CreateFromSnapshotFilter,使用属性 replication_domain 来识别兼容的存储后端,即能够以有效方式从快照创建共享的远程池和后端。
在此提案中,认为可以相互复制数据的后端也应该能够以有效的方式在另一个池或后端中创建新的共享,而不是依赖于通用的数据复制方法。但是,驱动程序仍然需要实现机制来根据后端功能以这种方式执行此操作。
此时,该提案已经解决了过滤问题,但效率不高或性能不佳,考虑到某些支持此功能的后端必须在本地创建新的共享快照并将其移动到目标位置。此外,请考虑某些后端能够以 COW(写时复制)克隆的形式创建这些新的共享快照,而无需使用大量的额外空间。
因此,我们可以通过创建一个新的称重器来帮助从快照创建新共享时的共享放置来增强上述提案。一个新的称重器,名为 HostAffinityWeigher,将始终优先在与源池更近的位置创建从快照创建的新共享,只要它有可用空间并且可用区与源池的可用区相同。称重器将根据其与源共享位置的相对位置对兼容的后端进行分类。如果源和目标主机位于
相同的后端和池中,目标主机是完美的选择(例如,100 分)
相同的后端和不同的池中,目标主机是一个非常好的选择(例如,75 分)
不同的后端,但具有相同的可用区:目标主机是一个不错的选择(例如,50 分)
不同的后端和可用区:目标主机不是一个好的选择(例如,25 分)
即便如此,这种策略仍然无法完全解决使用的空间平衡用例,即如果未指定可用区,源池仍然会一直使用,直到用尽空间。新的称重器本身无法解决此限制,但可以通过云管理员来缓解,云管理员可以指定过滤器或优良函数来满足其自身的需求。下面提供了一个可能的配置示例
如果管理员希望在空闲容量降至 500 GiB 以下时才使用源池,他/她可以提供一个过滤器函数来避免选择该池
filter_function = “share.snapshot_id and capabilities.free_capacity_gb < 500”
如果源共享池中可用 COW 克隆,那么在同一可用区内工作时,管理员不太可能希望将新的共享放置在另一个池中。但最终,由他/她决定何时应该在创建快照共享时过滤主机。
我们可以最终结合这里提出的这些方法,并描述我们建议的调度算法改进
调度器请求将更新为包含新的过滤器和称重器函数所需的目标共享的主机位置。它将通过调度器过滤器列表提交,包括
AvailabilityZoneFilter,如果用户在创建共享时指定了可用区限制,它将排除不满足可用区限制的后端。在通过常规过滤器确定的后端范围之内,我们将其通过
CreateFromSnapshotFilter提交,以便过滤掉不满足至少一个限制的不兼容后端位于与父共享相同的后端中的池。
后端及其各自的池与父共享中设置的
replication_domain相匹配。
之后,我们将其通过常规称重器提交。如果没有有效的加权后端,我们将使用通常的
No valid host found消息报错。如果多于一个候选者,新的
HostAffinityWeigher将用于根据其与源池的接近程度对主机进行加权。
在此提案中,我们假设实现兼容后端之间复制功能的驱动程序也应该能够以不同于源共享的方式在另一个池或后端中创建新的共享。
共享管理器更新¶
在从快照创建新共享时,调用驱动程序接口 create_share_from_snapshot,并在成功情况下期望返回一个字符串或导出位置列表。但是,通过启用在另一个池或后端中从快照创建共享,可能会增加驱动程序完成请求操作所花费的时间,考虑到它可能导致不同池或后端之间的数据复制。为了避免性能影响,驱动程序接口将更新为以异步方式工作,通过返回一个模型更新来工作,该模型更新包含新共享的状态和(如果可在共享创建时可用)导出位置列表。驱动程序可以返回以下状态之一,以指示共享从快照创建的当前状态
1. STATUS_AVAILABLE:共享已在目标池上创建,并且应该有一个导出位置可用。
2. STATUS_CREATING_FROM_SNAPSHOT:共享处于 creating 状态,可能需要一些时间才能对用户可用。共享管理器将通过一个新的周期性任务定期检查此共享的状态。
为了保持向后兼容性,供应商可以抑制返回的字典中的共享状态,该共享将被认为对用户可用。
将添加一个新的中间状态 STATUS_CREATING_FROM_SNAPSHOT,以帮助共享管理器过滤仍在复制来自源快照的数据的共享。新的状态也将通过 API 提供给最终用户请求共享信息。
共享管理器将有一个新的周期性任务,负责使用驱动程序接口检查处于 STATUS_CREATING_FROM_SNAPSHOT 状态的共享是否对其状态有更新。管理器将应用对数据库的更改,并向用户通知这些更改。
备选方案¶
没有已知的替代方案可以完全解决上述用例。但是,以下替代方案可以解决当前的一些问题并部分解决用例
删除配置选项 ``use_scheduler_creating_share_from_snapshot``,从而使功能在所有驱动程序中具有限制性和一致性: 这也将删除现有功能(即使它并非始终按预期工作)。如果指定了可用区参数来从快照创建新共享,API 将更改为返回错误,说明不应指定不同的可用区。这将不会解决传播从快照创建的新共享的情况。
使用数据服务进行通用实现:这可以在一定程度上解决用例,因为它允许与数据服务兼容的驱动程序彼此无缝兼容。但是,任何驱动程序特定的优化,这些优化可以使兼容驱动程序之间的操作更高效地执行,都无法使用。如果指定了 AZ 参数但目标 AZ 中没有与源共享的驱动程序兼容的驱动程序,则可以将此方法用作主提案的回退方案。
数据模型影响¶
一个新的 progress 字段将被添加到 manila.db.sqlalchemy.models.ShareInstance 中,指示共享创建的进度。
REST API 影响¶
目前,在从快照创建新共享时,AZ 参数被错误地忽略。该提案更改了 API 行为,以使用 AZ 参数来确定从快照安排新共享的 AZ,因此 AZ 参数将不再被忽略。同样,如果请求的 AZ 与源共享的 AZ 不相同,并且配置选项 [DEFAULT]/use_scheduler_creating_share_from_snapshot 设置为 False,则 API 将返回 HTTP 400,错误请求。
驱动程序影响¶
对于不支持或不想支持该提案功能的驱动程序没有影响。如果云管理员启用了选项 use_scheduler_creating_share_from_snapshot,则调度器过滤器将保证不受支持的后端不会收到这些类型的请求。希望支持此功能的供应商需要更改其驱动程序实现以正确处理此用例。为了使其正常工作,需要一些先决条件
1. 使用配置选项 replication_domain 并将其与存储池统计信息一起提供给调度器。
2. create_share_from_snapshot 的驱动程序实现需要修改为接受与源共享池不同的目标池,并准备在需要完成共享创建的慢速复制操作时异步返回。
3. 实现一个新的驱动程序接口,get_share_status,共享管理器将使用它来定期检查从快照创建的共享的状态。驱动程序能够提供当前状态、创建进度信息(百分比值)以及变为可用的共享的导出位置。如果省略,则 STATUS_CREATING_FROM_SNAPSHOT 状态的共享的进度信息将被设置为 0%,STATUS_AVAILABLE 状态的共享的进度信息将被设置为 100%。
安全影响¶
无。
通知影响¶
引入的新调度器代码将包含在新共享从快照失败时进行调度的错误通知。这些通知的消息和代码将继续是 No valid host found。新的管理器代码将包含在以异步模式创建新共享从快照时共享状态通知。用户将被通知共享创建需要更多时间,并在共享管理器更新共享状态时收到通知。
其他最终用户影响¶
python-manilaclient 不需要任何更改。最终用户可以使用当前的 python-manilaclient 在源共享以外的 AZ 中创建新的共享从快照。
性能影响¶
性能影响应该很小。共享管理器需要定期检查驱动程序是否已完成状态等于 STATUS_CREATING_FROM_SNAPSHOT 的共享的共享创建。
其他部署者影响¶
无。
开发人员影响¶
无。
实现¶
负责人¶
- 主要负责人
dviroel
工作项¶
实现 manila 的主要补丁,包括
共享 API 调整以传递 AZ 参数;
ShareInstance 的新
progress字段将被包含,以提供共享创建的总进度。调度器的新称重器将被添加,以根据其与源共享的接近程度对主机进行评级;
调度器的新的过滤器
CreateFromSnapshotFilter将被添加,以过滤掉不兼容的后端,仅当提供源共享的snapshot_id时。共享管理器将引入新的定期检查异步操作,更新数据库中的共享状态,并通知用户共享状态更改;
新的驱动程序接口,用于检查以异步模式从快照创建的共享的更新情况。
- 测试
在 ZFSonLinux 驱动程序中实现功能,以验证在不同池上正确调度和共享创建从快照的情况。
manila-tempest-plugin 中的功能测试。
文档更新。
依赖项¶
无。
测试¶
将添加新的功能测试,以在与现有 AZ 不同的给定 AZ 中创建新的共享从快照。负面测试将检查用户请求的 AZ 是否可用,以及该操作是否与配置选项 use_scheduler_creating_share_from_snapshot 兼容。
新的测试将在配置了至少两个 AZ 的 ZFSonLinux 驱动程序上运行。鼓励在他们的第三方 CI 中实现驱动程序中新功能支持的供应商运行这些测试。
文档影响¶
将更新以下文档部分
API 参考:将更新创建共享 API 信息,添加有关在从快照创建新共享时
availability_zone参数的影响的详细信息。管理员参考:将添加有关创建共享 API 如何根据 AZ 参数在从快照创建新共享时表现的详细信息。
开发人员参考:将添加有关功能工作原理、优化和新功能的信息。
参考资料¶
[1] https://etherpad.openstack.org/p/manila-ptg-planning-denver-2018 [2] https://etherpad.openstack.org/p/manila-ptg-train [3] https://etherpad.openstack.org/p/shanghai-ptg-manila-virtual