定义
DNS,是Domain Name System的缩写,意为域名系统,它是互联网的一项服务,是一个将域名和IP地址相互映射的一个分布式数据库。
最初,我们是使用ip地址去访问网页,但是由于ip长而且不好记,所以后来就有了DNS服务器,将域名和IP地址相互映射,这样我们就可以在访问网站时输入域名,DNS服务器将我们输入的域名解析为ip地址,实现网站的访问。
通俗点来说,DNS就是一个记录ip地址的超级分布式数据库。
特点
- 高可用:因为所有人上网都有很可能用到域名解析,所以DNS服务器就显得尤为重要,如果瘫痪,则会造成不小的麻烦。
- 分布式:因为全世界各地的人都会用到域名解析,所以DNS服务器要是分布式的
设计结构
在前面所说到的两个特点的要求下,DNS就被设计成一种树状结构;
- 最上层是根域服务器,这一层服务器的作用是用来查询顶级域服务器
- 第二层是顶级域服务器,这一层服务器的作用是返回权威域名服务器
- 第三层是权威域名服务器,这一层服务器的作用是返回具体域名对应的具体ip地址
- 同时网络运营商还会就近部署一些缓存域名服务器,如果缓存中有ip地址则直接返回ip地址
接下来我们一个一个服务器来了解。
根域和根域服务器
根域名服务器是DNS中最高界别的域名服务器,用来查询顶级域服务器,全球有13组根域名服务器。
当我们输入www.google.com访问网站,实际上是访问了不同的域,www.google.com分别代表不同的域,但还有一个域跟在.com后面,只是因为是域名系统默认的,所以这里不用写,这个就是根域。
也就是说意义上域名应该是这样:
www.google.com.根域
当我们访问时,它会向根服务器请求com域的地址。然后通过win域继续向下请求。根域名服务器并不直接把待查询的域名直接解析出IP地址,而是告诉本地域名服务器下一步应当找哪一个顶级域名服务器进行查询。
所以根域名服务器很重要。如果所有的根域名服务器都瘫痪了,那么整个DNS系统就无法工作。
顶级域和顶级域服务器
还是拿www.google.com做例子,这里的com就是顶级域。除了com之外,还有许多其他顶级域,如:cn、net、edu等。
顶级域名服务器主要负责管理在该顶级域名服务器注册的二级域名,它会返回对应的权威域名服务器。
权威DNS和权威域名服务器
权威域名服务器经过上一级授权,对域名进行解析,并返回具体域名对应的具体ip地址。
运营商DNS服务器和本地DNS服务器
在实际上网中,我们不是直接连接根服务器,而是通过本地DNS服务器上网。这里的本地DNS服务器一般指的是指各地运营商提供的域名解析服务器。你也可以自己搭件一个服务器。
解析过程
了解DNS的各个服务器,我们再来看看解析过程。
- 当我们访问一个网站时,客户端出域名解析的请求, 并将该请求发送给本地的域名服务器
- 本地的域名服务器收到请求后 , 会去本地的host文件查询是否有缓存 , 如果有该纪录项 , 则直接将查询的结果返回
- 如果本地缓存中没有该记录,则向本地DNS服务器发送一次查询请求
- 本地DNS服务器接到请求后,会先看本地缓存中有没有请求网站对应的ip地址,如果有则直接返回ip地址
- 如果缓存中没有,则本地的DNS服务器会像根域名服务器发送一次查询请求
- 根域名服务器收到请求后并不会直接返回对应的ip地址,而是看其顶级域名是什么,然后将顶级域名服务器返回给本地DNS服务器
- 本地DNS服务器再向顶级域名服务器发送查询请求,顶级域名服务器收到请求后同样不会直接返回对应的ip地址,而是返回权威域名服务器
- 本地DNS服务器再向权威域名服务器发送查询请求,权威域名服务器返回具体域名对应的具体ip地址
- 本地DNS服务器将ip地址返回给客户端
- 客户端通过ip地址与对应的服务器建立连接
整个访问过程中,客户端实际上只发出一次查询请求,整个查询过程的递归都是由DNS服务器去完成。
负载均衡和就近访问
对于我们的应用,为了保证它的高可用,我们会将其代码和数据部署在多个机房,每个机房都有自己的ip,并且每个机房托管在不同的运营商和地域。而对于用户来讲,肯定是希望就近访问机房的数据中心,这个过程就称为就近访问。
做到就近访问的方法是使用全局负载均衡器。全局负载均衡器缩写为GSLB。让我们看看整个过程:
-
假设有一个应用,这个应用在各地有多个机房,不同机房托管在不同的运营商。当我们访问一个网站时,经历一个DNS查询,为了实现跨地域和跨运营商的就近访问,配置的就不是对应的ip地址,而是一个CNAME别名。
-
通过CNAME别名的方式,可以让本地DNS服务器去请求GSLB来解析这个域名。
-
GSLB收到请求之后,通过查看请求他的本地DNS所在的运营商和所在地,就可以知道用户的运营商和地址是什么了。这样GLSB就会返回和用户相同运营商,并且离用户最近机房的ip给本地DNS服务器。
-
本地DNS服务器再将ip地址返回给客户端,客户端获得这个ip地址后,就可以访问最近的机房。