让我们进行一次思想实验(显然,这不是一个真实的情况)。假设:
现在,我想考虑如何通过DNS在所有这些服务器之间进行负载平衡。当然,依靠轮询DNS将是自杀行为:我绝对不能在其中有数百万个A记录的单个域中。
所以这是我的想法,我想知道原则上是否可以工作。
这样做还可能存在其他问题吗?有更好的方法吗?从理论上讲,这完全不可行吗?
- 我有一个巨大的服务器群。巨大意味着:数百万个节点。
- 每个节点都不可靠:它经常会(并且将)离线,正如对等网络中的节点不断上下线。
- 每个节点都很弱(它的带宽和资源非常有限)。
- 每个服务器都是公开可访问的(所以不要担心NAT翻译器等问题)。
- 每个服务器都公开了WebSocket接口,能够通过某些协议提供一组静态资源(例如图像、视频等)。
- 我在每个页面中嵌入一个javascript代码,以连接到我的网络中的一堆服务器(例如16个)。
- 用户成功连接到其中一些对等端,选择最快的对等端,通过WebSocket加载资源,然后显示它们。
- (现在先不考虑安全性。)
- 非常紧密的超时机制允许在合理的时间内无法连接到任何客户端时回退到标准的Web服务器。
现在,我想考虑如何通过DNS在所有这些服务器之间进行负载平衡。当然,依靠轮询DNS将是自杀行为:我绝对不能在其中有数百万个A记录的单个域中。
所以这是我的想法,我想知道原则上是否可以工作。
- 我运行自己的DNS服务器,例如使用NodeJS和dnsd。
- 每次我的DNS被要求提供像something.mywebsite.com这样的子域时,它会返回一个随机的、当前在线的服务器IP地址。
- 要连接到服务器,我的网页上的脚本只需随机化子域即可。
- 我可以使用某些客户端机制缓存最后使用的子域,以便在不严格必要时利用缓存的DNS记录并避免使我的DNS服务器过度负载。
这样做还可能存在其他问题吗?有更好的方法吗?从理论上讲,这完全不可行吗?