什么是CNAME以及CDN?

什么是CNAME以及CDN?

什么是CNAME?

先简单的说下域名解析:在以前,人们用IP进行互访,后来发现IP太多不好记忆,便有了域名,比如www.baidu.com,你一看就知道是百度搜索引擎,而不需要管他的服务器IP是多少,但是在最开始通信的时候,电脑路由器不认识域名,只认得IP啊,要怎么去获得对应的IP呢,这时候有了域名解析,就是去请求网络上的DNS服务器,让他们来告诉你这个域名对应的IP是多少,至于请求DNS解析的详细过程,大家就自行搜索啦,这里不赘述。

然后简单概括地说:

  • A记录是将域名解析成IP,CNAME是将域名解析成另外一个域名。

在说CNAME之前,要提到一个东西叫 A记录:


1.A记录

A记录,即Address记录,它并不是一个IP或者一个域名,我们可以把它理解为一种指向关系:

域名 www.xx.com → 1.1.1.1
主机名 DD → 2.2.2.2

也就是当你访问这些域名或者主机名的时候,DNS服务器上会通过A记录会帮你解析出相应的IP地址,以达到后续访问目的。所以A记录是IP解析,直接将域名或主机名指向某个IP。

2.CNAME

CNAME记录,也叫别名记录,相当于给A记录中的域名起个小名儿,比如www.xx.com的小名儿就叫www.yy.com好了,然后CNAME记录也和A记录一样,是一种指向关系,把小名儿www.yy.com指向了www.xx.com,然后通过A记录,www.xx.com又指向了对应的IP:

www.yy.comwww.xx.com → 1.1.1.1

这样一来就能通过它的小名儿直接访问1.1.1.1了。


这时候有人问:这不多了一步嘛,不嫌麻烦?


假如这个时候我又想给原域名取几个小名儿,分别叫www.cc.comwww.kk.com那么存在下列指向关系:

www.yy.comwww.xx.com → 1.1.1.1
www.cc.comwww.xx.com → 1.1.1.1
www.kk.comwww.xx.com → 1.1.1.1

突然服务器的IP地址因为一些不可描述的原因要更换了,不再是1.1.1.1了,换成了2.2.2.2,这时候你发现,只要把www.xx.com的指向修改一下即可:

域名 www.xx.com → 2.2.2.2

这时候你又发现了,原来他的小名儿不需要做更改,直接就能访问服务器,因为他们都只指向了www.xx.com,服务器IP改没改它们不管。


那么假如不用CNAME,直接做A记录会怎样?

www.yy.com → 1.1.1.1
www.cc.com → 1.1.1.1
www.xx.com → 1.1.1.1
www.kk.com → 1.1.1.1

那么当1.1.1.1更改的时候,全部相关A记录指向关系都要做更改,这才麻烦


3.CNAME的应用:CDN

现网常用在CDN加速上,关于CDN大家可以看看下面这篇文章,通俗易懂:


举个CDN的栗子 :

假如你是DD公司老板,你公司中的一台IP为1.1.1.1的服务器,注册了域名为www.dd.com,要对外提供客户访问。随着公司做大做强,访问量也越来越多,服务器顶不住了,你去找CDN提供商购买CDN加速服务,这个时候他们要求你的域名做个CNAME指向他们给你的一个域名叫www.dd.cdn.com

www.dd.comwww.dd.cdn.com

当用户访问www.dd.com的时候,本地DNS会获得CDN提供的CNAME域名:www.dd.cdn.com,然后再次向DNS调度系统发出请求,通过DNS调度系统的智能解析,把离客户端地理位置最近的(或者相对负载低的,主要看CDN那边智能解析的策略)CDN提供商的服务器IP返回给本地DNS,然后再由本地DNS回给客户端,让用户就近取到想要的资源(如访问网站),大大降低了延迟。


本地运营商的DNS服务器怎么知道一个域名的授权(权威)服务器是哪台?这个域名应该在哪里取解析呢?

首先公司会去找运营商买域名,比如CDN公司买了cdn.com这个一级域名(相对于a.cdn.comb.cdn.com来说cdn.com可以称为一级域名,这个不用纠结哈),那么本地运营商会做一个NS记录,即匹配到这个cdn.com后缀的域名都会到CDN服务提供商的DNS服务器做解析,即到权威服务器做解析。

