本作品采用知识共享署名 3.0 非移植许可协议授权。 http://creativecommons.org/licenses/by/3.0/legalcode

Minidns 中服务器池的支持

https://blueprints.launchpad.net/designate/+spec/server-pools-minidns-support

本文档概述了为支持池管理器而需要添加到 MiniDNS 的 API。

问题描述

  1. notify_zone_changed: 池管理器需要在区域更改时通知池服务器。它调用 mindns 来通知池服务器区域更改。

  2. 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 服务器与同一组池服务器关联是有意义的。

参数来源/验证

timeoutretry_intervalmax_retries 可能会在池管理器部分的配置文件中指定,作为初始版本。无论池管理器从哪里获取其数据,它都会将这些作为参数传递给 minidns。池管理器跟踪这些参数而不是 minidns 更有意义。

Minidns 不会对 timeoutretry_intervalmax_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

发送 SUCCESSactual_serial

actual_serial > expected_serial

发送 SUCCESSactual_serial

actual_serial < expected_serial

retry_interval 时间间隔后再次轮询。继续此操作,直到获得 expected_serial 或达到 max_retries。在 max_retries 后发送 ERRORactual_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

状态将是 SUCCESSERROR 中的一个。

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 的状态。