DNS原理介绍

2021-03-01  本文已影响0人  tinychen
image

本文主要包括DNS的简单介绍,DNS查询的原理介绍和DNS负载均衡应用的简单介绍。

1、DNS简介

1.1 什么是DNS

首先我们来了解DNS是什么。下面引用维基百科的解释:

域名系统(英语:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCP和UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。

我们知道计算机网络中的通信实际上是需要通过IP来进行的,但是让使用者记住那么多复杂无规律的IP地址是不现实的,因此人们发明了域名,使用者只需要记住域名,然后通过域名即可访问对应的网站,而DNS就是负责将我们平时使用的域名如163.com、google.com等解析成对应的IP地址,然后让客户端和该IP地址进行通信的这样一个系统。

上面的维基百科说DNS是一个分布式的数据库其实也是合理的,因为DNS主要的功能就是存储着各类域名和对应的IP地址,DNS请求可以理解成查询数据库的操作。而因为DNS需要给全球所有上网的用户频繁使用,因此它必须是分布式(地域广)、高并发(请求多)、高可用(重要性高)的一个系统。

1.2 DNS解析类型

DNS的解析类型其实也有很多种,我们比较常接触到的就是A类和CNAME,当然现在IPv6开始普及了也就有AAAA类(相当于IPv6版的A类)。

其他的还有诸如SRV、显性/隐性URL等解析,具体可以查看对应的域名供应商提供的DNS解析服务说明文档。

2、DNS查询过程

2.1 DNS服务器类型

DNS服务器一般分三种,根DNS服务器,顶级DNS服务器,权威DNS服务器。

image

那么图中的第四层example.wikipedia.orgwikipedia.org的子域名,也可以叫做二级域名,第五层www.example.wikipedia.org是第四层example.wikipedia.org的子域名,也可以叫做三级域名,以此类推。

2.2 DNS请求过程

接下来我们以访问维基百科(wikipedia.org)为例,对应下图进行解析:

image
  1. 首先客户端发送请求需要访问wikipedia.org,然后第一步是访问本地的DNS缓存;
  2. 本地的DNS缓存会读取系统下对应的hosts文件,也就是Linux下的/etc/hosts或Windows下的C:\Windows\System32\drivers\etc\hsots,如果这里面定义了wikipedia.org这个域名对应的IP地址,则直接访问这个IP,就没有后面什么事儿了;
  3. 如果本地的缓存文件没有记录,那么客户端就会发送请求到本地DNS服务器,一般来说会是ISP默认提供的DNS服务器,当然我们也可以手动指定成第三方的DNS服务器。本地DNS服务器查询服务器内的记录,如果有则直接返回记录给客户端;
  4. 如果本地DNS服务器没有记录,那么就会访问根域名服务器,询问wikipedia.org对应的顶级域名服务器的地址;
  5. 根域名服务器根据请求判断出是访问.org域名的请求,就会给客户端返回.org顶级域名服务器地址;
  6. 本地DNS服务器获取到地址之后,发送请求给.org顶级域名服务器,询问wikipedia.org对应的权威域名服务器的地址;
  7. .org顶级域名服务器给客户端返回了wikipedia.org权威域名服务器的地址;
  8. 本地DNS服务器获取到地址之后,发送请求给wikipedia.org权威域名服务器,询问wikipedia.org的IP地址;
  9. wikipedia.org权威域名服务器本地DNS服务器返回了wikipedia.org的IP地址;
  10. 本地DNS服务器给客户端返回了wikipedia.org的IP地址,客户端和这个IP建立连接,开始传输数据,该次DNS请求结束。

实际上上面的是最长的DNS查询情况,因为一般情况下我们的DNS本地服务器就会存着对应的DNS缓存记录,这样在DNS查询的时候直接就可以返回本地的缓存给客户端,从而避免了后面的递归查询。

那么要是我们修改了域名的DNS解析记录呢?比如wikipedia.org的IP地址从103.102.166.224修改成103.102.166.225,这就涉及到解析生效的时间问题,也就是所谓的TTL,解析生效时间取决于本地DNS缓存的解析记录的TTL到期时间,一般默认为10分钟。例如解析记录设置的TTL值为 10 分钟,则理论上全球解析生效时间需要10分钟;解析记录设置的TTL值为60秒,则理论上全球解析生效时间需要60秒。

3、DNS的用途

我们已经知道DNS最基本也是最重要的作用就是进行域名和IP地址之间对应关系的记录和查询,除此之外,DNS还可以用作负载均衡。

首先我们要知道,域名和IP并不是一对一的关系,而是多对多的关系。也就是说一个IP可以绑定多个域名,一个域名也可以解析到多个IP。有了这个特性,我们就可以利用DNS来实现负载均衡。

注意负载均衡并非只有DNS这一种方式

3.1 内部负载均衡(SLB)

例如,一个应用要访问数据库,在这个应用里面应该配置这个数据库的IP地址,还是应该配置这个数据库的域名呢?显然应该配置域名,因为一旦这个数据库,因为某种原因,换到了另外一台机器上,而如果有多个应用都配置了这台数据库的话,一换IP地址,就需要将这些应用全部修改一遍。但是如果配置了域名,则只要在DNS服务器里,将域名映射为新的IP地址,这个工作就完成了,大大简化了运维。

在这个基础上,我们可以再进一步。例如,某个应用要访问另外一个应用,如果配置另外一个应用的IP地址,那么这个访问就是一对一的。但是当被访问的应用撑不住的时候,我们其实可以部署多个。但是,访问它的应用,如何在多个之间进行负载均衡?只要配置成为域名就可以了。在域名解析的时候,我们只要配置策略,这次返回第一个IP,下次返回第二个IP,就可以实现负载均衡了。

3.2 全局负载均衡(GSLB)

image

还是刚刚上面的那个图,我们加入了GSLB1和GSLB2在权威域名服务器后面,权威服务器之前的访问过程和上面提到的DNS请求过程一样,这里我们还是以访问维基百科(wikipedia.org)为例。

GSLB和我们常说的LVS、NGINX负载均衡等方式的一个比较大的不同就是在覆盖范围特别广的时候使用效果会更好一些。比如在中国的服务器业务,要扩展到美国,假设业务的访问量翻倍,要增加一倍的机器,可以选择在原有的集群上增加一倍的机器,或者在美国再部署一套同样的服务器,然后配置DNS的GSLB服务器来实现。显然后者的效果会更好,因为美国的用户访问中国的服务器在速度上肯定是没有访问美国的服务器快。

这里只是打一个不太恰当的比喻,实际上访问量翻倍肯定没这么简单。但是在这种跨地域的负载均衡策略上,DNS的GSLB是一个不错的选择。

上一篇 下一篇

猜你喜欢

热点阅读