DNS介绍
IP是计算机里的地址簿,但是IP是由一串数字组成,我们的大脑很难记住,所以就需要定义一个符合人类记忆规则的地址,而这就是我们现在常用的网站域名,域名就是我们和计算机作为地址沟通的桥梁, 虽然我们在浏览器里输入的是一串带有人类语义的英文字母符,但是计算机最终还是会解析成自己可识别的IP地址,而这个过程就是域名解析,而负责把域名解析成IP的就是DNS服务。
当然域名解析的功能不仅仅是方便记忆,从程序设计的角度也隔离了因为IP变化带来的不便性,避免了因为系统迁移更换网络等因素导致的IP变化。另外一方面从系统架构的角度,可以在域名上配置多个系统IP,把多个客户端的请求解析到不同的IP地址上,从而实现系统分流的目的。
我们用域名访问网站第一步要做的就是域名解析,如果全世界的域名解析都向同一个服务器请求很显然这是不现实的,因为DNS解析不仅仅是请求量大,而且如果全世界域名和IP关系数据都存在一个地方,这个数据量也是巨大的。 所以DNS解析的设计就必须考虑其本身的性能和可用性问题。
DNS解析服务的设计充分的体现了分流的思想。 首先是把域名数据进行了纵向的拆分,DNS解析服务器分为根域名服务器、顶级域名服务器、权威域名服务器多个层次,每个层次只负责自己那部分域名数据的解析,通过分层的方式把域名数据拆分出来,从而避免由一个服务器保存所有的域名数据。
然后横向层DNS服务器都做了集群,就根域名服务器就有上千台域名服务器分布在网络中,不仅把流量分摊下来,也避免了解析某一个DNS服务器出现问题而导致域名无法提供服务。
DNS分层设计
整个域名解析过程就像公司岗位的等级分工,总经理知道有哪些经理分别负责那一块,经理只知道自己部门的员工分别负责那一块,根域名服务器就是总经理,它只知道所有顶级域名(经理)的服务器地址,而顶级域名则只知道域名对应的权威域名服务器(员工)地址,在公司里我们都知道,最终负责做事的都是员工,所以每一个域名解析请求其实最终都会落到权威服务器上。
分层后的域名解析过程
第一步:域名请求首先会请求根域名服务器,根域名服务器会根据域名的后缀(.com,.org,.cn)返回对应的顶级域名服务器地址。
第二步:得到顶级域名服务器地址后,然后向该地址发出域名解析请求,顶级域名服务器再返回该域名对应的权威域名服务器地址。
第三步: 得到权威域名解析服务器地址后,再向该地址发出域名解析请求,权威服务器最终响应对应域名的IP地址。
本地DNS缓存(Host)
域名解析服务经过分层分流后,可用性和可靠性都很高了,但是作为客户端来说如果我每一个请求,都要向域名服务器去请求解析IP地址,那也太影响网站访问性能了,所以就在客户端就在自己的本地加了一层缓存,每次域名请求都会先从自己的本地缓存查询有没有该域名的缓存,有的话直接从缓存中获取,没有的话再从DNS服务器请求。
DNS代理缓存(本地DNS服务器)
客户端本地缓存只能作用于一台计算机,这些缓存数据是无法共享的,那么有没有一种更大范围的缓存呢,所以就有了本地DNS服务器,本地DNS服务器作为客户端与DNS服务器中间的一层代理,同一个网络运行商的域名解析请求都会发向本地DNS服务器,然后由本地DNS服务器与 全球的DNS域名解析服务器去交互,本地DNS服务器会把解析到的域名对应IP缓存起来,当下次有同样的域名解析请求时则世界返回缓存里的数据。
如上图,现在我们已经得到了DNS域名解析的最总流程了,这个解析过程会经过了本地缓存、本地DNS服务器、根域名服务器、顶级域名服务器、权威域名服务器。从DNS的解析原理和流程中我们也可以学习到一个高性能高可用的系统的设计思想,从DNS设计我们可以学习到如何通过多级分流、多级缓存的系统设计来提升系统的性能和可用性。
DNS实现负载均衡
在DNS服务器里,我们配置的域名和IP映射关系是可以随便修改的,从这个角度来看,域名不仅仅有便于记忆的作用,而且它隔离对用户也隔离了变化,因为服务器IP有可能经常变动,而有了域名之后如果服务器变化了就只需要修改域名对应IP的映射即可。
另外一个方面,一个域名也可以配置多个IP, 不同的客户端请求DNS服务器可以解析到不同的IP,那从这个方面来看,那这就可以作为一种负载均衡机制,可以通过域名映射来实现流量分发,另外当一个IP对应的服务器故障时,我们可以通过删除对应的IP映射即可,新的域名解析就获取不到发生故障的IP了,从这个角度来看也保证了系统的可用性。
还有一种更智能的映射方式,我们可以在本地DNS服务器实现一些特殊的程序功能(内部负载均衡 SLB),通过SLB处理一些智能化的功能,在SLB里通过识别客户端的一些特性,实现智能的域名解析,比如不同地区的客户端,我们就返回给离客户端最近的IP。
参考文档:
分流篇-DNS分流