使用DNS和javascript的对等方之间的负载平衡

使用DNS和javascript的对等方之间的负载平衡,javascript,caching,dns,Javascript,Caching,Dns,让我们做一个思维实验(显然,这不是一个真实的案例场景)。说: 我有一大群服务器。我指的是:数百万个节点 每个节点都是不可靠的:它可以(也将)经常脱机,正常运行时间可能低至10%到20%,非常类似于节点不断上下移动的对等网络 每个节点都很弱(它的带宽和资源非常有限) 每个服务器都是可公开访问的(所以不用担心NAT转换器等) 每台服务器都公开一个WebSocket接口,能够(通过某种协议)提供一组静态资源(如图像、视频等) 现在,假设我想使用这个swarm来保持一个非常流行的网站(数百万用户)的

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

  • 我有一大群服务器。我指的是:数百万个节点
  • 每个节点都是不可靠的:它可以(也将)经常脱机,正常运行时间可能低至10%到20%,非常类似于节点不断上下移动的对等网络
  • 每个节点都很弱(它的带宽和资源非常有限)
  • 每个服务器都是可公开访问的(所以不用担心NAT转换器等)
  • 每台服务器都公开一个WebSocket接口,能够(通过某种协议)提供一组静态资源(如图像、视频等)
现在,假设我想使用这个swarm来保持一个非常流行的网站(数百万用户)的在线(静态部分)。我的工作如下:

  • 我在每个页面中嵌入一个javascript代码,以连接到网络中的一组服务器(比如说,16?)
  • 用户成功地连接到这些对等点的子集,选择最快的对等点,通过WebSocket加载资源,然后显示它们
  • (让我们暂时不要关心安全问题。)
  • 如果无法在合理的时间内连接到任何客户机,则非常紧凑的超时机制允许在标准web服务器上回退
我在一个由十几个同龄人组成的网络上做了一个实际的实验,结果很顺利。如果对等点靠近我的当前位置,则从对等点加载资源实际上比从我的服务器加载快。太好了

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

这是我的想法,我想知道这在原则上是否可行

  • 我使用NodeJS和dnsd运行自己的DNS服务器
  • 每次我的DNS被要求提供一个子域,比如something.mywebsite.com,它都会返回一个随机的、当前在线服务器的IP
  • 为了连接到服务器,我网页上的脚本只是随机化子域
  • 我可以使用一些客户端机制来缓存最后使用的子域,这样我就可以利用缓存的DNS记录,避免在没有严格必要时让DNS服务器被淹没
在我看来,这应该行得通,但我可以看到一些问题。我首先想到的是:缓存DNS服务器会对我生气吗?比如说:谷歌的4.4.4.4将收到数百万个对我的域名中数百万个不同的随机子域的请求。它最终会阻止它还是停止响应或其他什么


这样做是否存在其他潜在问题?有更好的方法吗?从理论上讲,这完全不可行吗?

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

但是,有时您不希望主机名是人们连接到的名称,因此您会使用CNAME作为别名的规范名称(在本例中,是Authorive中的规范名称)(显然,将这些名称称为别名可能会与记录混淆)

因此,如果您正在查看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记录的一个有趣的部分是,您可以使用它们设置多个重定向,这样您就可以使用它们分层,这是使用记录无法做到的

如果你遵循了这个原则,那么谷歌等没有理由对你使用的名字有任何问题

开始理解DNS的复杂性的一个好地方是

编辑以添加

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

没有理由不给每个记录一个CNAME记录


从DNS的角度来看,我认为没有理由不能以这种方式提供负载平衡。您可能需要在发送CNAME记录之前进行测试,以确保端点处于联机状态。但是使用CNAME记录进行负载平衡的概念肯定不是新概念。i、 e.CDN

第一遍,我想你刚刚描述了CDN网络是如何工作的!;)真棒:当你再次发现方向盘时,这总是个好消息。你失去了一些时间,但至少你知道它是有效的!老实说,这是一个懒洋洋的周六下午(是周六吧?!),所以我可能错过了一两个相关的要点,但cdn网络确实以类似的方式操纵DNS记录,以获取与您最近的内容。@MichaelB让我尽可能多地总结一下:我方法的缺点是每次新用户加载资源时,我都使用自己的权威DNS将随机子域指向随机服务器。那就是我的域名的数百万子域。这可以接受吗?首先,正如我说的,这纯粹是虚构的。我没有一百万台服务器:第二,服务器都有不同的IP。如果你愿意的话,你可以把他们描述成一个拥有笔记本电脑的志愿者群体,就像一个点对点的人际网络。现在,如果我理解的很好,你建议我应该给我的每台服务器分配一些子域(也就是说,一百万条记录),并让它指向服务器的IP地址。然后,我可以使用CNAME记录制作“别名”