希望您能帮上忙。提前致谢。
我在 Azure 上有一个 Azure 私有 DNS,它连接到 2 个区域中的 4 个 Vnet。我读到我可以在单个 A 记录中放置 2 个 IP(例如 A 记录名称 sql.midomain.local IP1 192.168.1.1 / 192.168.2.1)。
我原本以为如果虚拟机 IP1 关闭,客户端可以解析到 IP2,但事实并非如此。当我对“sql.domain.local”执行 ping 时,它总是解析到 IP1,尽管该虚拟机已关闭。
我需要这个,因为如果区域 1 中的实例 SQL1 关闭,客户端仍然连接到区域 2 中的复制 VM,我需要更多的弹性。Azure 上的内部负载均衡器确实支持这一点,但我不想在我的 SQL 上放置公共 IP 来使用外部负载均衡。
有什么想法我该如何实现这个目标吗?
PD:重要的是要知道所有虚拟网络都可以通过虚拟网络对等互连来互相访问。我可以访问任何虚拟网络中的任何虚拟机。
答案1
我读到我可以将 2 个 IP 放在一个 A 记录中
不,您可以创建具有相同名称和不同值的多个 A(或 CNAME、TXT、MX)记录。
我原本以为如果虚拟机 IP1 关闭,客户端可以解析到 IP2,但事实并非如此。当我对“sql.domain.local”执行 ping 时,它总是解析到 IP1,尽管此虚拟机已关闭
当给定名称有多个地址时,客户端应该依次尝试。这在RFC 1794。Ping 是一种低级诊断工具;我需要做一些重要的研究来确定他在这里的行为是故意的、不合时宜的还是仅仅是有缺陷的。
浏览器的工作方式非常不同 - 循环 DNS (rrDNS) 是一种非常有效的工具,可以支持 HTTP[s] 服务的高可用性。但这是因为它们使用以下方式实现故障检测:很多比其他 TCP 客户端的超时时间更短(<1 秒)。大多数操作系统上的默认 TCP 配置的故障检测超时时间为 5 分钟或更长。这也预先假设 TCP 客户端完全符合 RFC 标准。根据我的经验,Java(或者可能是在 Java 上运行的应用程序代码)无法按预期处理 DNS 解析。
为外部客户端提供 HA 访问的一种昂贵替代方案是通过 TCP 多路径。IME 有 2 个不同的提供商,故障转移检测/切换至少需要 3 分钟,有时根本不会发生。
虽然它是为外部客户端提供高可用性的绝佳解决方案,但我不会使用 rrDNS 作为为给定基础设施内节点之间的连接提供高可用性的手段。
但我不想在我的 SQL 上放置公共 IP 来使用外部负载平衡
不将 DBMS 服务器暴露在公共地址上是明智的。这并不意味着您不能通过其他方式连接它们。事实上,如果您的 DBMS 上有事务数据,那么您真的真的需要能够确保数据库节点之间的通信。如果可以通过 vnet 对等连接实现,并且您的应用程序不支持 initrinsic HA 客户端功能,请查看 haproxy 或 ProxySQL。
另一方面,您可能会发现您的应用程序对应用程序服务器和 DBMS 之间的延迟有些敏感(例如,如果使用简单的 ORM)。在这种情况下,允许位置“A”中的应用程序服务器连接到位置“B”中的 DBMS 是不可取的 - 在这里,rrDNS 到隔离堆栈可以部分解决问题,但您还需要考虑会话管理和故障转移/故障恢复期间的数据复制。
答案2
当我对“sql.domain.local”执行 ping 操作时,它始终解析为 IP1,尽管该虚拟机已关闭。
这是很自然的,因为操作系统会在 DNS 服务器指定的 TTL 时间内缓存解析后的 IP 地址。
DNS 具有循环机制,每次客户端直接从该服务器询问时都会轮换答案,但它不是为像您这样的故障转移场景设计的。我不知道您的环境,但一般来说我建议使用反向代理。