当 DBMS 在故障后故障转移时,如果它故障转移到不同且不相关的数据中心中的服务器,则该数据库的子域名的 IP 地址将需要在该名称的 DNS 服务器中更改,并且由于 DNS传播延迟,世界上所有的 DNS 服务器可能需要几天的时间才能获得新主服务器的 IP 地址,在此期间,一些客户端仍会尝试访问旧主服务器。除了更改客户端软件以从某个地方获取主服务器的 IP 地址之外,可以做些什么来处理这个问题,或者这是唯一的选择?谢谢。
当 DBMS 在故障后故障转移时,如果它故障转移到不同且不相关的数据中心中的服务器,则该数据库的子域名的 IP 地址将需要在该名称的 DNS 服务器中更改,并且由于 DNS传播延迟,世界上所有的 DNS 服务器可能需要几天的时间才能获得新主服务器的 IP 地址,在此期间,一些客户端仍会尝试访问旧主服务器。除了更改客户端软件以从某个地方获取主服务器的 IP 地址之外,可以做些什么来处理这个问题,或者这是唯一的选择?谢谢。
在 SQL Server 中,可用性组侦听器的默认行为是向 DNS 注册所有子网中的所有IP。虽然 DNS 将所有 IP 附加到侦听器的A Record,但只有当前主节点的正确子网中的 IP 将在线。其他 IP 将在 DNS 中作为网络名称,但对于任何实际主机实际上不会在线/可解析。
在默认配置下,多子网 AG 要求连接到它们的客户端包含
MultiSubnetFailover=true
作为连接字符串属性。此属性告诉驱动程序期望 DNS 为侦听器名称提供多个 IP 地址,并尝试所有这些地址以找到要连接到该网络名称的正确 IP。未指定此属性的客户端将获得多个 IP,但不知道如何正确处理它们——大多数驱动程序会随机选择一个返回的 IP (或者可能只是看似随机),并尝试连接到该 IP。当它选择错误的 IP 时,这可能会导致随机(或看似随机)的连接失败。发生故障转移时,DNS 记录不会更改。相反,在线和响应请求的 IP 将会改变。前一个主 IP 将下线并停止响应,另一个 IP 将在新子网中上线,并开始处理流量。这就是为什么客户端
MultiSubnetFailover=true
连接字符串属性是必要的。客户的司机需要知道如何处理这个问题。您可以关闭此行为,以便 DNS 一次只注册一个 IP 地址,或者甚至创建两个侦听器,以便一个使用默认行为,另一个一次注册一个 IP。使用单 IP 侦听器时,您确实需要等待 TTL 过期,并且在客户端注意到故障转移并能够重新连接之前传播 DNS 更新。在这种情况下,您可能希望将 TTL 设置得足够低,以使停机时间可以接受。调整 TTL 最终是您可以拉动的杠杆,以防止 DNS 传播花费数天时间。