本作品采用知识共享署名 3.0 非移植许可协议授权。 http://creativecommons.org/licenses/by/3.0/legalcode
Minidns 中服务器池的支持¶
https://blueprints.launchpad.net/designate/+spec/server-pools-minidns-support
本文档概述了为支持池管理器而需要添加到 MiniDNS 的 API。
问题描述¶
notify_zone_changed: 池管理器需要在区域更改时通知池服务器。它调用 mindns 来通知池服务器区域更改。
poll_for_serial_number: 当区域更改时,更改在 central 中标记为 PENDING(待处理)。当一定数量的池服务器拥有更改时,它将被标记为 ACTIVE(活动)。服务器池将使用 mindns 来检查池服务器是否存在更改。
提议的变更¶
将向 minidns 添加 2 个调用以支持池管理器所需的功能。
Mindns 调用变更¶
notify_zone_changed(context, domain, destination, timeout, retry_interval, max_retries)¶
参数 |
描述 |
必需 |
|---|---|---|
context |
用户上下文。 |
是 |
domain |
designate 域对象。 |
是 |
destination |
NOTIFY 消息的接收者。格式为“ip:[port]”。如果没有端口,则使用端口 53。 |
是 |
timeout |
等待来自 destination 的 NOTIFY 响应的时间。 |
是 |
retry_interval |
重试之间的时间间隔。 |
是 |
max_retries |
mindns 为 NOTIFY 响应尝试的最大重试次数。达到此次数后,mindns 会丢弃 NOTIFY 消息。 |
是 |
设计考虑¶
Mindns 使用 domain.name 构建 NOTIFY 消息并将其发送到 destination。如果未在 timeout 间隔内收到响应,则在 retry_interval 时间间隔后,NOTIFY 消息将重新发送到 destination。尝试 max_retries 次后,调用完成。所有时间均以秒为单位。
Cast 与 Call¶
这是一个 RPC cast 而不是 RPC call。池管理器无需等待 NOTIFY 响应。原因是,在最坏的情况下,在刷新间隔之后,destination 上的区域将被刷新。此外,状态将在其他地方正确更新,因此这不需要是一个 call。
单个调用与多个调用¶
池管理器向 (潜在的多个实例的) minidns 发送多个请求,每个请求中包含一个 destination。原因是池管理器拥有池服务器数量和需要发送的 NOTIFY 消息的全局知识。它更适合决定并行化需要发送的消息的方法。另一方面,minidns 仅关心 dns 协议。也就是说,BIND 将区域传输请求发送到发送 NOTIFY 消息的服务器。因此,将 minidns 服务器与同一组池服务器关联是有意义的。
参数来源/验证¶
timeout、retry_interval 和 max_retries 可能会在池管理器部分的配置文件中指定,作为初始版本。无论池管理器从哪里获取其数据,它都会将这些作为参数传递给 minidns。池管理器跟踪这些参数而不是 minidns 更有意义。
Minidns 不会对 timeout、retry_interval 和 max_retries 参数进行任何验证。
poll_for_serial_number(context, domain, destination, timeout, retry_interval, max_retries)¶
参数 |
描述 |
必需 |
|---|---|---|
context |
用户上下文。 |
是 |
domain |
designate 域对象。 |
是 |
destination |
要检查更新的序列号的服务器。格式为“ip:[port]”。如果没有端口,则使用端口 53。 |
是 |
timeout |
等待来自 destination 的 SOA 响应的时间。 |
是 |
retry_interval |
重试之间的时间间隔。 |
是 |
max_retries |
mindns 为预期序列号尝试的最大重试次数。达到此次数后,mindns 返回 ERROR。 |
是 |
设计考虑¶
Mindns 使用 domain.name 构建 SOA 请求并将其发送到 destination。SOA 响应中的序列号(以下称为 actual_serial)与 domain.serial(以下称为 expected_serial)进行比较。
Cast 与 Call¶
这将是一个 cast。池管理器将提供一个函数 - update_status,供 minidns 调用以告知结果。有关更多讨论,请参阅 2014 年 9 月 3 日 designate 会议记录
返回值¶
此函数返回的状态将使用池管理器回调函数 - update_status 发送到池管理器。发送的值总结如下。实际上,我们也可以只发送序列号而无需状态。
情况 |
操作 |
|---|---|
actual_serial = expected_serial |
发送 SUCCESS 和 actual_serial。 |
actual_serial > expected_serial |
发送 SUCCESS 和 actual_serial。 |
actual_serial < expected_serial |
在 retry_interval 时间间隔后再次轮询。继续此操作,直到获得 expected_serial 或达到 max_retries。在 max_retries 后发送 ERROR 和 actual_serial |
max_retries 的超时 |
发送 ERROR 和序列号 None。 |
池管理器依赖项¶
池管理器将提供一个 api - update_status,供 minidns 调用以告知 poll_for_serial_number 调用的状态。poll_for_serial_number 的 返回值 部分总结了将与 update_status 一起发送的值。如上所述,我们无需发送单独的状态,发送 actual_serial(或 None)就足够了。
update_status(context, domain, destination, status, actual_serial)¶
参数 |
描述 |
必需 |
|---|---|---|
context |
在相应的 . poll_for_serial_number 调用中传递的用户上下文 |
是 |
domain |
designate 域对象。domain.serial 具有 expected_serial 号。此对象与发送到相应 poll_for_serial_number 调用的对象相同 |
是 |
destination |
来自相应 poll_for_serial_number 调用的 destination 参数 |
是 |
status |
状态将是 SUCCESS、ERROR 中的一个。 |
是 |
actual_serial |
从 destination 接收到的实际序列号,或者在超时的情况下为 None。 |
是 |
Storage 变更¶
无
实现¶
负责人¶
- 主要负责人
<vinod-mang>
里程碑¶
- 完成目标里程碑
Kilo
工作项¶
mini-dns 的 Api 添加 - notify_zone_changed
mini-dns 的 Api 添加 - poll_for_serial_number
到池管理器的 Api(minidns 将调用此 api)- update_status
依赖项¶
池管理器需要添加 update_status,以便 minidns 告知 poll_for_serial_number 的状态。