让我们做一个思想实验(显然,这不是真实的案例场景)。说:
- 我有一大群服务器。我所说的巨大是指:数百万个节点。
- 每个节点都是不可靠的:它可以(并且将会)经常离线,正常运行时间可能低至 10% 到 20%,很像节点不断上升和下降的点对点网络。
- 每个节点都很弱(它的带宽和资源非常有限)。
- 每台服务器都可以公开访问(所以不用担心 NAT 转换器等问题)。
- 每个服务器都公开一个 WebSocket 接口(interface),能够(通过某种协议(protocol))提供一组静态资源(例如,图像、视频等)。
现在,假设我想使用这个群来保持在线(静态部分)一个非常受欢迎的网站(数百万用户)。我的做法如下:
- 我在每个页面中嵌入了一个 javascript 代码以连接到我网络中的一堆服务器(比如 16 台?)。
- 用户成功连接到这些点的子集,选择最快的点,通过 WebSocket 加载资源,然后显示它们。
- (我们暂时不关心安全问题。)
- 如果无法在合理的时间内连接到任何客户端,一个非常严格的超时机制允许回退到标准网络服务器。
我用十几个同行的网络进行了实际实验,并且工作顺利。如果对等点靠近我当前的位置,从对等点加载资源实际上比从我的服务器加载资源更快。太好了。
现在,我想考虑如何使用 DNS 在所有这些服务器之间进行负载平衡。当然,依赖循环 DNS 将是自杀:我绝对不能拥有一个包含数百万条 A 记录的域。
这是我的想法,我想知道这在原则上是否可行。
- 我运行自己的 DNS 服务器,比如使用 NodeJS 和 dnsd。
- 每次我的 DNS 被要求提供像 something.mywebsite.com 这样的子域时,它会返回一个随机的、当前在线服务器的 IP。
- 为了连接到服务器,我网页上的脚本只是随机化子域。
- 我可以使用一些客户端机制来缓存最后使用的子域,这样我就可以使用缓存的 DNS 记录,避免在非绝对必要时淹没我的 DNS 服务器。
在我看来这应该可行,但我可以看到一些问题。我首先想到的是:缓存 DNS 服务器会生我的气吗?说:Google 的 4.4.4.4 将收到对我域的数百万个不同随机子域的数百万个请求。它最终会阻止它或停止响应吗?
这样做还有其他潜在的问题吗?有更好的方法吗?即使从理论上的 Angular 来看,这也是完全不可行的吗?
最佳答案
DNS 背后的核心概念是,对于您拥有的每个可寻址 IP 地址,您都有一个对应的 A 记录。这是合乎逻辑的,因为每个服务器只能有一个主机名,而 DNS 是关于主机名的。
但是,有时您不希望主机名成为人们连接的名称,因此您可以使用 CNAME,它是别名的规范名称(在这种情况下,权威中的规范)(显然调用别名可能会与 A 记录混淆)
因此,如果您正在查看 Example.com,您可能拥有
fred IN A 192.168.0.1
alice IN A 192.168.0.2
bob IN A 192.168.0.3
www IN CNAME bob.example.com
web IN CNAME www.example.com
因此,除非您实际上部署了数百万台具有唯一 IP 地址的服务器(如果是这种情况,我很好奇您从哪里获得它们以及您是谁!)但是如果您有 x 台主机并且您想要为它们提供动态连接的主机名,那么您实际上想要配置 CNAME 记录。
关于 CNAME 记录的一个有趣的部分是,您可以使用它们设置多个重定向,这样您就可以使用它们分层层次结构,这是 A 记录无法做到的。
如果您正在关注 rules of DNS无论您使用多少名称,Google 等人都没有理由有任何问题。
开始了解 DNS 复杂性的绝佳起点是 Dragonfly book
编辑添加
如果这些是互联网上的机器,那么给每个机器一个 A 记录/主机名是完全可以接受的(我假设这就是你所说的子域的意思)
没有理由不给每个 A 记录一个 CNAME 记录。
从 DNS 的 Angular 来看,我认为没有理由不能以这种方式提供负载平衡。您可能需要在发送 CNAME 记录之前进行测试,以确保端点在线。但是使用 CNAME 记录来负载平衡的概念当然不是一个新概念。即 CDN
关于javascript - 使用 DNS 和 javascript 在对等点之间进行负载平衡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34566397/