将 Tooz 作为服务协调

https://storyboard.openstack.org/#!/story/2001842

本规范是 ironic-inspector HA 工作的一部分。为了进一步拆分 inspector 服务,本规范建议引入 tooz 作为 ironic-inspector API 和 conductor 服务之间协调的基础服务。

问题描述

基于之前的工作,单个进程的 ironic-inspector 在逻辑上被拆分为两个服务,均在 oslo.service 下运行,即 ironic_inspectorironic-inspector-conductor

目前功能测试使用假的 messaging 驱动,这仅适用于单个进程。为了将两个服务拆分为两个进程,我们需要在将两个服务拆分为各自的可执行文件之前解决这个问题。我们可以为功能测试环境添加 rabbitmq 支持,或者引入另一种 messaging 机制,例如 json-rpc。由于 etcd 已经是 OpenStack 基础服务,社区更倾向于后者。

即使服务被拆分,我们仍然面临服务协调的挑战。对于多个 inspector conductor 服务,我们需要一种方法来防止对同一节点进行并发操作的竞争,或者选择将请求传递给哪个 inspector conductor。

提议的变更

tooz 1 作为服务协调的项目需求。tooz 通过驱动程序 2 支持各种后端,提供分布式锁、组成员管理等功能。

etcd 3 是一个分布式键值存储,它提供了一种可靠的方式来跨机器集群存储数据。etcd 是 tooz 支持的后端驱动程序,也是 OpenStack 平台的基石服务 4。请注意,tooz 仅支持 ETCD API v3 进行组管理,要将 etcd 作为后端驱动程序使用,需要诸如 python-etcd3python-etcd3gw 之类的库。

所有提出的工作都通过 tooz 接口实现。每个服务将创建一个协调器并保持心跳,以下是 ironic-inspector API 服务的示例工作流程

  1. 使用主机名创建一个协调器

  2. 创建一个预定义的组,如果该组已存在则跳过。默认组名称为 ironic_inspector.service_group

  3. 对于每个 API 请求,API 服务将从该组中查询成员,随机选择一个 conductor 并通过 rpc 机制将请求传递给它。

以下是 ironic-inspector conductor 服务的示例工作流程

  1. 使用主机名创建一个协调器

  2. 将预定义的组作为成员加入,默认组名称为 ironic_inspector.service_group。如果该组不存在,则会创建它。

  3. 服务关闭时离开组。

本规范将添加一个控制台脚本 ironic-inspector-conductor 用于执行 ironic-inspector conductor 服务,并添加一个 wsgi 包装器,以便在 WSGI 容器中使用 API 服务,将自动创建一个 ironic-inspector-api-wsgi 脚本用于控制台。

为了保持向后兼容性,ironic-inspector 继续服务于单进程模式,并且目前坚持使用假的 messaging 驱动。当它变得过时时将被删除。我们预计未来会添加 json-rpc

添加一个布尔配置选项 [DEFAULT]standalone 以指定 ironic-inspector 的执行模式。当 standalone 为 True 时,ironic-inspector 脚本仅运行,而 ironic-inspector API 和 conductor 的拆分服务脚本仅在 standalone 为 False 时运行。

ironic-inspector 没有分布式锁支持,本规范将引入一个抽象锁层,并基于 tooz 实现锁支持。在规范实现后,将存在两种类型的锁:内部锁和 tooz 锁。不同锁定类型的选择由内部决定,目前未暴露给最终用户。以单进程运行的 ironic-inspector 将采用基于信号量的内部锁,否则将使用 tooz 锁。

备选方案

虽然像 ironic 一样使用数据库作为协调源完全可行,但如果使用 tooz 实现,则会更轻量级。tooz 还支持多个后端,从而在部署方面提供了更大的灵活性。

数据模型影响

无。

HTTP API 影响

无。

客户端 (CLI) 影响

无。

Ironic python agent 影响

无。

Ironic 影响

无。

性能和可扩展性影响

预计以分布式方式运行 ironic-inspector 服务将获得性能提升,以及水平可扩展性。

安全影响

无。

部署者影响

将添加一个新的配置选项 [coordination]backend_url 以支持 tooz 后端驱动程序的配置。这仅在 [DEFAULT]standalone 为 False 时使用。

开发者影响

无。

升级和向后兼容性

单个进程 ironic-inspector 服务未更改。但是,对于采用分布式 ironic-inspector 服务的安装,需要安装用于 tooz 后端驱动程序的相应库,以便 tooz 使用。例如,用于与 etcd 交互的 python3-etcd3gw,用于与 memcached 交互的 python3-pymemcache

实现

负责人

主要负责人

kaifeng - kaifeng.w@gmail.com

其他贡献者

工作项

实现提出的工作。

依赖项

tooz 是 ironic-inspector 作为分离服务运行所需的库支持。还应满足 tooz 后端驱动程序的依赖项。

测试

将由单元测试和 bifrost 覆盖。