javascript - 使用 DNS 和 javascript 在对等点之间进行负载平衡

标签 javascript caching dns

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

  • 我有一大群服务器。我所说的巨大是指:数百万个节点。
  • 每个节点都是不可靠的:它可以(并且将会)经常离线,正常运行时间可能低至 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/

相关文章:

javascript - 背景 svg 元素上的 mouseenter 事件

java - 无法解码组件 : CONTINUOUS_PROC with more than one ContinuousQuery listener in Ignite 的发现数据

c++ - 在高性能金融应用程序中缓存

windows - 我可以使用 Golang 获取 Active Directory 环境的内部域名吗?

python - 向 DNS 查询时欺骗 src ip 地址

javascript - Array.push 与 Array.unshift 的性能对比

javascript - MSCRM async javascript SDK.REST.retrieveMultipleRecords 仅返回 50 条记录,一次需要所有记录

command-line - ansible - 如何在运行 ansible-playbook 时传递本地 DNS 服务器来解析主机名

javascript - 内容脚本文件 : Do we always need jQuery?

c# - CacheManager - 每 x 分钟或到期时刷新缓存