一、DNS基础
1、Domain Name 和 DNS
-
域名(Domain Name)是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识(有时也指地理位置);eg: www.baidu.com
-
DNS(Domain Name System, 域名系统) 是Internet上作为将域名和IP地址相互映射的一个分布式数据库,能够根据域名找到对应的IP地址。
-
根域、顶级域、二级域、子域 域名采用层次化的方式进行组织,每一个点代表一个层级。一个域名完整的格式为
www.baidu.com.最末尾的点(.)代表根域,常常省略;com即顶级域(TLD, Top-Level Domain);baidu.com即二级域。依次类推,还有三级域、四级域等等。子域是一个相对的概念,baidu.com是com的子域,www.baidu.com是baidu.com的子域。 -
根域名通常使用"."来表示,其实际上也是由域名组成,全世界目前有13组域名根节点,由少数几个国家进行管理,而国内仅有几台根节点镜像。
2、DNS解析相关
-
正向解析:查找域名对应IP的过程;反向解析: 查找IP对应域名的过程;解析器: 即resolver,处于DNS客户端的一套系统,用于实现正向解析或者反向解析。
-
权威DNS:处于DNS服务端的一套系统,该系统保存了相应域名的权威信息。权威DNS即通俗上“这个域名我说了算”的服务器。
-
递归DNS:又叫Local DNS,递归DNS可以理解为是一种功能复杂些的解析器(resolver),其核心是 缓存 和 递归查询。收到域名查询请求后,首先看本地缓存是否有记录,如果没有则一级一级的查询根、顶级域、二级域……直到获取到结果然后返回给用户。日常上网中运营商分配的DNS即是递归DNS
-
转发DNS:是一种特殊的递归。如果本地的缓存记录中没有相应域名结果时,其将查询请求转发给另外一台DNS服务器,由另外一台DNS服务器来完成查询请求。
-
公共DNS:属于递归DNS。其典型特征为对外一个IP,为所有用户提供公共的递归查询服务。
- 国内主流的公共DNS的有114DNS(114.114.114.114)、阿里DNS(223.5.5.5)、百度DNS(180.76.76.76)、腾讯DNS(119.29.29.29)
- 国外推荐的公共DNS是谷歌DNS(8.8.8.8)
3、DNS常用命令工具
host命令 ornslookup命令:分析域名查询工具,测试域名系统工作是否正常
# 查询域名的主机信息
host -a www.baidu.com
# Trying "www.baidu.com"
# ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27785
# ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
# ;; QUESTION SECTION:
# ;www.baidu.com. IN ANY
# ;; ANSWER SECTION:
# www.baidu.com. 60 IN A 10.15.63.90
# 根据IP反查域名
host 114.114.114.114
# 114.114.114.114.in-addr.arpa domain name pointer public1.114dns.com.
# 查询域名对应的IP
nslookup www.baidu.com
# Server: 10.8.8.18
# Address: 10.8.8.18#53
# Non-authoritative answer:
# Name: www.baidu.com
# Address: 10.15.63.90
# 根据IP反查域名
nslookup 114.114.114.114
# Server: 10.8.8.18
# Address: 10.8.8.18#53
# Non-authoritative answer:
# 114.114.114.114.in-addr.arpa name = public1.114dns.com.
# Authoritative answers can be found from:
whois命令:查看域名的注册情况。
whois www.baidu.com
二、DNS查询
1、DNS查询方式
- DNS查询分两种:递归查询与迭代查询;
- 递归查询:Local DNS Server接收到客户端请求后,如果它本地没有被查询的域名的IP地址,就会代替客户端,去向其他域名服务器继续发出查询,直到查询到结果后,然后层层返回给客户;
- 迭代查询:Local DNS Server接收到客户端请求后,如果它本地没有被查询的域名的IP地址,并不直接回复查询结果,而是告诉客户机另一台DNS 服务器地址,客户机再向这台DNS 服务器提交请求,依次循环直到返回查询的结果。
2、Local DNS的设置
- 主机(PC或移动设备)上可以通过手动配置 DNS的服务器地址 OR 利用DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)动态获得DNS的服务器地址。
- Local DNS包括网络服务提供商(ISP)分配给我们的DNS(一般为两个),或者是其他组织提供的公共DNS,比如
- 有时,PC或者移动设备上,DNS的地使用路由器的地址,这是因为路由器会将DNS请求转发到ISP的DNS服务器上。
3、典型DNS查询过程
当我们在浏览器中输入一个网站如:www.baidu.com时,会发生如下过程:
- 操作系统会先依次检查缓存中、本地的hosts中是够有这个域名对应的IP地址;如果有,就先调用这个IP地址,完成域名解析,否则进入下一步;
- 如果缓存中、本地的hosts里都没有这个域名的映射,客户端会向Local DNS Server发起查询。Local DNS Server收到查询请求时,如果本地缓存中有记录,则返回IP地址给客户机,完成域名解析,否则进入下一步;
- 如果Local DNS Server本地缓存没有记录,则一级一级的查询根、顶级域、二级域……直到获取到IP地址,然后返回给用户。
- 最终,客户端可以通过 IP 访问到对应的服务器
4、扩展
-
DNS的查询和响应使用的是UDP协议,DNS消息通过UDP数据包发送,如果在一个限定时间内没有收到响应的UDP数据包,那么DNS客户端则会重复查询请求;如果重复一定次数仍然失败,则会尝试域内另一台DNS服务器。
-
TTL(Time To-Live)是一条域名解析记录在DNS服务器中的存留时间;可以通过设置TTL时间来控制DNS缓存的时间;但是客户端也可以域名解析记录,甚至有的客户端忽略DNS Server的TTL时间,而采用自己的固定DNS过期时间。
-
对于大型网站而言,通过Local DNS返回的IP地址,并不是真正应用服务器的地址,而是网站的反向代理(nginx)服务器地址;反向代理(nginx)服务器会根据 负载均衡策略,将请求分配给对应的应用服务器处理;应用服务器处理后,才会返回给原来的客户端。
三、DNS轮询及应用
1、基本概念
-
DNS轮询:通过对一个域名设置多个IP解析,来扩充Server性能及实施负载均衡的技术;目前,大部分域名注册商都支持多条A(Address)记录的解析,DNS服务器将解析请求按照A记录的顺序,逐一分配到不同的IP上,这样就完成了简单的负载均衡。
-
A(Address)记录:又称IP指向,用户可以在此设置子域名并指向到自己的目标主机地址上,从而实现通过域名找到服务器。(说明:指向的目标主机地址类型只能使用IP地址)
-
负载均衡(Load Balance)是分布式系统架构设计中必须考虑的因素之一,它通常是指,将请求/数据均匀分摊到多个操作单元上执行。
2、DNS轮询的优点
- 基本上无成本,因为域名注册商的这种解析都是免费的;
- 部署方便,除了网络拓扑的简单扩增,新增的Web服务器只要增加一个公网IP即可。
3、DNS轮询的缺点
- 健康检查缺失:如果某台服务器宕机,DNS服务器是无法知晓的,仍旧会将访问分配到此服务器。修改DNS记录全部生效起码要3-4小时,甚至更久;
- 请求/数据分配不均:如果几台Web服务器之间的配置不同,能够承受的压力也就不同,但是DNS解析分配的访问却是均匀分配的。其实DNS也是有分配算法的,可以根据当前连接较少的分配、可以设置Rate权重分配等等,只是目前绝大多数的DNS服务器都不支持;
- 缺少会话保持:如果是需要身份验证的网站,在不修改软件构架的情况下,这点是比较致命的;因为DNS解析无法将验证用户的访问持久分配到同一服务器。虽然有一定的本地DNS缓存,但是很难保证在用户访问期间,本地DNS不过期,而重新查询服务器并指向新的服务器,那么原服务器保存的用户信息是无法被带到新服务器的,而且可能要求被重新认证身份,来回切换时间长了各台服务器都保存有用户不同的信息,对服务器资源也是一种浪费。
4、DNS轮询的应用
-
常见互联网分布式架构,分为客户端层、反向代理nginx层、站点层、服务层、数据层。每一个下游都有多个上游调用,只需要做到,每一个上游都均匀访问每一个下游,就能实现“将请求/数据【均匀】分摊到多个操作单元上执行”。
-
水平扩展反向代理层:DNS Server对于一个域名配置了多个解析IP,每次DNS解析请求来访问DNS-Server,会轮询返回这些IP,保证每个IP的解析概率是相同的; 而这些IP就是nginx的外网ip,以做到每台nginx的请求分配也是均衡的。
-
当然,对于比较简单的系统,甚至可以不需要反向代理层,直接利用DNS轮询实施负载均衡,优缺点都非常明显,根据实际情况来吧。
- 优点:少了一层网络请求,服务端架构简单
- 缺点:
- DNS只具备解析功能,不能保证对应外网IP的可用性,而nginx与应用Server之间有保活探测机制,当应用Server挂掉时,能够自动迁移流量;
- 应用Server需要扩容时,通过DNS扩容生效时间长,而nginx是服务端完全自己可控的部分,应用Server扩容更实时更方便
5、总结
- 在网络架构的发展过程中,会有利用DNS轮询来实现简单Web Server的负载均衡,但是Web Server的负载均衡主要是通过nginx、LVS和keepalived来实现的。
- 使用DNS轮询实现 水平扩展 反向代理层,也是个不错的选择。
- 在网站架构中,除了有DNS轮询技术,还有智能DNS技术(GSLB(Global Server load Blance、全局负载均衡)一种应用),可以实现根据用户IP来就近访问服务器。
四、HTTPDNS方案
1、简介
-
HTTPDNS:基于HTTP协议DNS服务器发送域名解析请求,替代了基于UDP的DNS协议向运营商Local DNS发起解析请求方式,有效避免Local DNS造成的域名劫持和跨网访问问题,提高域名解析效率。
-
DNS劫持是目前常见的攻击手段,通过攻击运营商的解析服务器,返回假IP地址或让请求失去响应,使得通过域名不能访问或访问的是假网址;
国内电信运营商 = 中国电信、中国移动、中国联通三大运营商 + 长城宽带等小的运营商 -
HTTPDNS的主要收益是 防止DNS的劫持,保障了服务高可用;精准调度,提升用户体验。
2、HTTPDNS设计中关键点
-
安全策略:HTTPDNS查询是基于标准的HTTP协议,但是如果为了保证安全,可以使用HTTPS;
-
IP选取策略:HTTPDNS服务将最优IP按照顺序下发,客户端默认选取第一个,校验连通性OK就使用,如果不OK,选用下一个校验;
-
缓存过期策略:后端动态下发域名的TTL时间,当域名的TTL超时后,如果没有新的IP将继续沿用老的IP,也可以降级成Local DNS返回的IP。
-
批量拉取策略:在应用冷启动 或 网络切换时候,批量拉取域名和IP列表的映射数据,缓存下来;以便在后续请求中使用到,预期提升精准调度能力。
-
降级策略:当HTTPDNS服务不可用 & 本地也没有缓存或者缓存失效时,降级成运营商的Local DNS方案;当HTTPDNS服务 & Local DNS服务双双不可用的情况下,可以使用
BACKUP IP;
3、总结
- 复杂的网络环境中,在避免DNS劫持攻击,提升解析的准确性,降低网络时延等方面,HTTPDNS比传统的DNS方案优秀很多;移动互联网发展到今天,HTTPDNS方案已经是保障大前端服务高可用的必备手段;
- 国内如阿里云、腾讯云、百度等厂商都提供此类服务,接入也比较简单(推荐使用阿里云HTTPDNS)。