术→技巧, 运维

负载均衡技术:DNS轮询

钱魏Way · · 267 次浏览

通常我们说,一个域名是唯一对应到一个IP地址上的,我们在浏览器里输入一个域名,则将请求传递给DNS服务器,DNS服务器解析出这个对应的IP后返回给浏览器。但在一些情况下,一个域名可以对应多个IP地址,这种方式就叫DNS轮询。通过DNS轮询,我们可以达到一些正常情况下难以达到的目的。首先来介绍一下DNS轮询的基本概念。

我们知道,在设置域名解析时,一般一个域名对应CNAME或者A记录到仅一个IP上。这样,如果我们访问这个域名时,就能被转换到这个IP上进行访问。然而,如果在DNS区域文件中设置同样的域名的A记录到两个或者多个不同IP上,那么在访问时会发生什么呢?实际上,DNS服务器还是会照常解析。这就产生了矛盾——我们到底访问到的是哪一个IP。这与地理位置、访问速度等诸多因素有关,但利用这种IP选择机制,我们可以完成许多有意义的事情。具体的解析过程是这样的:首先,客户机发请求给递归服务器(地方宽带运营商服务器),递归服务器发请求给解析服务器;然后,解析服务器将域名设置的所有轮询主机服务器IP返回给递归服务器,递归服务器将这些IP再返回给客户机;最后,客户机的浏览器会随机对其中的一个IP 进行访问。于是,利用这种同一域名对不同IP的访问,我们可以做到许多事情。

  • 首先是实现均衡负载与故障时保证访问。对于大型的网站,几乎是一定会用到均衡负载的。如果采用DNS轮询技术,将一个域名解析到多台服务器的各自的IP地址上,利用浏览器的随机访问对流量进行分摊,则会降低每台服务器的压力,实现均衡负载。故障时保证访问是它的另一个重要应用。从之前的原理的简述我们可以看出,轮询时DNS服务器会将所有的IP返回给浏览器,浏览器自身的机制会使其在连接出错时继续连接下一个IP,直到所有IP都无法连接或者连接成功为止。这样,只要两台服务器不同时宕机,那么我们几乎可以让网站在线率达到将近百分之百。类似地,在更换服务器地址时,使用另一台服务器做DNS轮询进行过渡是一个很好的方法。
  • 第二个重要的作用是CDN加速。DNS轮询是CDN的基础,通过对于不同访问线路的不同解析,达到最快的访问速度,这是非常有用的功能,当然前提是你有很多台服务器。DNSPOD提供了类似的功能,大家可以自行尝试。
  • 第三个重要的作用是实现内外网的不同访问内容与内容的加速访问。我们学校的所有有线网与无线网组成大规模的局域网,局域网内所有电脑互通。我之前有个站点放在国外的VPS上,校内访问的速度还是很不理想的。最近想让校内访问速度提高,并且给内网访问者提供一个查询的功能(不想让校外访问者使用),就在自己电脑上搭建了一个服务器,校内所有的角落登录速度飞快,并且能够使用查询功能。此时再做DNS轮询,分别解析到校外服务器地址与校内本机的局域网内IP地址,这样校内客户机访问的就是我的电脑上的高速服务器;而校外访问时连不上校内局域网的IP,就会轮询访问到外部服务器,也不会访问到不能访问的内容,效果非常好。

目前国内支持DNS轮询的解析商不多,DNSPOD目前支持DNS轮询配置。

DNS负载均衡原理

DNS负载均衡是通过循环复用实现的,如果发现主机名的多个地址资源记录,则可用它循环使用包含在查询应答中的主机资源记录。在默认情况下,DNS 服务器的服务使用循环复用对资源记录进行排序,这些资源记录是在解析为多个映射的主机名应答中返回的。该功能提供了一种非常简便的方法,用于对客户机使用 Web 服务器和其他频繁查询的多宿主计算机的负载平衡。

要使循环复用正常工作,必须首先在该区域中注册所查询名称的多个主机资源纪录,并启用DNS服务器循环复用。如果DNS服务器禁止循环复用,那么这些查询的响应顺序以应答列表中资源记录在区域中存储时的静态排序为基础。

比如你添加了三条记录,分别是1,2,3

  • 第一个用户请求,记录返回1,2,3
  • 第二个用户请求,记录返回2,3,1
  • 第三个用户请求,记录返回3,1,2
  • 第四个用户请求,记录返回1,2,3

所有的记录都是均匀的返回给每一个请求的用户,但有时候用户可能一打开你的网站就马上退出(比如关掉了浏览器),有些用户可能会一直浏览你的网站。因为DNS无法得知还有哪个用户还在访问你哪一台服务器,所以就会造成有些服务器访问的用户多,有些服务器访问的用户少(因为这台服务器访问时间短的用户比较多)。最后就会出现访问用户不平均的情况。

