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

Server Pools Manager

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

本规范概述了池管理器、中央服务、后端驱动程序和存储更改,以支持新的池管理器服务。

问题描述

在许多不同的后端之间协调 DNS 操作是困难的,尤其是在有大量 DNS 服务器的情况下。需要一个池管理器服务来管理从 Designate 数据库到许多 DNS 服务器的更改。池管理器还将跟踪这些更改的状态。当本规范实施后,将使用池管理器来管理包含多个 DNS 服务器的池,即使这些 DNS 服务器的类型不同。

提议的变更

API 变更

池管理器更改

将创建一个新的 Designate 服务,名为 designate-pool-manager。这是池管理器。池管理器将在实例化时从配置文件中获取其配置。

配置节名为 [service:pool_manager]。该节的选项是

参数

默认值

必需

注意事项

pool_name

‘default’

此池管理器实例管理的池的名称

threshold_percentage

100

域名更改被认为处于活动状态所需的服务器成功更新百分比

poll_timeout

30

等待名称服务器 NOTIFY 响应的时间

poll_retry_interval

2

重试发送 NOTIFY 请求和等待 NOTIFY 响应之间的时间间隔

poll_max_retries

3

minidns 重试发送 NOTIFY 请求和等待 NOTIFY 响应的最大次数

periodic_sync_interval

120

与存储同步服务器的时间间隔

池管理器将包含一个服务器到实例化后端驱动程序的映射。后端驱动程序将不负责读取配置信息,因为池管理器将从配置文件中读取全局后端驱动程序和服务器特定后端驱动程序节,并将后端驱动程序配置传递给后端驱动程序进行实例化。此映射将在池管理器实例化时创建。有关全局后端驱动程序和服务器特定后端驱动程序节的更多信息,请参阅存储池 - 存储规范中的后端驱动程序更改部分。

池管理器服务基类中的方法包括

create_domain(context, domain)

参数

描述

必需

context

安全上下文信息。

domain

Designate 域名对象。

返回值

无返回值。

设计考虑

循环遍历池中的每个服务器,并调用后端驱动程序以创建域名。对于每次调用后端驱动程序,状态都存储在 pool_manager_status 表中,操作为“CREATE”,并创建第二行,操作为“UPDATE”。成功的创建状态为“SUCCESS”,失败的创建状态为“ERROR”。“UPDATE”操作行没有初始状态。使用 pool_manager_status 表检查是否存在共识。如果域名中具有成功创建的服务器数量超过 threshold_percentage,则存在共识。如果存在共识,则使用创建域名时使用的序列号和状态“SUCCESS”调用 Central update_status 方法。如果不存在共识,则使用创建域名时使用的序列号和状态“ERROR”调用 Central update_status 方法。

Cast vs. Call

这是一个 RPC cast。关于域名创建状态的通信将使用 Central update_status 方法处理。

delete_domain(context, domain)

参数

描述

必需

context

安全上下文信息。

domain

Designate 域名对象。

返回值

无返回值。

设计考虑

循环遍历池中的每个服务器,并调用后端驱动程序以删除域名。对于每次调用后端驱动程序,状态都存储在 pool_manager_status 表中,操作为“DELETE”。成功的删除状态为“SUCCESS”,失败的删除状态为“ERROR”。使用 pool_manager_status 表检查是否存在共识。如果域名中具有成功删除的服务器数量超过 threshold_percentage,则存在共识。如果存在共识,则使用删除域名时使用的序列号和状态“SUCCESS”调用 Central update_status 方法。如果不存在共识,则使用创建域名时使用的序列号和状态“ERROR”调用 Central update_status 方法。

Cast vs. Call

这是一个 RPC cast。关于域名删除状态的通信将使用 Central update_status 方法处理。

update_domain(context, domain)

参数

描述

必需

context

安全上下文信息。

domain

Designate 域名对象。

返回值

无返回值。

设计考虑

循环遍历池中的每个服务器,并调用 minidns notify_zone_changed 方法。再次循环遍历每个服务器,并调用 minidns poll_for_serial_number 方法。

Cast vs. Call

