本作品采用知识共享署名 3.0 非移植许可协议授权。 http://creativecommons.org/licenses/by/3.0/legalcode
Zone Exists Event¶
https://blueprints.launchpad.net/designate/+spec/zone-exists-event
问题描述¶
Designate 为 Ceilometer 的计量和计费目的发出多个事件。目前,这些事件是针对区域/资源记录集/等的创建、更新和删除操作发送的。由于这些事件是通过 RabbitMQ 发送的,我们无法保证传递。为了确保客户的准确计费,我们需要提供一种识别“丢失”事件的机制。这对于区域创建/删除事件尤其重要,因为按区域/时间段是最常见的计费单位。
解决创建/删除事件丢失的常用标准方法是每个服务发出一个周期性的“存在”事件,这允许 Ceilometer 例如识别连续 N 个存在事件未被接收,从而推断出“删除”事件被遗漏了。
在 Nova 等其他服务中,每个核心资源都有一个明确的“所有者”(例如,实例由其所在的计算节点拥有),这允许每个 nova-compute 实例周期性地为少量实例发出一个 compute.instance.exists 事件。Designate 没有这样的明确所有者,并且成千上万个区域可能属于单个池(我们当前可用的最小分组)。这构成了一个问题,即每小时发出数十万个或更多事件可能对活动池管理器来说过于繁重。
提议的变更¶
我们将引入一个新的服务 designate-zone-manager,它将处理与负责的区域相关的所有周期性任务。最初,这将仅是周期性的 dns.domain.exists 事件,但随着时间的推移,我们将添加其他任务,例如在刷新间隔处轮询辅助区域。
将引入“区域分片”的概念,其中每个区域将根据区域 UUID 的前三个字符分配给一个分片。这将为 4,096 个不同的分片提供分布在可用的 designate-zone-manager 进程上,确保单个 designate-zone-manager 不负责超出其合理处理能力范围的区域数量。对于 500 万个区域,每个分片应包含大约 1.2k 个区域。
最后,分片到可用 designate-zone-manager 进程的分配将由 OpenStack Tooz 库处理。Tooz 提供了实现“分区器”所需的构建块,使用其组会员 API 将可用分片分配给活动工作者,包括根据会员关系变化动态重新分配。
API 变更¶
无
Central 变更¶
无
Storage 变更¶
将在域、资源记录集和记录表中添加一列,该列将由存储驱动程序填充,其中包含 UUID 前 3 个字符的整数表示形式,从而提供一个介于 0 和 4095 之间的整数。我们现在将分片添加到资源记录集/记录表中,因为我们知道它将在未来的蓝图中使用(ALIAS 记录)。
域表添加¶
行 |
类型 |
可为空? |
唯一? |
|---|---|---|---|
shard |
int(2) |
否 |
否 |
资源记录集/记录表添加¶
行 |
类型 |
可为空? |
唯一? |
|---|---|---|---|
domain_shard |
int(2) |
否 |
否 |
其他变更¶
将引入一个新的服务 designate-zone-manager。该服务将扩展 Designate 基本 Service 类,但不包含典型的 RPCService mixin。对于此初始用例,不需要 RPC API。
该服务将使用现有的 oslo-incubator ThreadGroup.add_timer() 方法来调度任务,并使用 tooz 库进行组会员管理。
计时器间隔将作为配置值公开,默认值为 3600 秒。该间隔将独立于此服务未来引入的任何其他计时器。
组会员管理将作为 Service mixin 实现,类似于 RPCService,允许将其包含在其他服务中,例如 designate-pool-manager。
dns.domain.exists 事件格式将与域创建/更新/删除事件格式相同,唯一的区别是事件名称。
最后,每个 designate-zone-manager 负责的区域列表将在每个计时器间隔的开始处收集,以可配置的大小进行批量处理,基于分配的分片范围。
实现¶
负责人¶
- 主要负责人
Endre Karlson
里程碑¶
- 完成目标里程碑
Liberty-2
工作项¶
基于 Tooz 实现“分区器”
实现 GroupMembership mixin(名称待定)
创建新的 designate-zone-manager 服务
实现周期性存在事件
依赖项¶
需要将 OpenStack Tooz 库添加到我们的需求中
需要 OpenStack Tooz 库的基础设施(memcache、redis 或 zookeeper)