下图的例子是:有3台联通服务器、3台电信服务器,要实现“联通用户流量分摊到3台联通服务器、其他用户流量分摊到电信服务器”这个效果的设置。

DNS由于成本较低,所以一般在小型的网站用的比较多。但是大型的网站一般也会将用它和其他负载均衡的方式结合起来一起使用,DNS轮询方式提供的IP地址,在大型网站中往往是一个集群的地址,可能是均衡交换机也可能是均衡服务器。对于小网站的话,挂接多台服务器也没有问题。如:

DNS负载均衡优缺点

DNS轮询的优点:

  • 零成本:只是在DNS服务器上绑定几个A记录,域名注册商一般都免费提供解析服务;
  • 部署简单:就是在网络拓扑进行设备扩增,然后在DNS服务器上添加记录。

DNS轮询的缺点:

  • 健康检查,如果某台服务器宕机,DNS服务器是无法知晓的,仍旧会将访问分配到此服务器。修改DNS记录全部生效起码要3-4小时,甚至更久;
  • 分配不均,如果几台Web服务器之间的配置不同,能够承受的压力也就不同,但是DNS解析分配的访问却是均匀分配的。其实DNS也是有分配算法的,可以根据当前连接较少的分配、可以设置Rate权重分配等等,只是目前绝大多数的DNS服务器都不支持;
  • 会话保持,如果是需要身份验证的网站,在不修改软件构架的情况下,这点是比较致命的,因为DNS解析无法将验证用户的访问持久分配到同一服务器。虽然有一定的本地DNS缓存,但是很难保证在用户访问期间,本地DNS不过期,而重新查询服务器并指向新的服务器,那么原服务器保存的用户信息是无法被带到新服务器的,而且可能要求被重新认证身份,来回切换时间长了各台服务器都保存有用户不同的信息,对服务器资源也是一种浪费。

DNS智能解析

传统DNS解析,不判断访问者来源,会随机选择其中一个IP地址返回给访问者。而智能DNS解析,会判断访问者的来源,为不同的访问者智能返回不同的IP地址,可使访问者在访问网站时可获取用户指定的IP地址,能够减少解析时延,并提升网站访问速度的功效。

传统DNS解析示例

例如域名www.example.com,有三台服务器,分别是联通IP,移动IP,电信IP,DNS解析配置如下:

  • 将域名 指向 联通IP地址 (0.2.0)
  • 将域名 指向 移动IP地址 (0.2.1)
  • 将域名 指向 电信IP地址 (0.2.2)

可实现的解析效果:传统DNS解析不判断访问者的来源,会将192.0.2.0、192.0.2.1、192.0.2.2三个地址全部返回给访问者的LocalDNS,由访问者的LocalDNS通过随机或者优选的方式将其中一个IP地址返回给访问者,传统DNS解析有可能会造成访问者跨网访问。

智能DNS解析示例

例如域名www.example.com,有三台服务器,分别是联通IP,移动IP,电信IP,DNS解析配置如下:

  • 解析线路配置默认线路 指向 联通IP地址 (0.2.0)
  • 解析线路配置移动线路 指向 移动IP地址 (0.2.1)
  • 解析线路配置电信线路 指向 电信IP地址 (0.2.2)

可实现的解析效果:云解析会判断访问者的来源,为来源于移动运营商的访问者云解析返回 192.0.2.1 的解析地址,为来源于电信运营商的访问者云解析返回 192.0.2.2 的解析地址,其他来源的访问者云解析返回192.0.2.0 的解析地址。

实现原理

云解析是通过识别LOCALDNS的出口IP,来判断访问者来源。如客户端LOCALDNS支持EDNS(Google提交了一份DNS扩展协议,允许DNS resolver传递用户的ip地址给authoritative DNS server.),所以在获取访问者来源IP时,优先获取 edns-client-subnet 扩展里携带的IP ,如果edns-client-subnet 扩展里存在IP,云解析DNS会以该IP来判断访问者的地理位置 ;如果不存在,则以LocalDNS出口ip来判断访问者的地理位置。

  • 如客户端LocalDNS不支持EDNS:LocalDNS会迭代请求至云解析DNS,云解析DNS根据访问者LocalDNS出口IP来判断访问者的地址位置,实现智能解析。
  • 如客户端LocalDNS变相支持EDNS:用户发起DNS请求,递归到LocalDNS,则LocalDNS将本次请求发送到二级节点,通过二级节点向云解析DNS发起请求,此时云解析DNS会根据LocalDNS二级节点的地域位置返回具体的细分线路解析结果。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注