这是一个 RPC cast。关于域名更新状态的通信将使用 Pool Manager update_status 方法调用的 Central update_status 方法处理。minidns poll_for_serial_number 方法在完成时调用 Pool Manager update_status 方法。

update_status(context, domain, name_server, status, serial_number)

参数

描述

必需

context

安全上下文信息。

domain

Designate 域名对象。

name_server

适用于此序列号的名称服务器。

status

状态,“SUCCESS”或“ERROR”。

serial_number

从名称服务器接收的域的序列号。

返回值

无返回值。

设计考虑

从 pool_manager_status 表读取服务器和域的现有序列号。如果新的序列号 > 现有序列号,则更新该行并使用 pool_manager_status 表检查是否存在共识。如果域名中具有序列号 > 现有序列号的服务器数量超过 threshold_percentage,则存在共识。从序列号最低的服务器开始,直到实现基于 threshold_percentage 实现共识所需的最低服务器数量,服务器将不再参与共识。如果现有序列号 < 所有剩余服务器的序列号,则使用这些剩余服务器的最低(共识)序列号和状态“SUCCESS”调用 Central update_status 方法。

如果 > 100 - threshold_percentage 域的服务器状态为“ERROR”,则使用大于上述计算的共识序列号的最低序列号和状态“ERROR”调用 Central update_status 方法。

Cast vs. Call

这是一个 RPC cast。

periodic_sync()

返回值

无返回值。

设计考虑

此方法是在实例化池管理器时创建的线程。该线程的目的是读取 pool_manager_status 表并执行失败的创建、删除和更新操作。此外,该线程将为每个域和服务器调用 minidns poll_for_serial_number 方法,以确保服务器与存储同步。

period_sync_interval,此线程将执行以下操作

读取 pool_manager_status 表,查找按域名分组并按行创建时间排序的“CREATE”操作,状态为“ERROR”。检查域名创建是否已存在共识。循环遍历具有失败创建的每个服务器,使用后端驱动程序尝试创建。如果尚未存在共识,则检查共识并调用 Central update_status(如果达到共识)。

读取 pool_manager_status 表,查找按域名分组并按行创建时间排序的“DELETE”操作,状态为“ERROR”。检查域名删除是否已存在共识。循环遍历具有失败删除的每个服务器,使用后端驱动程序尝试删除。如果尚未存在共识,则检查共识并调用 Central update_status(如果达到共识)。

对于池中的每个域名,从存储读取域的序列号。循环遍历池中的每个服务器,并读取 pool_manager_status 表,查找序列号 < 域序列号的域的“UPDATE”操作,并调用 minidns notify_zone_changed 方法。

最后,对于池中的每个域名,从存储读取域的序列号。循环遍历池中的每个服务器,并调用 minidns poll_for_serial_number 方法。

Central 变更

Central 服务将更新为使用池管理器而不是后端驱动程序。此外,将从 Designate 配置的 [service:central] 部分删除 default_pool_name 选项。

所有域名最初将处于“PENDING”状态,池管理器对 Central update_status 方法的调用将更改状态。

在创建、更新或删除记录时,记录的 serial_number 字段将设置为域的新序列号。任务将为“ADD”、“DELETE”或“UPDATE”,对应于操作。状态将为“PENDING”。

有效的记录状态是

task

status

‘ADD’

‘PENDING’

‘ADD’

‘ERROR’

‘DELETE’

‘PENDING’

‘DELETE’

‘ERROR’

‘UPDATE’

‘PENDING’

‘UPDATE’

‘ERROR’

‘NONE’

‘ACTIVE’

‘NONE’

‘DELETED’

Central 服务中的受影响代码将相应更新,以与这些状态保持一致。

更新状态所需的新的方法是

update_status(context, domain, status, serial_number)

参数

描述

必需

context

安全上下文信息。

domain

Designate 域名对象。

status

状态,“SUCCESS”或“ERROR”。

serial_number

域的共识序列号。

返回值

无返回值。

设计考虑

如果状态为“SUCCESS”

检查域的状态,如果状态为“PENDING”或“ERROR”,则将状态设置为“ACTIVE”。

