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

指定区域池移动

https://blueprints.launchpad.net/designate/+spec/zone-move

区域移动是一项重要的功能,可能可以消除区域导出-导入时观察到的问题。

问题描述

假设,区域当前位于池 A 中,但需要移动到池 B。(例如,池 B 是另一个新的 DNS 提供商)。

目前,Designate 仅允许您创建区域导出(将是一个 Bind 格式的单个文件,其中包含区域的所有记录)和区域导入。因此,可以从一个池导出区域;从池 A 中删除;并导入到另一个池 B 中。

  • 问题在于,在此过程中需要删除区域并导入区域。

  • 大型区域导入(20-30k 条记录)可能需要几个小时,因为 Designate 会逐个创建所有记录。

因此,在区域删除但尚未导入时,在没有任何变通方法的情况下,在池/后端之间移动区域是存在问题的。此时,来自后端到 Designate-MDNS 的任何 DNS 查询将无法工作。

提议的变更

在 designate 中引入一个新的仅限管理员使用的命令 zone pool move。命令的工作方式如下

openstack zone pool move zone_id_or_name –pool_id=AN_ID_OF_POOL_B

  • Designate 服务应更新区域 pool_id 属性,类似于其他区域属性。更新后的 pool_id 将反映在 designate DB 中。如果调用该命令时没有 pool_id 参数,Designate 将重新安排区域并将其移动到不同的池(如果合适)。例如,用户可以通过更新属性并将区域移动到更高一级的服务,然后调用 move 命令,这将导致属性调度器选择合适的池。

  • DB 更新后,Designate 将创建区域的副本(也可以称为克隆),但它不应为克隆区域创建新的数据库条目。克隆区域将在目标池后端服务器(即池 B)上创建。

  • 区域传输(AXFR/IXFR)将发生,并且池 B 上的区域与 designate DB 同步。

  • 此时,区域仍然存在于池 A 中。在管理员在域名注册商处手动更改设置后,可以将其删除。这是一个手动过程。

上述建议的更改消除了区域导出以及区域删除步骤。从而加快将大型区域导入目标池的速度。

API 变更

区域移动将通过 V2 API 触发。

示例区域池移动请求

POST http://192.168.1.47/dns/v2/zones/52f42b9e-c48b-43e2-af01-180e8ed33cd0/tasks/pool_move HTTP/1.1
Host: 127.0.0.1:9001
Accept: application/json
Content-Type: application/json

{
  "pool_id": "794ccc2c-d751-44fe-b57f-8894c9f5c842"
}

Central 变更

Central 将更新请求移动的区域的 pool_id。更新后的 pool_id 将写入 DB。Central 然后克隆该区域,然后在目标池后端服务器中创建新的克隆区域。

实现

负责人

主要负责人

Kiran Pawar (kpdev in Gerrit)

依赖项