大家应该都知道,当我访问一个网址的时候,实际上我是在访问一个 IP 地址.那为什么不记 IP 地址,反而要去访问一个网站名字呢,比如谷歌.
你可以想想,现在有多少网站,数不过来对吧?就算数的过来, 直接访问那么多的 IP 地址,恐怕也是记不过来的.不信你就记一串数字试试,是记一串数字容易,还是记一个 google 名字容易.
接下来有没有新的疑问?既然我在访问一个网址的时候,实际上是在访问一个 IP 地址,那浏览器怎么知道会到这个 IP 地址呢?
所以这就是 DNS 协议要做的事情:根据一个名称,我就可以访问到具体的 IP 地址.
DNS 服务器
每个人上网,都会访问网址,都会用到 DNS ,所以它是非常重要的,但这也是对它的挑战.因为只要它一旦出现了故障,那么整个互联网都几乎会瘫痪,因为你访问不到网址了嘛.
此外,上网的人分布在全世界,如果 DNS 服务器部署在一个地方,那么造成的访问时长会非常长,这样来分析的话, DNS 服务器一定得是高可用,高并发,分布式才能满足需求.
基于这样的需求,就有了树状的层次结构.
DNS 解析流程
在全世界各地,都需要 DNS 来进行解析,所以为了提高 DNS 的解析性能,很多网络都会就近部署 DNS 缓存服务器,那么它是如何解析的呢?
- 1 ,当你想要访问 www.google.com 的时候,你的电脑就会发出一个 DNS 请求,询问 www.google.com 是什么,发给本地域名服务器(本地 DNS ).如果是通过 DHCP 来配置的话,那本地的 DNS 就是由你的网络服务商,比如电信,移动等自动分配.
- 2 ,本地 DNS 收到来自客户端的请求之后,就开始找,看看能不能找到 www.google.com ,如果可以的话,那就直接返回这个网址对应的 IP 地址.但是如果没有呢,那它就往上一级问.但是它的老大不直接进行域名解析,而是给出一个解决方案.
- 3 ,它的老大发现请求是 .com,就说这个网址是由 .com 区域管理的,我帮你介绍一下,你去问问它.
- 4 ,本地 DNS 就转向老大帮忙给介绍的那位朋友,说哥们,你能告诉我 www.google.com 的 IP 地址嘛,但是这个哥们人家负责的是 .com 的所有,你问的是 google.com 的,它这里可能没有,然后就回复说,我这里没有,但是我知道谁负责 google.com 这一块的内容,你问问他可以吧.
- 5 ,接下来,本地 DNS 就转向那位负责 google.com 的负责人,向人家询问,您好,请问 www.google.com 对应的 IP 地址是啥呀?我的小主现在想要访问这个网址.
- 6 ,那位负责人在这里经过查询之后,就告诉本地 DNS , www.google.com 的 IP 地址是什么,此时本地 DNS 拿到 IP 地址之后,返回给客户端,这样客户端就和目标建立了连接.
负载均衡
在上面的介绍中,那是一次 DNS 递归查询过程,因为本地 DNS 会全权为客户端效劳,所以只需要坐着等结果就行了.其实在这个过程中, DNS 除了可以通过名称映射为 IP 地址之外,还可以做另外一件事情,就是负载均衡.
什么意思呢?举个例子哈:我是河南濮阳人,让濮阳人最挂念的就是凉皮了,而凉皮里面最有名的则是「户大姐」这个品牌.现在我想吃户大姐的凉皮,但是我在北京,那我就在北京找一家店就去吃就行了,你在杭州,那你在杭州找家店吃就行.咱们不用非要去濮阳那一家店去吃.这就是负载均衡(我好像暴露了自己吃货的本性…)
投射到 DNS 上来,它也可以做成这样.
DNS 可以做内部的负载均衡:
比如一个应用想要访问数据库,其实我们应该给它配置这个数据的 IP 地址才对,但是如果这个数据库因为某种原因,宕机之后,我该怎么办?需要将所有的用到这台数据库的 IP 地址,都进行更换.
如果使用域名的话,就比较简单了,这台数据库宕机之后,没问题,我只需要在 DNS 服务器中,将域名映射为新的 IP 地址就可以了.
这个过程,极大的降低了人力和时间成本.
DNS 可以做全局负载均衡:
像淘宝, QQ ,微信这种应用,为了保证高可用,肯定会将这些应用部署在多个机房,每个地方都会有自己的 IP 地址.当用户要在淘宝上买东西的时候,那么这个 IP 地址就可以轮询访问多个数据中心.如果在广州的某个数据中心因为某种原因挂掉了,只需要在 DNS 服务器里面,将这个数据中心对应的 IP 地址删除就可以了,接下来就不会再去询问这个数据中心了.
此外,为了让客户体验比较好,访问速度比较快,肯定是希望在北京的用户访问北京的数据中心,在上海的用户,访问上海的数据中心.
这就是全局负载均衡的概念.
最后,总结一下:
- DNS 是网络世界的地址簿,可以通过域名查地址,因为域名服务器是按照树状结构来组织的,所以域名查找使用的是递归方法,并且通过缓存的方式来增强性能;
- 在域名和 IP 的映射过程中,可以给应用做简单的负载均衡,也可以根据地址来做全局的负载均衡.
以上,感觉您的阅读~