检查域的记录状态。如果它们具有“ADD”或“UPDATE”任务,状态为“PENDING”或“ERROR”,则将任务设置为“NONE”,如果共识序列号 >= serial_number 字段,则将状态设置为“ACTIVE”。

检查域的记录状态。如果它们具有“DELETE”任务,状态为“PENDING”或“ERROR”,则将任务设置为“NONE”,如果共识序列号 >= serial_number 字段,则将状态设置为“DELETED”。

如果状态为“ERROR”

检查域的状态,如果状态为“PENDING”,则将状态设置为“ERROR”。

检查域的记录状态。如果它们具有“PENDING”状态,如果共识序列号 >= serial_number 字段,则将状态设置为“ERROR”。

Cast vs. Call

这是一个 RPC 调用。

后端驱动程序更改

后端驱动程序现在将使用池管理器提供的的信息进行实例化,如池管理器更改部分所述。这是必要的,因为服务器特定的后端驱动程序配置。

后端驱动程序将继续支持它们当前所拥有的相同的配置选项,只有节名称将更改为添加服务器的通配符限定符。例如,PowerDNS 的后端驱动程序节现在将为 [backend:powerdns:*]。此语法将表示后端驱动程序的全局配置。这样做是为了允许服务器特定的后端驱动程序配置。

新的服务器特定的后端驱动程序节在配置中将为 [backend:powerdns:<uuid>],其中 uuid 是通用唯一标识符。

该节的选项是

参数

默认值

必需

注意事项

host

DNS 服务器的主机名或 IP 地址

port

53

DNS 服务器的端口

tsig_key

DNS 服务器的 TSIG 密钥

除了上述选项外,服务器特定的后端驱动程序节将支持与后端驱动程序全局节相同的选项。如果这些选项未包含在服务器特定的后端驱动程序节中,服务器配置将默认使用全局配置选项。这些服务器特定的后端驱动程序节将支持同一池中的不同后端。

将实现服务器对象。服务器对象封装了配置中服务器特定的后端驱动程序节。

后端驱动程序中将不再使用以下方法

  • create_tsigkey(tsigkey)

  • update_tsigkey(tsigkey)

  • delete_tsigkey(tsigkey)

这是因为最初支持的唯一配置程序是“unmanaged”配置程序。这些方法将在未来的配置程序中使用。

Storage 变更

需要一个新的池管理器状态表。此外,将修改域和记录表以支持池。域和记录最初将处于“PENDING”状态。域和记录可以具有新的状态“ERROR”。最后,记录也可以是“DELETE_PENDING”和“DELETE_ERROR”。

新表 - pool_manager_status

类型

可为空?

唯一?

注意事项

id

CHAR(32)

PK

updated_at

DATETIME

上次更新的 UTC 时间

server_id

VARCHAR(32)

服务器 ID

domain_id

CHAR(32)

FK 到域表中的 ID

status

‘SUCCESS’、‘ERROR’

状态

serial_number

INT(11)

状态时的序列号

操作

‘CREATE’、‘DELETE’、‘UPDATE’

导致状态的操作

修改表 - domains

类型

可为空?

唯一?

默认值

注意事项

操作

status

‘ACTIVE’、‘PENDING’、‘DELETED’、‘ERROR’

‘PENDING’

记录状态

update

修改表 - records

类型

可为空?

唯一?

默认值

注意事项

操作

serial_number

INT(11)

用于记录状态

添加

task

‘ADD’、‘DELETE’、‘UPDATE’、‘NONE’

‘ADD’

记录操作任务

添加

status

‘ACTIVE’、‘PENDING’、‘DELETED’、‘ERROR’

‘PENDING’

记录状态

update

其他变更

替代方案

实现

负责人

主要负责人

https://launchpad.net/~rjrjr

附加负责人

https://launchpad.net/~darshan104

里程碑

完成目标里程碑

Kilo-1

工作项

  • 池管理器更改

  • 中央服务更改

  • 后端驱动程序更改

  • 存储更改

依赖项

本规范依赖于服务器池 - 存储规范。本规范依赖于服务器池 - MiniDNS 支持规范。