扩展 Swift 集群操作¶
当前的 Swift charms 支持的集群操作仅为 Swift 集群的长期维护所需操作的一个子集。本规范建议扩展现有功能,以支持更关键的操作,例如部署后重新配置 rings。
问题描述¶
要使用 OpenStack charms 部署 Swift 对象存储,您需要同时部署 swift-proxy 和 swift-storage charms。swift-proxy charm 执行两个关键角色——运行 api 端点服务和管理 rings——而 swift-storage charm 负责运行 Swift 对象存储服务(account、container、object)。
目前,这些 charms 支持维护 Swift 集群所需的基本功能集。
部署具有可配置 min-part-hours、副本数、partition-power 和块存储设备的 Swift 集群。
部署后,唯一可以进行的更改是添加块设备和修改 min-part-hours。一旦 rings 已经初始化,对 partition-power 或副本数的更改将被 charms 忽略。
这迫使操作员手动应用更改,例如调整 partition-power 以适应添加到集群的额外存储。这存在很大的风险,因为手动编辑 rings/builders 并将其在集群中同步可能会与 swift-proxy charm 本身对执行此操作的支持相冲突,从而导致集群损坏。
提议的变更¶
这里的建议是扩展 charms 对 ring 管理的支持,以便能够支持更改 partition-power、副本数以及可能其他的设置,并让 charms 安全且自动地应用这些更改并分发到整个集群。
目前,我们检查 rings 是否已经初始化,如果是,则忽略 charms 中配置的 partition power 和副本数,即更改不会应用。为了使之成为可能,我们需要删除这些阻止,并实现 [0] 和 [1] 中记录的步骤。我还建议 charms 施加集群大小限制(设备数量),超过此限制,我们拒绝进行更改,直到操作员暂停 swift-proxy units,即将其置于“维护模式”,这将关闭 api 服务并阻止任何重启,直到 units 恢复。用户还可以选择设置 disable-ring-balance=true,如果他们想检查他们的更改是否已成功应用(到 builder 文件),然后再重建 rings 并将其在集群中同步。
对于 swift-storage charms,目前只能添加设备,而不能删除,建议支持删除设备。这将涉及向存储关系上的 swift-proxy 发送更新的设备列表,以及一个新的设置 ‘purge-missing-devices’,以指示 swift-proxy 从 ring 中删除不再配置的设备。我们还需要确保位于 swift-storage unit 上的设备缓存,我们正在从中删除设备,也需要更新,以不再包含该设备,因为不这样做会阻止将来重新添加该设备。作为对此的扩展,我们还应该扩展 swift-storage-relation-broken,以支持删除与该 unit/host 关联的 rings 中的设备并同步这些更改到整个集群。
[0] https://docs.openstack.org/swift/latest/ring_partpower.html [1] https://docs.openstack.org/swift/latest/admin/objectstorage-ringbuilder.html#replica-counts
备选方案¶
Juju charm actions 是实现对集群执行的操作操作的另一种方式,但不一定适用于所有情况。由于 ring 管理是现有 charms(hook)代码的核心,因此建议扩展此代码,而不是将其移动和重写为 action。但是,可能需要定义一些 action 作为修改后检查和清理,这些操作非常适合 action,并且不直接依赖于 charms ring manager。
实现¶
负责人¶
- 主要负责人
hopem
Gerrit Topic¶
对于与此规范相关的所有补丁,请使用 Gerrit topic swift-charm-extended-operations。
git-review -t swift-charm-extended-operations
工作项¶
添加支持修改 partition-power
添加支持修改副本数
添加支持删除设备
添加支持删除整个 swift-storage host
仓库¶
无
文档¶
以上所有添加都需要在 charms 部署指南中进行适当的记录。
安全性¶
无
测试¶
每个额外的支持级别都需要对使用 charms 部署的包含数据且规模合理的真实 Swift 对象存储进行非常彻底的测试。所有代码更改都将伴随单元测试,并在可能的情况下进行功能测试。
依赖项¶
无