Designate/蓝图/服务器池/归档
目录
当前状态
第一阶段
| Gerrit补丁 | [1] |
|---|---|
| Launchpad蓝图 | [2] |
概述
这是对代码库的初步更改,用于引入“服务器池”的概念
这引入了一个新的服务,它位于 bind9 的代理传统位置
这导致所有服务器和域都分配到一个“池”,我们将在未来使用它来将更改提交到正确的池。
第一阶段状态图
API v2 变更
服务器现在是池的完整子资源,并通过如下 HTTP 请求访问:
GET http://designate-server:9001/v2/pools/pool_id/servers - get all servers in <pool_id> GET http://designate-server:9001/v2/pools/pool_id/servers/server_id - get <server_id> details
这是为了避免对域的 SOA 记录进行大量更改,并允许我们通知后端 [3] 仅更改了服务器。
第一阶段限制
- 目前仅支持一个池
- 当前这是一个同步操作 - 异步将在后续阶段实现
- 当 designate 首次设置/升级时,您需要在 /etc/designate/designate.cfg 文件中设置一个默认池。
- SQLAlchemy 迁移中创建了一个默认池,因此这只是将 pool_id 复制并粘贴到配置文件中的正确部分。
下一步
第二阶段
| Gerrit补丁 | 目前 N/A |
|---|---|
| Launchpad蓝图 | [4] |
概述
作为第二阶段的一部分,我们将引入使用池管理器接口的后端异步操作的概念。
designate 的核心将进行一些更改
- 将添加一个新的表来跟踪异步操作。
- 区域序列号将移动到递增的整数(从当前日期/时间戳格式)
- API 对修改区域的操作的所有响应都将移动到 202 - Accepted。
- 区域操作的响应数据将包括一个状态字段,该字段将显示 PENDING。
- 当操作完成时,这将更改为 ACTIVE 状态
第二阶段状态图
笔记
- 这是 2 个 rpc 调用,没有返回值(oslo.messaging casts vs calls),这意味着中央不会被池管理器操作阻塞
- 这是后端仍在处理更改时的一个示例 API 调用
- 这是更改完成时的一个示例 API 调用
API v2 变更
- 更改异步操作的响应代码
数据库更改
这将记录 SQLAlchemy 实现的示例更改
附加表
- 待处理的操作
- 资源 ID - UUID
- 资源类型 - UUID
- ChangeSetSerial - Integer (此名称可能需要检查)
第三阶段
| Gerrit补丁 | 目前 N/A |
|---|---|
| Launchpad蓝图 | [5] |
概述
这需要进一步完善,但将是创建池调度器以允许多个池和按租户的池
讨论
对于第三阶段的任何想法(调度器),请在此处发布,并标记您的用户名,以便我们知道该向谁询问
- 确定在 API 中公开多少个池(artom)
- 用例示例:公共和私有池。完全透明,按租户的池在这种情况下有效(公共和私有租户)。
- 用例示例:单个租户想要多个池。除了在 API 中公开池以便他可以控制哪些区域进入哪个池之外,别无选择。
- 我们能否同时支持上述两者?
- 查看 nova 的代码,看看是否有可重用的代码(graham)
问题
- 您能添加创建/获取区域的请求会是什么样子吗?我试图理解您是在请求中指定池 ID 还是同时指定池 ID 和服务器 ID?(vinod)
- 获取区域的请求将保持不变。在第三阶段之前,创建区域的请求将保持不变 - 它们将被分配到默认池。
- 那时,对于大多数用户,我想象它仍然会保持不变,除非他们想为该域指定池。- (graham)
- 池中的每个区域是否会拥有池中的所有服务器作为 NS 记录?添加或删除/更新池中的服务器如何影响池中现有的区域?(vinod)
- 是的。它需要更改池中每个区域的 NS 记录 - (graham)
- 如何在区域文件的 SOA 记录中指定权威名称服务器?是创建区域的租户决定吗?当服务器被删除/更新时,我们是否会更新所有相关的区域?(vinod)
- 我想象它将来自池。我们必须像上面那样更新所有区域 - (graham)
- 之前上面提到“这避免了对域的 SOA 记录进行大量更改”。一个展示如何实现这一点的示例将帮助我理解这一点。(vinod)
- 与其重新创建所有服务器(删除所有并重写),不如只更改一个。这可能措辞不当,坦率地说,它应该是“大量更改”,因为更改的数量将相同,但大小更小 - (graham)
- 我们如何指定租户/池关系?任何租户是否可以创建/更新/删除任何池中的区域?(vinod)
- 未知,我需要获得人们想要什么的反馈。
- 我设想公共池,调度器会将常规区域分发到这些池,然后是私有/按租户的池,以便人们可以在 VPC 或非公共环境中拥有内部 DNS 记录 - (graham)
- 区域是否可以从一个池移动到另一个池?如果是,用户如何执行此操作 - 我们是否需要为此添加新的 API?在这种情况下,NS 服务器/SOA 记录中的权威名称服务器会如何更改?(vinod)
- 这是一个好问题。我认为这需要一些讨论。这会是一个有用的功能吗?- (graham)
- 在第二阶段图中,您显示从中央到池管理器的请求,文本为“将操作发送到正确的池管理器”。这是池 ID 还是池管理器?是否会有一个池管理器管理所有各种池/池 ID,就像一个中央服务一样,或者会有多个池管理器?(vinod)
- 不,每个池都有一个池管理器。- (graham)
- 在 Phase2 & 3 中,异步响应 (202 Accepted),当前的计划实现会在中央的 Domains 和 Records 表中添加一个“Status”字段,该字段会根据后端的响应进行更新。如果操作由于某种原因失败,我们如何返回错误详细信息?(eankutse)
- 在 Phase2 & 3 中,异步响应 (202 Accepted),我们应该考虑返回一个 Location Header,该标头指向资源的 URL(正在创建)。用户可以使用此 URL 检查操作状态。(eankutse)
- 与实现异步无关,但我们是否应该考虑遵循 https://docs.openstack.org/api/openstack-compute/2/content/LinksReferences.html 的建议,并在最终响应体中添加“self”和“bookmark”链接?(eankutse)

