使用DNS和javascript

时间:2016-01-02 13:25:55

标签: javascript caching dns

让我们做一个思想实验(显然,这不是一个真实的案例)。说:

  • 我有一大堆服务器。我的意思是:数百万个节点。
  • 每个节点都不可靠:它可以(并且将会)经常脱机,正常运行时间可能低至10%到20%,这与点对点网络非常相似,节点不断上下起伏。
  • 每个节点都很弱(带宽和资源非常有限)。
  • 每个服务器都可公开访问(因此不必担心NAT转换器等)。
  • 每个服务器都公开一个WebSocket接口,能够(通过某些协议)提供一组静态资源(比如图像,视频等)。

现在,假设我想使用这个群体来保持一个非常受欢迎的网站(数百万用户)的在线(静态部分)。我的工作如下:

  • 我在每个页面中嵌入了一个javascript代码,以连接到我网络中的一堆服务器(例如,16?)。
  • 用户成功连接到某些对等体的子集,选择最快的对等体,通过WebSocket加载资源,然后显示它们。
  • (现在不要关心安全问题。)
  • 如果在合理的时间内无法连接到任何客户端,则非常严格的超时机制允许回退到标准Web服务器上。

我用十几个同行的网络做了一个实际的实验,并且工作顺利。如果对等体接近我当前的位置,从对等体加载资源实际上比从我的服务器加载更快。太好了。

现在,我想如何使用DNS在所有这些服务器之间进行负载平衡。当然,依靠循环DNS将是一种自杀:我绝对不能拥有一个拥有数百万条A记录的单一域名。

所以这是我的想法,我想知道原则上这是否可行。

  • 我运行自己的DNS服务器,比如NodeJS和dnsd。
  • 每当我的DNS被要求提供像something.mywebsite.com这样的子域名时,它都会返回一个随机的当前在线服务器的IP。
  • 要连接到服务器,我网页上的脚本只是随机化子域名。
  • 我可以使用一些客户端机制来缓存最后使用的子域,这样我就可以利用缓存的DNS记录,避免在严格必要时让我的DNS服务器泛滥。

在我看来这应该有效,但我可以看到一些问题。我想到的第一个问题是:缓存DNS服务器会对我生气吗?说:Google的4.4.4.4将向我的域的数百万个不同的随机子域收到数百万个请求。它会最终阻止它还是停止响应或什么?

这样做还有其他问题吗?有更好的方法吗?即使从理论的角度来看,这是完全不可行的吗?

1 个答案:

答案 0 :(得分:1)

DNS背后的核心概念是,对于您拥有的每个可寻址IP地址,您都有相应的A记录。这符合逻辑,因为每个服务器只能有一个主机名,而DNS则是关于主机名。

但是,有时您不希望主机名成为人们连接的名称,因此您可以使用CNAME,它是Alias的Canonical名称(在这种情况下,在authorative中是规范的)(显然称那些别名可能会与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,则谷歌等人没有理由对您使用的名称有任何问题。

开始了解DNS复杂性的一个好地方是Dragonfly book

已编辑添加

如果这些是互联网上的机器,那么给每个人提供A记录/主机名是完全可以接受的(我假设这是你所说的子域名)

没有理由说你不能给每条A记录一个CNAME记录。

从DNS的角度来看,我认为没有理由不通过这种方式提供负载均衡。您可能希望在发送CNAME记录之前进行测试,以确保端点处于联机状态。但是,使用CNAME记录进行负载平衡的概念当然不是一个新概念。即CDN