利用DNS服务平滑切换网络服务

假设服务域名为example.domain, 原服务器 IP 地址为A, 由于服务器迁移或 IP 更换, 新服务器 IP 地址为B, 为了保证用户无感知, 可以通过 DNS 服务平滑切换网络服务.

  1. 原服务状态, example.domain 解析到 IP 地址A
  2. 过渡状态, example.domain 解析到 IP 地址AB
  3. 新服务状态, example.domain 解析到 IP 地址B, 移除 IP 地址A

说明: 当用户获得两个解析地址时, 客户端会选择其中一个地址进行连接, 当连接失败时, 会尝试其它地址, 以此保证服务的可用性.

由于 DNS 解析存在缓存, 为了保证平滑切换, 需要在过渡状态保持一段时间, 以确保所有缓存失效.

我这里需要迁移的是 dns 服务, 可以在过渡状态中设置DNS重写, 加快迁移过程.

A 服务重写规则:

A服务重写

B 服务重写规则:

B服务重写

原迁移过程拓展为:

  1. 原服务状态, example.domain 解析到 IP 地址A
  2. 过渡状态, example.domaindns A服务中重写到AB, 在dns B服务中重写到B
  3. 新服务状态, example.domain 解析到 IP 地址B, 移除 IP 地址A

当用户仍在使用dns A服务时, 可以获得两个地址, 有一半的概率会选择dns A服务.
另外一半的概率会切换到dns B服务, dns B服务故障时切换回dns A. dns B服务未故障时, 将只会获得一个地址, 因而用户会停留在dns B服务中.
这样我们可以逐步的减少dns A服务的资源消耗, 而不是直接停止, 实现更平滑的迁移.