其他记录我有空再详细补充下~


4.域名缓存问题

最近在公司遇到比较多的是关于域名缓存的问题,在这边简单说下。

  • 还是举个栗子,你搭建了一个权威DNS服务器,这个服务器需要处理用户终端发起的域名查询请求,假如用户量很大,访问域名频繁,或者说有些接口需要频繁调用网站域名的情况,那用户每次调用都去请求解析不太合理,降低了我调用的效率,DNS权威服务器也有负担。所以一般DNS服务器在下发解析的时候是带有缓存时间的(10min或者是1h,主要由DNS服务器决定),而且这个缓存是下发到用户终端、用户终端、用户终端上的(重要的事情说三遍),其实用户在访问域名的第一步不是直接去查解析,而是查本地host文件,然后是看缓存是否有这个解析记录,都没有的话才去请求解析。

所以在公司比较常见到这种情况,内网和公网域名切换的时效问题。

A.内网环境:因为是在内部局域网搭建的DNS,这个缓存时间我们是可控的,比如我们部署为1h缓存时间,如果有客户的域名指向关系需要修改,比如客户提供服务的机器ip要更换了,又想要做到快速切换,那我们需要在修改指向关系的一小时前把这个域名的缓存时间改成1min或者30s,那么一小时后可保证等所有用户的缓存时间都过了再做域名指向关系的修改,那就能达到快速切换的效果。

B.外网环境:前文有提到,用户在请求DD公司域名前,是经过了运营商的,那其实DD公司的缓存是下发给运营商的,实际用户的缓存时间可能是由运营商下发的,那就会存在一个问题,我改了缓存时间为30s,但运营商那边做了操作,下发给用户是1h(可能是部分地区运营商统一修改的缓存时间,可以设定上时间的下限),那这咋整?那就莫得办法了,但能保证的是九成以上的地区能够在短时间内切换,要想做到所有用户终端秒级切换是不大可能了

C.其他情况:像外网环境那样中间经过了运营商,其实就是相当于经过了一个中间节点一样,这个中间节点帮我们去做请求转发或者是递归查询,那其实内网环境也存在这么一种情况,当清除了本地缓存解析还没生效,那就要考虑下是否你的DNS SERVER权威服务器还是中间节点了,比如图中内网也存在隔离环境DMZ区域,部分域名权威解析不一定在DMZ区域的服务器上做的,那这些域名就需要做一个转发规则到这个域名的权威服务器上要解析,而这个解析就可能存在于DMZ区域的DNS服务器上了,那怎么看呢?


拿我的windows来举例,打开CMD,解析百度


server address是 192.168.3.1 ,那这明显是经过了中间节点了(是我的网关,路由器地址),下面还告诉你了非权威应答,说明是路由器帮我们去递归请求解析了。

怎么清除本地缓存呢?

  • WINDOWS
可以这样看缓存ipconfig /displaydns
也可以清缓存 ipconfig /flushdns

LINUX服务器如果没有安装DNS服务的话一般是没有缓存的,你的缓存可能来存在于其他程序或者是中间节点,中间节点地址可以通过nslookup随便一个域名看到,就是你的DNS SERVER,登上去清除一下(例 BIND服务器可通过 rndc -s 127.0.0.1 flush 清除,其他视情况自行解决~~)。

既然请求解析的第一步是查本地host,那我们是否可以自己修改本地缓存呢?完全阔以

  • WINDOWS
路径 C:\Windows\System32\drivers\etc
  • 比如我加两个映射关系
www.dd.com 1.1.1.1
baidu.com 1.1.1.1

ping测试

说明本地host是优先的,但是nslookup的结果还是baidu.com的地址,我怀疑是nslookup这个程序直接跳过了查询本地host这一步。


  • LINUX

和windows一样直接修改就行了

[root@sword ~]# cat /etc/hosts
1.1.1.1 www.dd.com
1.1.1.1 baidu.com

DNS SERVER也是可以自己修改的,还有很多配置就先不写了,看啥时候有空吧~


——————————————————

版权声明:本文为CSDN博主「没事重启一下」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

该文为本人在CSDN编写,转载请标明出处,谢谢~

编辑于 2021-08-30 10:38