我们都是通过域名访问网站,而不是通过一串毫无意义的数字(IP地址),而服务器是通过IP地址对外提供服务,将域名和IP绑定急需要通过 DNS (Domain Name System,域名系统)。访问一个网址时,需要先通过DNS服务器将域名转换成服务器的IP地址,再通过IP地址访问页面,如下图所示:
在 DNS 中可以为一个域名绑定多个 IP地址,用户在请求 DNS 解析服务时,DNS 按照一定的策略返回给用户其中的一个 IP,可以按照权重轮询的策略返回,也可以按照线路返回。假设以test.coderxing.com
这个域名为例,如下图所示,我们可以根据联通、电信、国外等线路指定不同的IP地址,可以行为也可以为同一个新线路制定多个IP地址,比如中国移动的线路配置了两个不同的IP,很多商用DNS服务甚至可以按照用户所在的省份来设定 IP。
在 DNS 中有多种类型,其中 A 记录是最常用的,表示域名和直接和IP绑定,其他常用的还有 CNAME记录,表示讲一个域名和另外一个域名进行绑定,再有另外的域名解析提供IP地址;NS 记录,表示将域名的解析工作交给其他服务商解析。
基于这个特点,DNS 可以用户负载均衡,在用户的域名解析阶段,返回不同的IP地址,从而对整体流量进行分流,如下图所示:
使用 DNS 做负载均衡的好处是比较方便,成本低,不用单独维护负载均衡服务器,只需要在DNS服务商提供的后台进行配置即可,而且应用服务器的部署不受地理限制,可以在网络中的任意位置,不像传统集群要都集中在同一个机房内。
但 DNS 域名映射存在多级缓存的问题,各级缓存按照TTL时间(Time To Live,可以理解为过期时间)来刷新本地缓存,这就造成域名IP映射记录的变更不会立即成效,一旦某台应用服务器宕机,即使立即更新DNS记录也不会立即反馈到用户端。所以只是用 DNS 做负载均衡,会对服务的整体可用性带来一定的风险。所以一般大型互联网公司都回合其他后端负载均衡技术结合使用,比如 DNS最为一级负载均衡手段,后端应用服务器使用Nginx或者LVS方式作为二级负载均衡。