架构基础:从需求到架构
上QQ阅读APP看书,第一时间看更新

2.1.4 DNS轮询负载设计

DNS(Domain Name System,域名系统)是互联网的一种服务,它将域名和IP地址进行映射存储,当用户访问某个域名时能够快速找到对应的IP地址,使用户更加方便地访问互联网。

互联网应用访问流程包括以下3个步骤,如图2-12所示。

(1)客户端使用域名(yinhongliang.com)请求服务器时,需先请求DNS服务进行域名解析。

(2)DNS服务通过查找域名注册表,找到域名所对应的IP地址(10.3.1.33),返回给客户端。

(3)客户端使用IP地址(10.3.1.33)再去访问服务器的应用。

图2-12 DNS解析

然而,单个服务器节点不但存在单节点风险,而且能够支撑的最大并发连接数十分有限,可以借助DNS进行负载,从而使服务支持水平扩展。

将域名与多个IP地址进行绑定(例如,yinhongliang.com这个域名与10.3.1.33、10.3.1.34、10.3.1.35三个域名绑定),用户每次发起请求时DNS服务都按照顺序依次返回域名所对应的IP地址,从而达到了服务轮询负载的目的,如图2-13所示。

图2-13 DNS轮询负载

也可以针对不同的地区、运营商绑定不同的IP地址。这样,全国各地的用户进行访问时,可以尽量将用户的请求解析到距离最近的服务器,从而加快响应速度。

这种架构虽然解决了水平扩展问题,却将服务器直接暴露在互联网上,并且吞吐量依然不足,可以采用DNS+多级负载的方式架构。

可以将域名绑定在负载均衡器LVS的IP地址上,这样通过DNS解析后,用户的请求就会通过LVS和Nginx的多级负载,无须暴露真正的后端服务,极大地提高了系统的安全性、可用性和并发能力,如图2-14所示。

DNS解析负载的最大问题是,没有自动监测能力,无法帮助应用自动完成故障转移。例如,某个服务节点宕机,由于DNS没有主动探测机制,不会自动将无法访问的服务节点IP从DNS列表中移除,所以用户依然会请求到宕机的服务。

当系统发生故障时,需要手动修改域名解析配置,由于DNS存在缓存,并不能立即生效,所以还会有一段时间服务不可用。

图2-14 DNS+多级负载架构