同一 DNS 上的多个服务器的冗余

同一 DNS 上的多个服务器的冗余

我有一个域名,比如api.test.com。我还有三台服务器。

我希望它们之间有冗余,这样如果一台服务器离线,域名api.test.com就不会重定向到它,而只会重定向到其他服务器。

我发现我们可以在同一个域名上拥有多个A/AAAA记录,但它不考虑计算机是否 ping 通,只是随机给出所有可用 IP 中的一个。

我该如何实现冗余?我是否应该获取另一台重定向所有请求的服务器(例如代理)?

答案1

不,它不是这样工作的。您可以将多个类型和名称的记录配置到一个区域中。客户端通常不知道这一点;它请求特定的名称和类型(例如,浏览器请求您在地址框中输入的名称,类型为 A,AAAA)。

如果返回多条记录,它会随机选择一条并尝试连接。如果存在另一条记录,则由客户端重试连接。服务器也鼓励这种行为,每次以不同的记录顺序回答相同的查询。因此,即使某些客户端“总是选择第一个”,服务器上的随机化仍然会发生。这样就实现了负载平衡的原始形式。

特殊的 DNS 负载均衡器返回的 A 记录具有非常低的 TTL,因此它们很快就会过期;因此,服务器可以通过从回复中省略其地址来快速应对突然的负载峰值或后端节点中断。如果您尝试解析 Zoom 的视频会议服务器,就会看到这一点;他们使用了这项技术。但这需要这种特殊的软件,即 DNS 负载均衡器,来管理此名称的 DNS,而这只是故事的开始。

一般来说,如果 A 记录中收到的第一个尝试 IP 没有响应,Web 客户端通常会返回失败,即使还有其他 IP 可以尝试。有些软件确实会重试,例如 OpenVPN 可以无限重试,但这是特殊情况。


DNS 通过完全不同的机制提供冗余,同样,需要足够智能的客户端。有一种特殊类型的 DNS 记录,称为服务车辆(服务),它有4个数据字段:优先级、权重、端口、名称。

名称最简单:此 SRV 记录描述的 A 记录的名称。端口是请求的服务在该名称的服务器上所处的 TCP 或 UDP 端口。这必须是具有关联的 A 或 AAAA 记录的名称;不允许使用 CNAME。如果该名称有多个 A 或 AAAA 记录,我们将对此特定 SRV 记录采取通常的“尝试一次”DNS 行为(但客户端应尝试其他 SRV 记录(如果有的话),例如具有更高优先级值)。

权重可以更深入地控制负载平衡:如果有多条记录具有相同的优先级,则客户端应尝试根据其权重来分散负载。这通常是以概率方式完成的。

优先级是为了冗余:必须先尝试具有最低值的记录,然后是下一个优先级,依此类推。但同样,重试取决于客户端。

记录如下:

_kerberos._tcp.example.net. SRV 0 100 88 dc.example.net.

记录名称中的下划线实际上是字面上的下划线。它表示“kerberos”服务通过 TCP 在 dc.example.net 端口 88 上提供。dc.example.net 必须是 A 或 AAAA 记录。此示例来自 MS Active Directory,它严重依赖 DNS 才能正常运行,并将其用于 ldap(目录)和 kerberos(安全框架)。如果您有多个 AD 域控制器,则会有更多此类记录指向不同的 DC。

这种类型的记录用于例如 ldap、kerberos、kpasswd(kerberos 密码更改)、xmpp(jabber)、sip(ip 电话)和其他服务。

墨西哥就像是“SRV 的特例”,绑定到端口 25,只有“优先级”字段,没有“权重”。它只是一种“旧式”,是在 SRV 之前发明的(也是 SRV 的灵感来源)。它只用于电子邮件。

SRV 无法帮助您处理 Web 服务。它仅对客户端知道使用 SRV 记录来发现服务器的服务有帮助;Web 客户端从不这样做。

相关内容